From 7ed4f68c68cb17b02deced203f9a461605a68dfe Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 10 Dec 2020 11:57:20 +0000 Subject: compute: Add missing options for 'server event list' Add pagination parameters, '--limit' and '--offset', and filtering parameters, '--changes-since' and '--changes-before'. Change-Id: Ieca8267c3b204ae2db580502cc8fe72c95eddf09 Signed-off-by: Stephen Finucane --- openstackclient/compute/v2/server_event.py | 178 ++++++++++++++++++++++------- 1 file changed, 135 insertions(+), 43 deletions(-) (limited to 'openstackclient/compute') diff --git a/openstackclient/compute/v2/server_event.py b/openstackclient/compute/v2/server_event.py index 4fcc9136..1b971e51 100644 --- a/openstackclient/compute/v2/server_event.py +++ b/openstackclient/compute/v2/server_event.py @@ -17,7 +17,10 @@ import logging +import iso8601 +from novaclient import api_versions from osc_lib.command import command +from osc_lib import exceptions from osc_lib import utils from openstackclient.i18n import _ @@ -27,10 +30,11 @@ LOG = logging.getLogger(__name__) class ListServerEvent(command.Lister): - _description = _( - "List recent events of a server. " - "Specify ``--os-compute-api-version 2.21`` " - "or higher to show events for a deleted server.") + """List recent events of a server. + + Specify ``--os-compute-api-version 2.21`` or higher to show events for a + deleted server. + """ def get_parser(self, prog_name): parser = super(ListServerEvent, self).get_parser(prog_name) @@ -45,60 +49,144 @@ class ListServerEvent(command.Lister): default=False, help=_("List additional fields in output") ) + parser.add_argument( + '--changes-since', + dest='changes_since', + metavar='', + help=_( + "List only server events changed later or equal to a certain " + "point of time. The provided time should be an ISO 8061 " + "formatted time, e.g. ``2016-03-04T06:27:59Z``. " + "(supported with --os-compute-api-version 2.58 or above)" + ), + ) + parser.add_argument( + '--changes-before', + dest='changes_before', + metavar='', + help=_( + "List only server events changed earlier or equal to a " + "certain point of time. The provided time should be an ISO " + "8061 formatted time, e.g. ``2016-03-04T06:27:59Z``. " + "(supported with --os-compute-api-version 2.66 or above)" + ), + ) + parser.add_argument( + '--marker', + help=_( + 'The last server event ID of the previous page ' + '(supported by --os-compute-api-version 2.58 or above)' + ), + ) + parser.add_argument( + '--limit', + type=int, + help=_( + 'Maximum number of server events to display ' + '(supported by --os-compute-api-version 2.58 or above)' + ), + ) return parser def take_action(self, parsed_args): compute_client = self.app.client_manager.compute - server_id = utils.find_resource(compute_client.servers, - parsed_args.server).id - data = compute_client.instance_action.list(server_id) + + kwargs = {} + + if parsed_args.marker: + if compute_client.api_version < api_versions.APIVersion('2.58'): + msg = _( + '--os-compute-api-version 2.58 or greater is required to ' + 'support the --marker option' + ) + raise exceptions.CommandError(msg) + kwargs['marker'] = parsed_args.marker + + if parsed_args.limit: + if compute_client.api_version < api_versions.APIVersion('2.58'): + msg = _( + '--os-compute-api-version 2.58 or greater is required to ' + 'support the --limit option' + ) + raise exceptions.CommandError(msg) + kwargs['limit'] = parsed_args.limit + + if parsed_args.changes_since: + if compute_client.api_version < api_versions.APIVersion('2.58'): + msg = _( + '--os-compute-api-version 2.58 or greater is required to ' + 'support the --changes-since option' + ) + raise exceptions.CommandError(msg) + + try: + iso8601.parse_date(parsed_args.changes_since) + except (TypeError, iso8601.ParseError): + msg = _('Invalid changes-since value: %s') + raise exceptions.CommandError(msg % parsed_args.changes_since) + + kwargs['changes_since'] = parsed_args.changes_since + + if parsed_args.changes_before: + if compute_client.api_version < api_versions.APIVersion('2.66'): + msg = _( + '--os-compute-api-version 2.66 or greater is required to ' + 'support the --changes-before option' + ) + raise exceptions.CommandError(msg) + + try: + iso8601.parse_date(parsed_args.changes_before) + except (TypeError, iso8601.ParseError): + msg = _('Invalid changes-before value: %s') + raise exceptions.CommandError(msg % parsed_args.changes_before) + + kwargs['changes_before'] = parsed_args.changes_before + + server_id = utils.find_resource( + compute_client.servers, parsed_args.server, + ).id + + data = compute_client.instance_action.list(server_id, **kwargs) + + columns = ( + 'request_id', + 'instance_uuid', + 'action', + 'start_time', + ) + column_headers = ( + 'Request ID', + 'Server ID', + 'Action', + 'Start Time', + ) if parsed_args.long: - columns = ( - 'request_id', - 'instance_uuid', - 'action', - 'start_time', + columns += ( 'message', 'project_id', 'user_id', ) - column_headers = ( - 'Request ID', - 'Server ID', - 'Action', - 'Start Time', + column_headers += ( 'Message', 'Project ID', 'User ID', ) - else: - columns = ( - 'request_id', - 'instance_uuid', - 'action', - 'start_time', - ) - column_headers = ( - 'Request ID', - 'Server ID', - 'Action', - 'Start Time', - ) - return (column_headers, - (utils.get_item_properties( - s, columns, - ) for s in data)) + return ( + column_headers, + (utils.get_item_properties(s, columns) for s in data), + ) class ShowServerEvent(command.ShowOne): - _description = _( - "Show server event details. " - "Specify ``--os-compute-api-version 2.21`` " - "or higher to show event details for a deleted server. " - "Specify ``--os-compute-api-version 2.51`` " - "or higher to show event details for non-admin users.") + """Show server event details. + + Specify ``--os-compute-api-version 2.21`` or higher to show event details + for a deleted server. Specify ``--os-compute-api-version 2.51`` or higher + to show event details for non-admin users. + """ def get_parser(self, prog_name): parser = super(ShowServerEvent, self).get_parser(prog_name) @@ -116,9 +204,13 @@ class ShowServerEvent(command.ShowOne): def take_action(self, parsed_args): compute_client = self.app.client_manager.compute - server_id = utils.find_resource(compute_client.servers, - parsed_args.server).id + + server_id = utils.find_resource( + compute_client.servers, parsed_args.server, + ).id + action_detail = compute_client.instance_action.get( - server_id, parsed_args.request_id) + server_id, parsed_args.request_id + ) return zip(*sorted(action_detail.to_dict().items())) -- cgit v1.2.1