Skip to content

Commit 8c975ba

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Fix 'server event list|show' for deleted servers"
2 parents be1de89 + 72a2477 commit 8c975ba

2 files changed

Lines changed: 64 additions & 9 deletions

File tree

openstackclient/compute/v2/server_event.py

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import iso8601
2121
from novaclient import api_versions
22+
import openstack.cloud._utils
2223
from osc_lib.command import command
2324
from osc_lib import exceptions
2425
from osc_lib import utils
@@ -33,7 +34,7 @@ class ListServerEvent(command.Lister):
3334
"""List recent events of a server.
3435
3536
Specify ``--os-compute-api-version 2.21`` or higher to show events for a
36-
deleted server.
37+
deleted server, specified by ID only.
3738
"""
3839

3940
def get_parser(self, prog_name):
@@ -143,9 +144,18 @@ def take_action(self, parsed_args):
143144

144145
kwargs['changes_before'] = parsed_args.changes_before
145146

146-
server_id = utils.find_resource(
147-
compute_client.servers, parsed_args.server,
148-
).id
147+
try:
148+
server_id = utils.find_resource(
149+
compute_client.servers, parsed_args.server,
150+
).id
151+
except exceptions.CommandError:
152+
# If we fail to find the resource, it is possible the server is
153+
# deleted. Try once more using the <server> arg directly if it is a
154+
# UUID.
155+
if openstack.cloud._utils._is_uuid_like(parsed_args.server):
156+
server_id = parsed_args.server
157+
else:
158+
raise
149159

150160
data = compute_client.instance_action.list(server_id, **kwargs)
151161

@@ -184,8 +194,9 @@ class ShowServerEvent(command.ShowOne):
184194
"""Show server event details.
185195
186196
Specify ``--os-compute-api-version 2.21`` or higher to show event details
187-
for a deleted server. Specify ``--os-compute-api-version 2.51`` or higher
188-
to show event details for non-admin users.
197+
for a deleted server, specified by ID only. Specify
198+
``--os-compute-api-version 2.51`` or higher to show event details for
199+
non-admin users.
189200
"""
190201

191202
def get_parser(self, prog_name):
@@ -205,9 +216,18 @@ def get_parser(self, prog_name):
205216
def take_action(self, parsed_args):
206217
compute_client = self.app.client_manager.compute
207218

208-
server_id = utils.find_resource(
209-
compute_client.servers, parsed_args.server,
210-
).id
219+
try:
220+
server_id = utils.find_resource(
221+
compute_client.servers, parsed_args.server,
222+
).id
223+
except exceptions.CommandError:
224+
# If we fail to find the resource, it is possible the server is
225+
# deleted. Try once more using the <server> arg directly if it is a
226+
# UUID.
227+
if openstack.cloud._utils._is_uuid_like(parsed_args.server):
228+
server_id = parsed_args.server
229+
else:
230+
raise
211231

212232
action_detail = compute_client.instance_action.get(
213233
server_id, parsed_args.request_id

openstackclient/tests/functional/compute/v2/test_server_event.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,38 @@ def test_server_event_list_and_show(self):
8282
self.assertEqual('reboot', cmd_output.get('action'))
8383
self.assertIsNotNone(cmd_output.get('events'))
8484
self.assertIsInstance(cmd_output.get('events'), list)
85+
86+
def test_server_event_list_and_show_deleted_server(self):
87+
# Need to create a new server that will not attempt cleanup because we
88+
# are going to delete it during the test and cleanup would fail with
89+
# 404.
90+
cmd_output = self.server_create(cleanup=False)
91+
server_id = cmd_output['id']
92+
# Delete the server
93+
self.openstack('server delete --wait ' + server_id)
94+
# And verify we can get the event list after it's deleted
95+
# Test 'server event list' for deleting
96+
cmd_output = json.loads(self.openstack(
97+
'--os-compute-api-version 2.21 '
98+
'server event list -f json ' + server_id
99+
))
100+
request_id = None
101+
for each_event in cmd_output:
102+
self.assertNotIn('Message', each_event)
103+
self.assertNotIn('Project ID', each_event)
104+
self.assertNotIn('User ID', each_event)
105+
if each_event.get('Action') == 'delete':
106+
self.assertEqual(server_id, each_event.get('Server ID'))
107+
request_id = each_event.get('Request ID')
108+
break
109+
self.assertIsNotNone(request_id)
110+
# Test 'server event show' for deleting
111+
cmd_output = json.loads(self.openstack(
112+
'--os-compute-api-version 2.21 '
113+
'server event show -f json ' + server_id + ' ' + request_id
114+
))
115+
self.assertEqual(server_id, cmd_output.get('instance_uuid'))
116+
self.assertEqual(request_id, cmd_output.get('request_id'))
117+
self.assertEqual('delete', cmd_output.get('action'))
118+
self.assertIsNotNone(cmd_output.get('events'))
119+
self.assertIsInstance(cmd_output.get('events'), list)

0 commit comments

Comments
 (0)