Bug Fix: Skip invalid server ID during multi-server delete

Change-Id: I8e5339f07b43dd0a9422eaf33346bbfdf2c9b328
Signed-off-by: Dan Lawton <dlawton@redhat.com>
Closes-Bug: #2122056
This commit is contained in:
dlawton
2025-09-03 16:43:04 +01:00
parent 94e447af80
commit 3dfeb5ed08
2 changed files with 81 additions and 7 deletions

View File

@@ -2218,24 +2218,49 @@ class DeleteServer(command.Command):
self.app.stdout.flush()
compute_client = self.app.client_manager.compute
deleted_servers = []
for server in parsed_args.server:
server_obj = compute_client.find_server(
server,
ignore_missing=False,
all_projects=parsed_args.all_projects,
)
try:
server_obj = compute_client.find_server(
server,
ignore_missing=False,
all_projects=parsed_args.all_projects,
)
compute_client.delete_server(server_obj, force=parsed_args.force)
compute_client.delete_server(
server_obj, force=parsed_args.force
)
deleted_servers.append(server_obj)
except Exception as e:
LOG.error(
_(
"Failed to delete server with "
"name or ID '%(server)s': %(e)s"
),
{'server': server, 'e': e},
)
if parsed_args.wait:
if parsed_args.wait:
for server_obj in deleted_servers:
try:
compute_client.wait_for_delete(
server_obj, callback=_show_progress
)
except sdk_exceptions.ResourceTimeout:
msg = _('Error deleting server: %s') % server_obj.id
deleted_servers.remove(server_obj)
raise exceptions.CommandError(msg)
fails = len(parsed_args.server) - len(deleted_servers)
if fails > 0:
total = len(parsed_args.server)
msg = _("%(fails)s of %(total)s servers failed to delete.") % {
'fails': fails,
'total': total,
}
raise exceptions.CommandError(msg)
class PercentAction(argparse.Action):
def __init__(

View File

@@ -4449,6 +4449,55 @@ class TestServerDelete(compute_fakes.TestComputev2):
)
self.assertIsNone(result)
def test_server_delete_multi_servers_with_exceptions(self):
servers = compute_fakes.create_servers(count=2)
self.compute_client.find_server.side_effect = [
servers[0],
sdk_exceptions.ResourceNotFound(),
servers[1],
]
arglist = [servers[0].id, 'unexist_server', servers[1].id]
verifylist = [
('force', False),
('all_projects', False),
('wait', False),
(
'server',
[servers[0].id, 'unexist_server', servers[1].id],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
exc = self.assertRaises(
exceptions.CommandError,
self.cmd.take_action,
parsed_args,
)
self.assertEqual('1 of 3 servers failed to delete.', str(exc))
self.compute_client.find_server.assert_has_calls(
[
mock.call(
servers[0].id, ignore_missing=False, all_projects=False
),
mock.call(
'unexist_server', ignore_missing=False, all_projects=False
),
mock.call(
servers[1].id, ignore_missing=False, all_projects=False
),
]
)
self.compute_client.delete_server.assert_has_calls(
[
mock.call(servers[0], force=False),
mock.call(servers[1], force=False),
]
)
def test_server_delete_with_all_projects(self):
arglist = [
self.server.id,