Merge "ironic: Clean up resources after unprovision fails"

This commit is contained in:
Zuul
2018-03-08 22:48:37 +00:00
committed by Gerrit Code Review
2 changed files with 34 additions and 9 deletions

View File

@@ -1557,7 +1557,10 @@ class IronicDriverTestCase(test.NoDBTestCase):
@mock.patch.object(FAKE_CLIENT.node, 'set_provision_state')
@mock.patch.object(ironic_driver.IronicDriver,
'_validate_instance_and_node')
def test_destroy_trigger_undeploy_fail(self, fake_validate, mock_sps):
@mock.patch.object(ironic_driver.IronicDriver,
'_cleanup_deploy')
def test_destroy_trigger_undeploy_fail(self, mock_clean, fake_validate,
mock_sps):
node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
node = ironic_utils.get_test_node(driver='fake', uuid=node_uuid,
provision_state=ironic_states.ACTIVE)
@@ -1567,6 +1570,26 @@ class IronicDriverTestCase(test.NoDBTestCase):
mock_sps.side_effect = exception.NovaException()
self.assertRaises(exception.NovaException, self.driver.destroy,
self.ctx, instance, None, None)
mock_clean.assert_called_once_with(node, instance, None)
@mock.patch.object(FAKE_CLIENT.node, 'update')
@mock.patch.object(ironic_driver.IronicDriver,
'_validate_instance_and_node')
@mock.patch.object(ironic_driver.IronicDriver,
'_cleanup_deploy')
def test_destroy_trigger_remove_info_fail(self, mock_clean, fake_validate,
mock_update):
node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee'
node = ironic_utils.get_test_node(
driver='fake', uuid=node_uuid,
provision_state=ironic_states.AVAILABLE)
fake_validate.return_value = node
instance = fake_instance.fake_instance_obj(self.ctx,
node=node_uuid)
mock_update.side_effect = SystemError('unexpected error')
self.assertRaises(SystemError, self.driver.destroy,
self.ctx, instance, None, None)
mock_clean.assert_called_once_with(node, instance, None)
@mock.patch.object(FAKE_CLIENT.node, 'set_provision_state')
@mock.patch.object(ironic_driver.IronicDriver,

View File

@@ -1185,15 +1185,17 @@ class IronicDriver(virt_driver.ComputeDriver):
# without raising any exceptions.
return
if node.provision_state in _UNPROVISION_STATES:
self._unprovision(instance, node)
else:
# NOTE(hshiina): if spawn() fails before ironic starts
# provisioning, instance information should be
# removed from ironic node.
self._remove_instance_info_from_node(node, instance)
try:
if node.provision_state in _UNPROVISION_STATES:
self._unprovision(instance, node)
else:
# NOTE(hshiina): if spawn() fails before ironic starts
# provisioning, instance information should be
# removed from ironic node.
self._remove_instance_info_from_node(node, instance)
finally:
self._cleanup_deploy(node, instance, network_info)
self._cleanup_deploy(node, instance, network_info)
LOG.info('Successfully unprovisioned Ironic node %s',
node.uuid, instance=instance)