diff options
| author | Zuul <zuul@review.opendev.org> | 2022-03-09 13:44:47 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2022-03-09 13:44:47 +0000 |
| commit | 8c975ba09790f9fe57c32293fb4320bf5c56e012 (patch) | |
| tree | 4274e7d95379e433ae78e40fc1836b695114c9ef /openstackclient | |
| parent | be1de891ac12f7425a54a211535ab9f960561aca (diff) | |
| parent | 72a2477ec07851f13dbc05e6777f7f60573d75dd (diff) | |
| download | python-openstackclient-8c975ba09790f9fe57c32293fb4320bf5c56e012.tar.gz | |
Merge "Fix 'server event list|show' for deleted servers"
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/server_event.py | 38 | ||||
| -rw-r--r-- | openstackclient/tests/functional/compute/v2/test_server_event.py | 35 |
2 files changed, 64 insertions, 9 deletions
diff --git a/openstackclient/compute/v2/server_event.py b/openstackclient/compute/v2/server_event.py index 1b971e51..7ab0cd2f 100644 --- a/openstackclient/compute/v2/server_event.py +++ b/openstackclient/compute/v2/server_event.py @@ -19,6 +19,7 @@ import logging import iso8601 from novaclient import api_versions +import openstack.cloud._utils from osc_lib.command import command from osc_lib import exceptions from osc_lib import utils @@ -33,7 +34,7 @@ class ListServerEvent(command.Lister): """List recent events of a server. Specify ``--os-compute-api-version 2.21`` or higher to show events for a - deleted server. + deleted server, specified by ID only. """ def get_parser(self, prog_name): @@ -143,9 +144,18 @@ class ListServerEvent(command.Lister): kwargs['changes_before'] = parsed_args.changes_before - server_id = utils.find_resource( - compute_client.servers, parsed_args.server, - ).id + try: + server_id = utils.find_resource( + compute_client.servers, parsed_args.server, + ).id + except exceptions.CommandError: + # If we fail to find the resource, it is possible the server is + # deleted. Try once more using the <server> arg directly if it is a + # UUID. + if openstack.cloud._utils._is_uuid_like(parsed_args.server): + server_id = parsed_args.server + else: + raise data = compute_client.instance_action.list(server_id, **kwargs) @@ -184,8 +194,9 @@ class ShowServerEvent(command.ShowOne): """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. + for a deleted server, specified by ID only. Specify + ``--os-compute-api-version 2.51`` or higher to show event details for + non-admin users. """ def get_parser(self, prog_name): @@ -205,9 +216,18 @@ 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 + try: + server_id = utils.find_resource( + compute_client.servers, parsed_args.server, + ).id + except exceptions.CommandError: + # If we fail to find the resource, it is possible the server is + # deleted. Try once more using the <server> arg directly if it is a + # UUID. + if openstack.cloud._utils._is_uuid_like(parsed_args.server): + server_id = parsed_args.server + else: + raise action_detail = compute_client.instance_action.get( server_id, parsed_args.request_id diff --git a/openstackclient/tests/functional/compute/v2/test_server_event.py b/openstackclient/tests/functional/compute/v2/test_server_event.py index 953ade43..b4725fe6 100644 --- a/openstackclient/tests/functional/compute/v2/test_server_event.py +++ b/openstackclient/tests/functional/compute/v2/test_server_event.py @@ -82,3 +82,38 @@ class ServerEventTests(common.ComputeTestCase): self.assertEqual('reboot', cmd_output.get('action')) self.assertIsNotNone(cmd_output.get('events')) self.assertIsInstance(cmd_output.get('events'), list) + + def test_server_event_list_and_show_deleted_server(self): + # Need to create a new server that will not attempt cleanup because we + # are going to delete it during the test and cleanup would fail with + # 404. + cmd_output = self.server_create(cleanup=False) + server_id = cmd_output['id'] + # Delete the server + self.openstack('server delete --wait ' + server_id) + # And verify we can get the event list after it's deleted + # Test 'server event list' for deleting + cmd_output = json.loads(self.openstack( + '--os-compute-api-version 2.21 ' + 'server event list -f json ' + server_id + )) + request_id = None + for each_event in cmd_output: + self.assertNotIn('Message', each_event) + self.assertNotIn('Project ID', each_event) + self.assertNotIn('User ID', each_event) + if each_event.get('Action') == 'delete': + self.assertEqual(server_id, each_event.get('Server ID')) + request_id = each_event.get('Request ID') + break + self.assertIsNotNone(request_id) + # Test 'server event show' for deleting + cmd_output = json.loads(self.openstack( + '--os-compute-api-version 2.21 ' + 'server event show -f json ' + server_id + ' ' + request_id + )) + self.assertEqual(server_id, cmd_output.get('instance_uuid')) + self.assertEqual(request_id, cmd_output.get('request_id')) + self.assertEqual('delete', cmd_output.get('action')) + self.assertIsNotNone(cmd_output.get('events')) + self.assertIsInstance(cmd_output.get('events'), list) |
