2a26ef2cf1
When we start a workflow in the client, we need to create the websocket connection beforehand. If the workflow is very quick (like create_overcloudrc), it could be finished before we subscribe to the Zaqar queue properly, and thus we wouldn't get the message. Change-Id: I56c5f3a094094f7ba2158d8a434122ccb496f6b4 Closes-Bug: #1794418
142 lines
4.8 KiB
Python
142 lines
4.8 KiB
Python
# Copyright 2017 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
import os
|
|
|
|
from osc_lib.i18n import _
|
|
|
|
from tripleoclient.exceptions import ContainerDeleteFailed
|
|
from tripleoclient.exceptions import DownloadError
|
|
from tripleoclient.exceptions import LogFetchError
|
|
from tripleoclient.workflows import base
|
|
|
|
|
|
def check_local_space(path, object_list):
|
|
required_space = sum([x['bytes'] for x in object_list])
|
|
stats = os.statvfs(path)
|
|
free_space = stats.f_bavail * stats.f_frsize
|
|
return free_space >= required_space
|
|
|
|
|
|
def download_files(clients, container_name, destination):
|
|
"""Downloads log files from a container action
|
|
|
|
:param clients: openstack clients
|
|
:param container: name of the container to put the logs
|
|
:param destination: folder to download files to
|
|
"""
|
|
oc = clients.object_store
|
|
object_list = oc.object_list(container=container_name, all_data=True)
|
|
|
|
# handle relative destination path
|
|
if not os.path.dirname(destination):
|
|
destination = os.path.join(os.sep, os.getcwd(), destination)
|
|
|
|
if not os.path.exists(destination):
|
|
print('Creating destination path: {}'.format(destination))
|
|
os.makedirs(destination)
|
|
|
|
if not check_local_space(destination, object_list):
|
|
raise DownloadError(_('Not enough local space to download files.'))
|
|
|
|
for data in object_list:
|
|
print('Downloading file: {}'.format(data['name']))
|
|
file_path = os.path.join(os.sep, destination, data['name'])
|
|
oc.object_save(container=container_name,
|
|
object=data['name'],
|
|
file=file_path)
|
|
|
|
|
|
def fetch_logs(clients, container, server_name, timeout=None,
|
|
concurrency=None):
|
|
"""Executes fetch log action
|
|
|
|
:param clients: openstack clients
|
|
:param container: name of the container to put the logs
|
|
:param server_name: server name to restrict where logs are pulled from
|
|
:param timeout: timeout for the log fetch operation
|
|
:param concurrency: max number of concurrent log collection tasks
|
|
"""
|
|
|
|
workflow_input = {
|
|
"container": container,
|
|
"server_name": server_name,
|
|
}
|
|
|
|
if timeout is not None:
|
|
workflow_input['timeout'] = timeout
|
|
if concurrency is not None:
|
|
workflow_input['concurrency'] = concurrency
|
|
|
|
workflow_client = clients.workflow_engine
|
|
tripleoclients = clients.tripleoclient
|
|
|
|
with tripleoclients.messaging_websocket() as ws:
|
|
execution = base.start_workflow(
|
|
workflow_client,
|
|
'tripleo.support.v1.fetch_logs',
|
|
workflow_input=workflow_input
|
|
)
|
|
|
|
messages = base.wait_for_messages(workflow_client,
|
|
ws,
|
|
execution,
|
|
timeout)
|
|
|
|
for message in messages:
|
|
if message['status'] != 'SUCCESS':
|
|
raise LogFetchError(message['message'])
|
|
if message['message']:
|
|
print('{}'.format(message['message']))
|
|
|
|
|
|
def delete_container(clients, container, timeout=None, concurrency=None):
|
|
"""Deletes container from swift
|
|
|
|
:param clients: openstack clients
|
|
:param container: name of the container where the logs were stored
|
|
:param timeout: timeout for the delete operations
|
|
:param concurrency: max number of object deletion tasks to run at one time
|
|
"""
|
|
workflow_input = {
|
|
"container": container,
|
|
}
|
|
|
|
if timeout is not None:
|
|
workflow_input['timeout'] = timeout
|
|
if concurrency is not None:
|
|
workflow_input['concurrency'] = concurrency
|
|
|
|
workflow_client = clients.workflow_engine
|
|
tripleoclients = clients.tripleoclient
|
|
|
|
with tripleoclients.messaging_websocket() as ws:
|
|
execution = base.start_workflow(
|
|
workflow_client,
|
|
'tripleo.support.v1.delete_container',
|
|
workflow_input=workflow_input
|
|
)
|
|
|
|
messages = base.wait_for_messages(workflow_client,
|
|
ws,
|
|
execution,
|
|
timeout)
|
|
|
|
for message in messages:
|
|
if message['status'] != 'SUCCESS':
|
|
raise ContainerDeleteFailed(message['message'])
|
|
if message['message']:
|
|
print('{}'.format(message['message']))
|