diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py index aa4d05a1683e..cd0128315123 100644 --- a/nova/tests/unit/virt/ironic/test_driver.py +++ b/nova/tests/unit/virt/ironic/test_driver.py @@ -1135,12 +1135,12 @@ class IronicDriverTestCase(test.NoDBTestCase): @mock.patch.object(FAKE_CLIENT, 'node') @mock.patch.object(ironic_driver.IronicDriver, '_cleanup_deploy') - def test_destroy(self, mock_cleanup_deploy, mock_node): + def _test_destroy(self, state, mock_cleanup_deploy, mock_node): node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' network_info = 'foo' node = ironic_utils.get_test_node(driver='fake', uuid=node_uuid, - provision_state=ironic_states.ACTIVE) + provision_state=state) instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) def fake_set_provision_state(*_): @@ -1149,54 +1149,22 @@ class IronicDriverTestCase(test.NoDBTestCase): mock_node.get_by_instance_uuid.return_value = node mock_node.set_provision_state.side_effect = fake_set_provision_state self.driver.destroy(self.ctx, instance, network_info, None) - mock_node.set_provision_state.assert_called_once_with(node_uuid, - 'deleted') + mock_node.get_by_instance_uuid.assert_called_with(instance.uuid) mock_cleanup_deploy.assert_called_with(self.ctx, node, instance, network_info) - @mock.patch.object(FAKE_CLIENT, 'node') - @mock.patch.object(ironic_driver.IronicDriver, '_cleanup_deploy') - def test_destroy_ignore_unexpected_state(self, mock_cleanup_deploy, - mock_node): - node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' - network_info = 'foo' + # For states that makes sense check if set_provision_state has + # been called + if state in ironic_driver._UNPROVISION_STATES: + mock_node.set_provision_state.assert_called_once_with( + node_uuid, 'deleted') + else: + self.assertFalse(mock_node.set_provision_state.called) - node = ironic_utils.get_test_node(driver='fake', uuid=node_uuid, - provision_state=ironic_states.DELETING) - instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) - - mock_node.get_by_instance_uuid.return_value = node - self.driver.destroy(self.ctx, instance, network_info, None) - self.assertFalse(mock_node.set_provision_state.called) - mock_node.get_by_instance_uuid.assert_called_with(instance.uuid) - mock_cleanup_deploy.assert_called_with(self.ctx, node, instance, - network_info) - - @mock.patch.object(FAKE_CLIENT, 'node') - @mock.patch.object(ironic_driver.IronicDriver, '_cleanup_deploy') - def _test_destroy_cleaning(self, mock_cleanup_deploy, mock_node, - state=None): - node_uuid = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' - network_info = 'foo' - - node = ironic_utils.get_test_node( - driver='fake', uuid=node_uuid, - provision_state=state) - instance = fake_instance.fake_instance_obj(self.ctx, node=node_uuid) - - mock_node.get_by_instance_uuid.return_value = node - self.driver.destroy(self.ctx, instance, network_info, None) - self.assertFalse(mock_node.set_provision_state.called) - mock_node.get_by_instance_uuid.assert_called_with(instance.uuid) - mock_cleanup_deploy.assert_called_with(self.ctx, node, instance, - network_info) - - def test_destroy_cleaning(self): - self._test_destroy_cleaning(state=ironic_states.CLEANING) - - def test_destroy_cleanwait(self): - self._test_destroy_cleaning(state=ironic_states.CLEANWAIT) + def test_destroy(self): + for state in ironic_states.PROVISION_STATE_LIST: + self._test_destroy(state) @mock.patch.object(FAKE_CLIENT.node, 'set_provision_state') @mock.patch.object(ironic_driver, '_validate_instance_and_node') diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py index d33a994102c2..b1b8de289630 100644 --- a/nova/virt/ironic/driver.py +++ b/nova/virt/ironic/driver.py @@ -112,6 +112,10 @@ _POWER_STATE_MAP = { ironic_states.POWER_OFF: power_state.SHUTDOWN, } +_UNPROVISION_STATES = (ironic_states.ACTIVE, ironic_states.DEPLOYFAIL, + ironic_states.ERROR, ironic_states.DEPLOYWAIT, + ironic_states.DEPLOYING) + def map_power_state(state): try: @@ -902,10 +906,7 @@ class IronicDriver(virt_driver.ComputeDriver): # without raising any exceptions. return - if node.provision_state in (ironic_states.ACTIVE, - ironic_states.DEPLOYFAIL, - ironic_states.ERROR, - ironic_states.DEPLOYWAIT): + if node.provision_state in _UNPROVISION_STATES: self._unprovision(self.ironicclient, instance, node) self._cleanup_deploy(context, node, instance, network_info) diff --git a/nova/virt/ironic/ironic_states.py b/nova/virt/ironic/ironic_states.py index 5bb9ec4a9376..162dbcd74767 100644 --- a/nova/virt/ironic/ironic_states.py +++ b/nova/virt/ironic/ironic_states.py @@ -128,7 +128,6 @@ This is the provision state used when inspection is started. A successfully inspected node shall transition to MANAGEABLE status. """ - INSPECTFAIL = 'inspect failed' """ Node inspection failed. """ @@ -145,3 +144,13 @@ POWER_OFF = 'power off' REBOOT = 'rebooting' """ Node is rebooting. """ + +################## +# Helper constants +################## + +PROVISION_STATE_LIST = (NOSTATE, MANAGEABLE, AVAILABLE, ACTIVE, DEPLOYWAIT, + DEPLOYING, DEPLOYFAIL, DEPLOYDONE, DELETING, DELETED, + CLEANING, CLEANWAIT, CLEANFAIL, ERROR, REBUILD, + INSPECTING, INSPECTFAIL) +""" A list of all provision states. """