Skip to content

Commit 885f591

Browse files
committed
compute: Address bug in shelve offload logic
We were reusing a variable from a previous loop, which meant this would never work with multiple servers. Correct the mistake. Change-Id: I52246e183fb2cf0d855d92058dd305b48783589d Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
1 parent 1678f87 commit 885f591

2 files changed

Lines changed: 25 additions & 21 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4416,6 +4416,7 @@ def _show_progress(progress):
44164416
self.app.stdout.flush()
44174417

44184418
compute_client = self.app.client_manager.sdk_connection.compute
4419+
server_ids = []
44194420

44204421
for server in parsed_args.servers:
44214422
server_obj = compute_client.find_server(
@@ -4425,61 +4426,60 @@ def _show_progress(progress):
44254426
if server_obj.status.lower() in ('shelved', 'shelved_offloaded'):
44264427
continue
44274428

4429+
server_ids.append(server_obj.id)
4430+
44284431
compute_client.shelve_server(server_obj.id)
44294432

44304433
# if we don't have to wait, either because it was requested explicitly
44314434
# or is required implicitly, then our job is done
44324435
if not parsed_args.wait and not parsed_args.offload:
44334436
return
44344437

4435-
for server in parsed_args.servers:
4438+
for server_id in server_ids:
44364439
# We use osc-lib's wait_for_status since that allows for a callback
44374440
# TODO(stephenfin): We should wait for these in parallel using e.g.
44384441
# https://review.opendev.org/c/openstack/osc-lib/+/762503/
44394442
if not utils.wait_for_status(
44404443
compute_client.get_server,
4441-
server_obj.id,
4444+
server_id,
44424445
success_status=('shelved', 'shelved_offloaded'),
44434446
callback=_show_progress,
44444447
):
4445-
LOG.error(_('Error shelving server: %s'), server_obj.id)
4448+
LOG.error(_('Error shelving server: %s'), server_id)
44464449
self.app.stdout.write(
4447-
_('Error shelving server: %s\n') % server_obj.id
4450+
_('Error shelving server: %s\n') % server_id
44484451
)
44494452
raise SystemExit
44504453

44514454
if not parsed_args.offload:
44524455
return
44534456

4454-
for server in parsed_args.servers:
4455-
server_obj = compute_client.find_server(
4456-
server,
4457-
ignore_missing=False,
4458-
)
4457+
for server_id in server_ids:
4458+
server_obj = compute_client.get_server(server_id)
44594459
if server_obj.status.lower() == 'shelved_offloaded':
44604460
continue
44614461

4462-
compute_client.shelve_offload_server(server_obj.id)
4462+
compute_client.shelve_offload_server(server_id)
44634463

44644464
if not parsed_args.wait:
44654465
return
44664466

4467-
for server in parsed_args.servers:
4467+
for server_id in server_ids:
44684468
# We use osc-lib's wait_for_status since that allows for a callback
44694469
# TODO(stephenfin): We should wait for these in parallel using e.g.
44704470
# https://review.opendev.org/c/openstack/osc-lib/+/762503/
44714471
if not utils.wait_for_status(
44724472
compute_client.get_server,
4473-
server_obj.id,
4473+
server_id,
44744474
success_status=('shelved_offloaded',),
44754475
callback=_show_progress,
44764476
):
44774477
LOG.error(
44784478
_('Error offloading shelved server %s'),
4479-
server_obj.id,
4479+
server_id,
44804480
)
44814481
self.app.stdout.write(
4482-
_('Error offloading shelved server: %s\n') % server_obj.id
4482+
_('Error offloading shelved server: %s\n') % server_id
44834483
)
44844484
raise SystemExit
44854485

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8149,20 +8149,24 @@ def test_shelve_offload(self, mock_wait_for_status):
81498149
result = self.cmd.take_action(parsed_args)
81508150
self.assertIsNone(result)
81518151

8152-
# two calls - one to retrieve the server state before shelving and
8153-
# another to do this before offloading
8154-
self.compute_sdk_client.find_server.assert_has_calls(
8155-
[
8156-
mock.call(self.server.name, ignore_missing=False),
8157-
mock.call(self.server.name, ignore_missing=False),
8158-
]
8152+
# one call to retrieve to retrieve the server state before shelving
8153+
self.compute_sdk_client.find_server.assert_called_once_with(
8154+
self.server.name,
8155+
ignore_missing=False,
8156+
)
8157+
# one call to retrieve the server state before offloading
8158+
self.compute_sdk_client.get_server.assert_called_once_with(
8159+
self.server.id
81598160
)
8161+
# one call to shelve the server
81608162
self.compute_sdk_client.shelve_server.assert_called_with(
81618163
self.server.id
81628164
)
8165+
# one call to shelve offload the server
81638166
self.compute_sdk_client.shelve_offload_server.assert_called_once_with(
81648167
self.server.id,
81658168
)
8169+
# one call to wait for the shelve offload to complete
81668170
mock_wait_for_status.assert_called_once_with(
81678171
self.compute_sdk_client.get_server,
81688172
self.server.id,

0 commit comments

Comments
 (0)