Skip to content

Commit 3dfeb5e

Browse files
committed
Bug Fix: Skip invalid server ID during multi-server delete
Change-Id: I8e5339f07b43dd0a9422eaf33346bbfdf2c9b328 Signed-off-by: Dan Lawton <dlawton@redhat.com> Closes-Bug: #2122056
1 parent 94e447a commit 3dfeb5e

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
@@ -2218,24 +2218,49 @@ def _show_progress(progress):
22182218
self.app.stdout.flush()
22192219

22202220
compute_client = self.app.client_manager.compute
2221+
2222+
deleted_servers = []
22212223
for server in parsed_args.server:
2222-
server_obj = compute_client.find_server(
2223-
server,
2224-
ignore_missing=False,
2225-
all_projects=parsed_args.all_projects,
2226-
)
2224+
try:
2225+
server_obj = compute_client.find_server(
2226+
server,
2227+
ignore_missing=False,
2228+
all_projects=parsed_args.all_projects,
2229+
)
22272230

2228-
compute_client.delete_server(server_obj, force=parsed_args.force)
2231+
compute_client.delete_server(
2232+
server_obj, force=parsed_args.force
2233+
)
2234+
deleted_servers.append(server_obj)
2235+
except Exception as e:
2236+
LOG.error(
2237+
_(
2238+
"Failed to delete server with "
2239+
"name or ID '%(server)s': %(e)s"
2240+
),
2241+
{'server': server, 'e': e},
2242+
)
22292243

2230-
if parsed_args.wait:
2244+
if parsed_args.wait:
2245+
for server_obj in deleted_servers:
22312246
try:
22322247
compute_client.wait_for_delete(
22332248
server_obj, callback=_show_progress
22342249
)
22352250
except sdk_exceptions.ResourceTimeout:
22362251
msg = _('Error deleting server: %s') % server_obj.id
2252+
deleted_servers.remove(server_obj)
22372253
raise exceptions.CommandError(msg)
22382254

2255+
fails = len(parsed_args.server) - len(deleted_servers)
2256+
if fails > 0:
2257+
total = len(parsed_args.server)
2258+
msg = _("%(fails)s of %(total)s servers failed to delete.") % {
2259+
'fails': fails,
2260+
'total': total,
2261+
}
2262+
raise exceptions.CommandError(msg)
2263+
22392264

22402265
class PercentAction(argparse.Action):
22412266
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)