Merge "Fix rebuild of baremetal instance when vm_state is ERROR"

This commit is contained in:
Zuul 2019-09-07 23:08:18 +00:00 committed by Gerrit Code Review
commit ba3147420c
2 changed files with 23 additions and 3 deletions

View File

@ -240,6 +240,23 @@ class IronicDriverTestCase(test.NoDBTestCase):
fake_validate.assert_called_once_with(instance)
fake_refresh.assert_called_once_with()
@mock.patch.object(objects.Instance, 'refresh')
@mock.patch.object(ironic_driver.IronicDriver,
'_validate_instance_and_node')
def test__wait_for_active_from_error(self, fake_validate, fake_refresh):
instance = fake_instance.fake_instance_obj(self.ctx,
uuid=uuidutils.generate_uuid(),
vm_state=vm_states.ERROR,
task_state=task_states.REBUILD_SPAWNING)
node = ironic_utils.get_test_node(
provision_state=ironic_states.ACTIVE)
fake_validate.return_value = node
self.assertRaises(loopingcall.LoopingCallDone,
self.driver._wait_for_active, instance)
fake_validate.assert_called_once_with(instance)
fake_refresh.assert_called_once_with()
@mock.patch.object(objects.Instance, 'refresh')
@mock.patch.object(ironic_driver.IronicDriver,
'_validate_instance_and_node')
@ -275,7 +292,8 @@ class IronicDriverTestCase(test.NoDBTestCase):
self._wait_for_active_abort({'vm_state': vm_states.DELETED})
def test__wait_for_active_abort_error(self):
self._wait_for_active_abort({'vm_state': vm_states.ERROR})
self._wait_for_active_abort({'task_state': task_states.SPAWNING,
'vm_state': vm_states.ERROR})
@mock.patch.object(ironic_driver.IronicDriver,
'_validate_instance_and_node')

View File

@ -525,8 +525,10 @@ class IronicDriver(virt_driver.ComputeDriver):
def _wait_for_active(self, instance):
"""Wait for the node to be marked as ACTIVE in Ironic."""
instance.refresh()
if (instance.task_state == task_states.DELETING or
instance.vm_state in (vm_states.ERROR, vm_states.DELETED)):
# Ignore REBUILD_SPAWNING when rebuilding from ERROR state.
if (instance.task_state != task_states.REBUILD_SPAWNING and
(instance.task_state == task_states.DELETING or
instance.vm_state in (vm_states.ERROR, vm_states.DELETED))):
raise exception.InstanceDeployFailure(
_("Instance %s provisioning was aborted") % instance.uuid)