evacuate: respect original SHUTOFF state in --wait completion
When running `openstack server evacuate --wait`, the command would hang indefinitely if the instance was originally in SHUTOFF state, because only “ACTIVE” was treated as a successful completion. We now capture the server’s status before evacuation and dynamically include “SHUTOFF” in the `success_status` list if the instance was already shut off. This ensures that a shutoff instance is accepted as a valid completion without requiring manual intervention. Unit tests have been added and updated to cover both: - pre-evacuation ACTIVE → success_status=['active'] - pre-evacuation SHUTOFF → success_status=['active','shutoff'] Closes-Bug: #2103426 Change-Id: I86ad1cd173a144b16fde1dbac87819fab2d7a50a
This commit is contained in:
@@ -3879,9 +3879,15 @@ host."""
|
|||||||
compute_client.evacuate_server(server, **kwargs)
|
compute_client.evacuate_server(server, **kwargs)
|
||||||
|
|
||||||
if parsed_args.wait:
|
if parsed_args.wait:
|
||||||
|
orig_status = server.status
|
||||||
|
success = ['ACTIVE']
|
||||||
|
if orig_status == 'SHUTOFF':
|
||||||
|
success.append('SHUTOFF')
|
||||||
|
|
||||||
if utils.wait_for_status(
|
if utils.wait_for_status(
|
||||||
compute_client.get_server,
|
compute_client.get_server,
|
||||||
server.id,
|
server.id,
|
||||||
|
success_status=success,
|
||||||
callback=_show_progress,
|
callback=_show_progress,
|
||||||
):
|
):
|
||||||
self.app.stdout.write(_('Complete\n'))
|
self.app.stdout.write(_('Complete\n'))
|
||||||
|
@@ -7000,6 +7000,7 @@ class TestServerEvacuate(TestServer):
|
|||||||
'image': self.image,
|
'image': self.image,
|
||||||
'networks': {},
|
'networks': {},
|
||||||
'adminPass': 'passw0rd',
|
'adminPass': 'passw0rd',
|
||||||
|
'status': 'ACTIVE',
|
||||||
}
|
}
|
||||||
self.server = compute_fakes.create_one_server(attrs=attrs)
|
self.server = compute_fakes.create_one_server(attrs=attrs)
|
||||||
attrs['id'] = self.server.id
|
attrs['id'] = self.server.id
|
||||||
@@ -7137,6 +7138,33 @@ class TestServerEvacuate(TestServer):
|
|||||||
mock_wait_for_status.assert_called_once_with(
|
mock_wait_for_status.assert_called_once_with(
|
||||||
self.compute_client.get_server,
|
self.compute_client.get_server,
|
||||||
self.server.id,
|
self.server.id,
|
||||||
|
success_status=['ACTIVE'],
|
||||||
|
callback=mock.ANY,
|
||||||
|
)
|
||||||
|
|
||||||
|
@mock.patch.object(common_utils, 'wait_for_status', return_value=True)
|
||||||
|
def test_evacuate_with_wait_ok_shutoff(self, mock_wait_for_status):
|
||||||
|
self.server.status = 'SHUTOFF'
|
||||||
|
self.compute_client.get_server.return_value = self.server
|
||||||
|
|
||||||
|
args = [
|
||||||
|
self.server.id,
|
||||||
|
'--wait',
|
||||||
|
]
|
||||||
|
verify_args = [
|
||||||
|
('server', self.server.id),
|
||||||
|
('wait', True),
|
||||||
|
]
|
||||||
|
evac_args = {
|
||||||
|
'host': None,
|
||||||
|
'on_shared_storage': False,
|
||||||
|
'admin_pass': None,
|
||||||
|
}
|
||||||
|
self._test_evacuate(args, verify_args, evac_args)
|
||||||
|
mock_wait_for_status.assert_called_once_with(
|
||||||
|
self.compute_client.get_server,
|
||||||
|
self.server.id,
|
||||||
|
success_status=['ACTIVE', 'SHUTOFF'],
|
||||||
callback=mock.ANY,
|
callback=mock.ANY,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user