Skip to content

Commit 475d69e

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Bug Fix: Skip invalid server ID during multi-server delete"
2 parents e755460 + 3dfeb5e commit 475d69e

File tree

2 files changed

+81
-7
lines changed

2 files changed

+81
-7
lines changed

openstackclient/compute/v2/server.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2223,24 +2223,49 @@ def _show_progress(progress):
22232223
self.app.stdout.flush()
22242224

22252225
compute_client = self.app.client_manager.compute
2226+
2227+
deleted_servers = []
22262228
for server in parsed_args.server:
2227-
server_obj = compute_client.find_server(
2228-
server,
2229-
ignore_missing=False,
2230-
all_projects=parsed_args.all_projects,
2231-
)
2229+
try:
2230+
server_obj = compute_client.find_server(
2231+
server,
2232+
ignore_missing=False,
2233+
all_projects=parsed_args.all_projects,
2234+
)
22322235

2233-
compute_client.delete_server(server_obj, force=parsed_args.force)
2236+
compute_client.delete_server(
2237+
server_obj, force=parsed_args.force
2238+
)
2239+
deleted_servers.append(server_obj)
2240+
except Exception as e:
2241+
LOG.error(
2242+
_(
2243+
"Failed to delete server with "
2244+
"name or ID '%(server)s': %(e)s"
2245+
),
2246+
{'server': server, 'e': e},
2247+
)
22342248

2235-
if parsed_args.wait:
2249+
if parsed_args.wait:
2250+
for server_obj in deleted_servers:
22362251
try:
22372252
compute_client.wait_for_delete(
22382253
server_obj, callback=_show_progress
22392254
)
22402255
except sdk_exceptions.ResourceTimeout:
22412256
msg = _('Error deleting server: %s') % server_obj.id
2257+
deleted_servers.remove(server_obj)
22422258
raise exceptions.CommandError(msg)
22432259

2260+
fails = len(parsed_args.server) - len(deleted_servers)
2261+
if fails > 0:
2262+
total = len(parsed_args.server)
2263+
msg = _("%(fails)s of %(total)s servers failed to delete.") % {
2264+
'fails': fails,
2265+
'total': total,
2266+
}
2267+
raise exceptions.CommandError(msg)
2268+
22442269

22452270
class PercentAction(argparse.Action):
22462271
def __init__(

openstackclient/tests/unit/compute/v2/test_server.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4449,6 +4449,55 @@ def test_server_delete_multi_servers(self):
44494449
)
44504450
self.assertIsNone(result)
44514451

4452+
def test_server_delete_multi_servers_with_exceptions(self):
4453+
servers = compute_fakes.create_servers(count=2)
4454+
self.compute_client.find_server.side_effect = [
4455+
servers[0],
4456+
sdk_exceptions.ResourceNotFound(),
4457+
servers[1],
4458+
]
4459+
4460+
arglist = [servers[0].id, 'unexist_server', servers[1].id]
4461+
4462+
verifylist = [
4463+
('force', False),
4464+
('all_projects', False),
4465+
('wait', False),
4466+
(
4467+
'server',
4468+
[servers[0].id, 'unexist_server', servers[1].id],
4469+
),
4470+
]
4471+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
4472+
4473+
exc = self.assertRaises(
4474+
exceptions.CommandError,
4475+
self.cmd.take_action,
4476+
parsed_args,
4477+
)
4478+
self.assertEqual('1 of 3 servers failed to delete.', str(exc))
4479+
4480+
self.compute_client.find_server.assert_has_calls(
4481+
[
4482+
mock.call(
4483+
servers[0].id, ignore_missing=False, all_projects=False
4484+
),
4485+
mock.call(
4486+
'unexist_server', ignore_missing=False, all_projects=False
4487+
),
4488+
mock.call(
4489+
servers[1].id, ignore_missing=False, all_projects=False
4490+
),
4491+
]
4492+
)
4493+
4494+
self.compute_client.delete_server.assert_has_calls(
4495+
[
4496+
mock.call(servers[0], force=False),
4497+
mock.call(servers[1], force=False),
4498+
]
4499+
)
4500+
44524501
def test_server_delete_with_all_projects(self):
44534502
arglist = [
44544503
self.server.id,

0 commit comments

Comments
 (0)