53d06b7f52
Change-Id: I1e93305426dd94dbbcc8ca70f446dae4a1fa0434
108 lines
4.9 KiB
Python
108 lines
4.9 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 logging
|
|
|
|
from osc_lib.i18n import _
|
|
|
|
from tripleoclient import command
|
|
from tripleoclient.workflows import support
|
|
|
|
|
|
class ReportExecute(command.Command):
|
|
"""Run sosreport on selected servers."""
|
|
|
|
log = logging.getLogger(__name__ + ".ReportExecute")
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(ReportExecute, self).get_parser(prog_name)
|
|
parser.add_argument('server_name',
|
|
help=_('Nova server_name or partial name to match.'
|
|
' For example "controller" will match all '
|
|
'controllers for an environment.'))
|
|
parser.add_argument('-c', '--container', dest='container',
|
|
default='overcloud_support',
|
|
help=_('Swift Container to store logs to'))
|
|
parser.add_argument('-o', '--output', dest='destination',
|
|
default='support_logs',
|
|
help=_('Output directory for the report'))
|
|
parser.add_argument('--skip-container-delete', dest='skip_delete',
|
|
default=False,
|
|
help=_('Do not delete the container after the '
|
|
'files have been downloaded. Ignored '
|
|
'if --collect-only or --download-only '
|
|
'is provided.'),
|
|
action='store_true')
|
|
parser.add_argument('-t', '--timeout', dest='timeout', type=int,
|
|
default=None,
|
|
help=_('Maximum time to wait for the log '
|
|
'collection and container deletion '
|
|
'workflows to finish.'))
|
|
parser.add_argument('-n', '--concurrency', dest='concurrency',
|
|
type=int, default=None,
|
|
help=_('Number of parallel log collection and '
|
|
'object deletion tasks to run.'))
|
|
group = parser.add_mutually_exclusive_group(required=False)
|
|
group.add_argument('--collect-only', dest='collect_only',
|
|
help=_('Skip log downloads, only collect logs and '
|
|
'put in the container'),
|
|
default=False,
|
|
action='store_true')
|
|
group.add_argument('--download-only', dest='download_only',
|
|
help=_('Skip generation, only download from '
|
|
'the provided container'),
|
|
default=False,
|
|
action='store_true')
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
self.log.debug('take_action({})'.format(parsed_args))
|
|
|
|
clients = self.app.client_manager
|
|
container = parsed_args.container
|
|
server_name = parsed_args.server_name
|
|
destination = parsed_args.destination
|
|
timeout = parsed_args.timeout
|
|
concurrency = parsed_args.concurrency
|
|
|
|
if not server_name:
|
|
raise Exception(_('Please specify the server_name option.'))
|
|
|
|
if not parsed_args.download_only:
|
|
print(_('Starting log collection... (This may take a while)'))
|
|
try:
|
|
support.fetch_logs(clients, container, server_name,
|
|
timeout=timeout, concurrency=concurrency)
|
|
except Exception as err:
|
|
self.log.error('Unable to fetch logs, {}'.format(err))
|
|
raise err
|
|
|
|
if not parsed_args.collect_only:
|
|
try:
|
|
support.download_files(clients, container, destination)
|
|
except Exception as err:
|
|
self.log.error('Unable to download files, {}'.format(err))
|
|
raise err
|
|
|
|
if not parsed_args.collect_only and not parsed_args.download_only and \
|
|
not parsed_args.skip_delete:
|
|
print(_('Deleting container') + ' {}...'.format(container))
|
|
try:
|
|
support.delete_container(clients, container, timeout=timeout,
|
|
concurrency=concurrency)
|
|
except Exception as err:
|
|
self.log.error('Unable to delete container, {}'.format(err))
|
|
raise err
|