diff options
author | Zuul <zuul@review.openstack.org> | 2018-01-24 14:29:13 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2018-01-24 14:29:13 +0000 |
commit | 6a1a8efb5f356efae959601235773bbe19240bee (patch) | |
tree | 18124399d17b787c65afbcf987a0843239e33b4f /ironic/tests/unit | |
parent | 2cd7232f142373b0744dd42aaf1e6ce0740a1567 (diff) | |
parent | c6b615cc5b591af607f95eb9c25bdb409f708fb6 (diff) | |
download | ironic-6a1a8efb5f356efae959601235773bbe19240bee.tar.gz |
Merge "Migrate oneview hardware type to use python-hpOneView"
Diffstat (limited to 'ironic/tests/unit')
8 files changed, 495 insertions, 729 deletions
diff --git a/ironic/tests/unit/drivers/modules/oneview/test_common.py b/ironic/tests/unit/drivers/modules/oneview/test_common.py index 56e29395c..5ed590fb0 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_common.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_common.py @@ -17,7 +17,6 @@ import mock from oslo_utils import importutils from ironic.common import exception -from ironic.common import states from ironic.conductor import task_manager from ironic.drivers.modules.oneview import common from ironic.tests.unit.conductor import mgr_utils @@ -26,7 +25,6 @@ from ironic.tests.unit.db import utils as db_utils from ironic.tests.unit.objects import utils as obj_utils hponeview_client = importutils.try_import('hpOneView.oneview_client') -oneview_states = importutils.try_import('oneview_client.states') class OneViewCommonTestCase(db_base.DbTestCase): @@ -258,24 +256,6 @@ class OneViewCommonTestCase(db_base.DbTestCase): {"a": '', "b": None, "c": "something"}, ["a", "b", "c"]) - def _test_translate_oneview_states(self, power_state_to_translate, - expected_translated_power_state): - translated_power_state = common.translate_oneview_power_state( - power_state_to_translate) - self.assertEqual(translated_power_state, - expected_translated_power_state) - - def test_all_scenarios_for_translate_oneview_states(self): - self._test_translate_oneview_states( - oneview_states.ONEVIEW_POWERING_OFF, states.POWER_ON) - self._test_translate_oneview_states( - oneview_states.ONEVIEW_POWER_OFF, states.POWER_OFF) - self._test_translate_oneview_states( - oneview_states.ONEVIEW_POWERING_ON, states.POWER_OFF) - self._test_translate_oneview_states( - oneview_states.ONEVIEW_RESETTING, states.REBOOT) - self._test_translate_oneview_states("anything", states.ERROR) - @mock.patch.object(common, 'get_oneview_client', spec_set=True, autospec=True) def test_validate_oneview_resources_compatibility( diff --git a/ironic/tests/unit/drivers/modules/oneview/test_deploy.py b/ironic/tests/unit/drivers/modules/oneview/test_deploy.py index b49edd749..098a54f64 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_deploy.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_deploy.py @@ -99,7 +99,6 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.config(password='password', group='oneview') mgr_utils.mock_the_extension_manager(driver='fake_oneview') - self.driver = driver_factory.get_driver('fake_oneview') self.deploy = OneViewDriverDeploy() self.os_primary = mock.MagicMock(spec=METHODS) @@ -119,9 +118,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_taken_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertTrue(self.os_primary.update_node.called) self.assertTrue(self.os_primary.do_provisioning_action.called) self.assertTrue(self.node.maintenance) @@ -139,9 +136,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_taken_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertFalse(self.os_primary.update_node.called) self.assertFalse(self.os_primary.do_provisioning_action.called) self.assertFalse(self.node.maintenance) @@ -158,9 +153,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_taken_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertFalse(self.os_primary.update_node.called) self.assertFalse(self.os_primary.do_provisioning_action.called) self.assertFalse(self.node.maintenance) @@ -177,9 +170,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_freed_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertTrue(self.os_primary.update_node.called) self.assertTrue(self.os_primary.do_provisioning_action.called) self.assertFalse(self.node.maintenance) @@ -195,9 +186,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_freed_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertFalse(self.os_primary.update_node.called) self.assertFalse(self.os_primary.do_provisioning_action.called) self.assertTrue(self.node.maintenance) @@ -215,9 +204,7 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.deploy._periodic_check_nodes_freed_by_oneview( self.os_primary, self.context ) - mock_is_node_in_use_by_oneview.assert_called_once_with( - self.deploy.oneview_client, self.node - ) + mock_is_node_in_use_by_oneview.assert_called_once_with(self.node) self.assertFalse(self.os_primary.update_node.called) self.assertFalse(self.os_primary.do_provisioning_action.called) self.assertTrue(self.node.maintenance) @@ -245,8 +232,8 @@ class OneViewPeriodicTasks(db_base.DbTestCase): ): mock_node_get.get.return_value = self.node _setup_node_in_cleanfailed_state_without_oneview_error(self.node) - self.os_primary.iter_nodes.return_value = \ - nodes_taken_on_cleanfail_no_info + self.os_primary.iter_nodes.return_value = ( + nodes_taken_on_cleanfail_no_info) self.deploy._periodic_check_nodes_taken_on_cleanfail( self.os_primary, self.context ) @@ -258,7 +245,6 @@ class OneViewPeriodicTasks(db_base.DbTestCase): self.assertNotIn('oneview_error', self.node.driver_internal_info) -@mock.patch.object(common, 'get_oneview_client', spec_set=True, autospec=True) class OneViewIscsiDeployTestCase(db_base.DbTestCase): def setUp(self): @@ -282,35 +268,32 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): node_id=self.node.id) self.info = common.get_oneview_info(self.node) - def test_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = common.COMMON_PROPERTIES self.assertEqual(expected, self.driver.deploy.get_properties()) @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'validate', spec_set=True, autospec=True) - def test_validate(self, iscsi_deploy_validate_mock, mock_get_ov_client): + def test_validate(self, iscsi_deploy_validate): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.deploy.validate(task) - iscsi_deploy_validate_mock.assert_called_once_with(mock.ANY, task) + iscsi_deploy_validate.assert_called_once_with(mock.ANY, task) - @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare', - spec_set=True, autospec=True) + @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare', autospec=True) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') def test_prepare(self, allocate_server_hardware_mock, - iscsi_deploy_prepare_mock, mock_get_ov_client): + iscsi_deploy_prepare_mock): self.node.provision_state = states.DEPLOYING self.node.save() - with task_manager.acquire(self.context, self.node.uuid, - shared=False) as task: + with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.deploy.prepare(task) iscsi_deploy_prepare_mock.assert_called_once_with(mock.ANY, task) self.assertTrue(allocate_server_hardware_mock.called) @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare', spec_set=True, autospec=True) - def test_prepare_active_node(self, iscsi_deploy_prepare_mock, - mock_get_ov_client): + def test_prepare_active_node(self, iscsi_deploy_prepare_mock): """Ensure nodes in running states are not inadvertently changed""" test_states = list(states.STABLE_STATES) test_states.extend([states.CLEANING, @@ -328,7 +311,7 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'deploy', spec_set=True, autospec=True) - def test_deploy(self, iscsi_deploy_mock, mock_get_ov_client): + def test_deploy(self, iscsi_deploy_mock): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.deploy.deploy(task) @@ -336,7 +319,7 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'tear_down', spec_set=True, autospec=True) - def test_tear_down(self, iscsi_tear_down_mock, mock_get_ov_client): + def test_tear_down(self, iscsi_tear_down_mock): iscsi_tear_down_mock.return_value = states.DELETED with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: @@ -348,9 +331,7 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): autospec=True) @mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic') def test_tear_down_with_automated_clean_disabled( - self, deallocate_server_hardware_mock, - iscsi_tear_down_mock, mock_get_ov_client - ): + self, deallocate_server_hardware_mock, iscsi_tear_down_mock): CONF.conductor.automated_clean = False iscsi_tear_down_mock.return_value = states.DELETED @@ -364,8 +345,8 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): @mock.patch.object(iscsi_deploy.ISCSIDeploy, 'prepare_cleaning', spec_set=True, autospec=True) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') - def test_prepare_cleaning(self, allocate_server_hardware_mock, - iscsi_prep_clean_mock, mock_get_ov_client): + def test_prepare_cleaning( + self, allocate_server_hardware_mock, iscsi_prep_clean_mock): iscsi_prep_clean_mock.return_value = states.CLEANWAIT with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: @@ -378,9 +359,7 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): spec_set=True, autospec=True) @mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic') def test_tear_down_cleaning( - self, deallocate_server_hardware_mock, iscsi_tear_down_clean_mock, - mock_get_ov_client - ): + self, deallocate_server_hardware_mock, iscsi_tear_down_clean_mock): iscsi_tear_down_clean_mock.return_value = states.CLEANWAIT with task_manager.acquire(self.context, self.node.uuid, @@ -390,7 +369,6 @@ class OneViewIscsiDeployTestCase(db_base.DbTestCase): self.assertTrue(deallocate_server_hardware_mock.called) -@mock.patch.object(common, 'get_oneview_client', spec_set=True, autospec=True) class OneViewAgentDeployTestCase(db_base.DbTestCase): def setUp(self): super(OneViewAgentDeployTestCase, self).setUp() @@ -413,13 +391,13 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): node_id=self.node.id) self.info = common.get_oneview_info(self.node) - def test_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = common.COMMON_PROPERTIES self.assertEqual(expected, self.driver.deploy.get_properties()) @mock.patch.object(agent.AgentDeploy, 'validate', spec_set=True, autospec=True) - def test_validate(self, agent_deploy_validate_mock, mock_get_ov_client): + def test_validate(self, agent_deploy_validate_mock): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.deploy.validate(task) @@ -428,8 +406,8 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): @mock.patch.object(agent.AgentDeploy, 'prepare', spec_set=True, autospec=True) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') - def test_prepare(self, allocate_server_hardware_mock, - agent_deploy_prepare_mock, mock_get_ov_client): + def test_prepare( + self, allocate_server_hardware_mock, agent_deploy_prepare_mock): self.node.provision_state = states.DEPLOYING self.node.save() with task_manager.acquire(self.context, self.node.uuid, @@ -440,8 +418,7 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): @mock.patch.object(agent.AgentDeploy, 'prepare', spec_set=True, autospec=True) - def test_prepare_active_node(self, agent_deploy_prepare_mock, - mock_get_ov_client): + def test_prepare_active_node(self, agent_deploy_prepare_mock): """Ensure nodes in running states are not inadvertently changed""" test_states = list(states.STABLE_STATES) test_states.extend([states.CLEANING, @@ -459,7 +436,7 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): @mock.patch.object(agent.AgentDeploy, 'deploy', spec_set=True, autospec=True) - def test_deploy(self, agent_deploy_mock, mock_get_ov_client): + def test_deploy(self, agent_deploy_mock): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.deploy.deploy(task) @@ -469,9 +446,7 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): autospec=True) @mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic') def test_tear_down_with_automated_clean_disabled( - self, deallocate_server_hardware_mock, - agent_tear_down_mock, mock_get_ov_client - ): + self, deallocate_server_hardware_mock, agent_tear_down_mock): CONF.conductor.automated_clean = False agent_tear_down_mock.return_value = states.DELETED with task_manager.acquire(self.context, self.node.uuid, @@ -484,8 +459,8 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): @mock.patch.object(agent.AgentDeploy, 'prepare_cleaning', spec_set=True, autospec=True) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') - def test_prepare_cleaning(self, allocate_server_hardware_mock, - agent_prep_clean_mock, mock_get_ov_client): + def test_prepare_cleaning( + self, allocate_server_hardware_mock, agent_prep_clean_mock): agent_prep_clean_mock.return_value = states.CLEANWAIT with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: @@ -498,9 +473,7 @@ class OneViewAgentDeployTestCase(db_base.DbTestCase): spec_set=True, autospec=True) @mock.patch.object(deploy_utils, 'deallocate_server_hardware_from_ironic') def test_tear_down_cleaning( - self, deallocate_server_hardware_mock, agent_tear_down_clean_mock, - mock_get_ov_client - ): + self, deallocate_server_hardware_mock, agent_tear_down_clean_mock): agent_tear_down_clean_mock.return_value = states.CLEANWAIT with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: diff --git a/ironic/tests/unit/drivers/modules/oneview/test_deploy_utils.py b/ironic/tests/unit/drivers/modules/oneview/test_deploy_utils.py index fe94e74b9..cd2548ff1 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_deploy_utils.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_deploy_utils.py @@ -14,6 +14,7 @@ # under the License. import mock + from oslo_utils import importutils from ironic.common import driver_factory @@ -31,7 +32,7 @@ from ironic.tests.unit.objects import utils as obj_utils oneview_models = importutils.try_import('oneview_client.models') -@mock.patch.object(common, 'get_oneview_client', spec_set=True, autospec=True) +@mock.patch.object(common, 'get_hponeview_client') class OneViewDeployUtilsTestCase(db_base.DbTestCase): def setUp(self): @@ -49,394 +50,292 @@ class OneViewDeployUtilsTestCase(db_base.DbTestCase): driver_info=db_utils.get_test_oneview_driver_info(), ) self.info = common.get_oneview_info(self.node) + deploy_utils.is_node_in_use_by_oneview = mock.Mock(return_value=False) + deploy_utils.is_node_in_use_by_ironic = mock.Mock(return_value=True) # Tests for prepare - def test_prepare_node_is_in_use_by_oneview(self, mock_get_ov_client): - """`prepare` behavior when the node already has a Profile on OneView. - - """ - oneview_client = mock_get_ov_client() - - fake_server_hardware = oneview_models.ServerHardware() - fake_server_hardware.server_profile_uri = "/any/sp_uri" - oneview_client.get_server_hardware.return_value = fake_server_hardware - + def test_prepare_node_is_in_use_by_oneview(self, mock_oneview_client): + """`prepare` behavior when the node has a Profile on OneView.""" + deploy_utils.is_node_in_use_by_oneview.return_value = True with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - task.node.driver_info = driver_info task.node.provision_state = states.DEPLOYING self.assertRaises( exception.InstanceDeployFailure, deploy_utils.prepare, - oneview_client, task ) @mock.patch.object(objects.Node, 'save') def test_prepare_node_is_successfuly_allocated_to_ironic( - self, mock_node_save, mock_get_ov_client - ): - """`prepare` behavior when the node is free from OneView standpoint. - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh + self, mock_save, mock_oneview_client): + """`prepare` behavior when the node is free from OneView standpoint.""" with task_manager.acquire(self.context, self.node.uuid) as task: task.node.provision_state = states.DEPLOYING - deploy_utils.prepare(oneview_client, task) - self.assertTrue(oneview_client.clone_template_and_apply.called) - self.assertTrue(oneview_client.get_server_profile_from_hardware) + deploy_utils.prepare(task) + self.assertTrue(mock_save.called) # Tests for tear_down - def test_tear_down(self, mock_get_ov_client): - """`tear_down` behavior when node already has Profile applied - - """ - sp_uri = '/rest/server-profiles/1234556789' - ov_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - ov_client = mock_get_ov_client.return_value - ov_client.get_server_hardware_by_uuid.return_value = fake_sh - + def test_tear_down(self, mock_oneview_client): + """`tear_down` behavior when node already has Profile applied.""" + oneview_client = mock_oneview_client() with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = \ + task.node.driver_info['applied_server_profile_uri'] = ( '/rest/server-profiles/1234556789' - task.node.driver_info = driver_info - - self.assertIn( - 'applied_server_profile_uri', task.node.driver_info ) - deploy_utils.tear_down(ov_client, task) - self.assertNotIn( - 'applied_server_profile_uri', task.node.driver_info + self.assertTrue( + 'applied_server_profile_uri' in task.node.driver_info ) - self.assertTrue( - ov_client.delete_server_profile.called - ) + deploy_utils.tear_down(task) + self.assertFalse( + 'applied_server_profile_uri' in task.node.driver_info + ) + self.assertTrue(oneview_client.server_profiles.delete.called) # Tests for prepare_cleaning @mock.patch.object(objects.Node, 'save') def test_prepare_cleaning_when_node_does_not_have_sp_applied( - self, mock_node_save, mock_get_ov_client - ): - """`prepare_cleaning` behavior when node is free - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh + self, mock_save, mock_oneview_client): + """`prepare_cleaning` behavior when node is free.""" with task_manager.acquire(self.context, self.node.uuid) as task: - deploy_utils.prepare_cleaning(oneview_client, task) - self.assertTrue(oneview_client.clone_template_and_apply.called) + self.assertFalse( + 'applied_server_profile_uri' in task.node.driver_info + ) + deploy_utils.prepare_cleaning(task) + self.assertTrue( + 'applied_server_profile_uri' in task.node.driver_info + ) @mock.patch.object(objects.Node, 'save') def test_prepare_cleaning_when_node_has_sp_applied( - self, mock_node_save, mock_get_ov_client - ): - """`prepare_cleaning` behavior when node already has Profile applied - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = 'same/sp_applied' - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - + self, mock_node_save, mock_oneview_client): + """`prepare_cleaning` behavior when node has Profile applied.""" + oneview_client = mock_oneview_client() + oneview_client.server_hardware.get.return_value = { + 'serverProfileUri': 'same/sp_applied' + } with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'same/sp_applied' - task.node.driver_info = driver_info - - deploy_utils.prepare_cleaning(oneview_client, task) - self.assertFalse(oneview_client.clone_template_and_apply.called) + task.node.driver_info['applied_server_profile_uri'] = ( + 'same/sp_applied' + ) + deploy_utils.prepare_cleaning(task) + self.assertFalse(mock_node_save.called) def test_prepare_cleaning_node_is_in_use_by_oneview( - self, mock_get_ov_client - ): - """`prepare_cleaning` behavior when node has Server Profile on OneView - - """ - oneview_client = mock_get_ov_client() - - fake_server_hardware = oneview_models.ServerHardware() - fake_server_hardware.server_profile_uri = "/any/sp_uri" - oneview_client.get_server_hardware.return_value = fake_server_hardware + self, mock_oneview_client): + """`prepare_cleaning` behavior when node has Profile on OneView.""" + deploy_utils.is_node_in_use_by_oneview.return_value = True with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - task.node.driver_info = driver_info - task.node.provision_state = states.DEPLOYING self.assertRaises( exception.NodeCleaningFailure, deploy_utils.prepare_cleaning, - oneview_client, task ) # Tests for tear_down_cleaning - def test_tear_down_cleaning(self, mock_get_ov_client): - """Checks if Server Profile was deleted and its uri removed - - """ - sp_uri = '/rest/server-profiles/1234556789' - ov_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - ov_client = mock_get_ov_client.return_value - ov_client.get_server_hardware_by_uuid.return_value = fake_sh - + def test_tear_down_cleaning(self, mock_oneview_client): + """Check if Server Profile was deleted and its uri removed.""" + oneview_client = mock_oneview_client() with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = \ + task.node.driver_info['applied_server_profile_uri'] = ( '/rest/server-profiles/1234556789' - task.node.driver_info = driver_info - - self.assertIn('applied_server_profile_uri', task.node.driver_info) - deploy_utils.tear_down_cleaning(ov_client, task) - self.assertNotIn('applied_server_profile_uri', - task.node.driver_info) - self.assertTrue(ov_client.delete_server_profile.called) + ) + self.assertTrue( + 'applied_server_profile_uri' in task.node.driver_info + ) + deploy_utils.tear_down_cleaning(task) + self.assertFalse( + 'applied_server_profile_uri' in task.node.driver_info + ) + self.assertTrue(oneview_client.server_profiles.delete.called) # Tests for is_node_in_use_by_oneview - def test_is_node_in_use_by_oneview(self, mock_get_ov_client): - """Node has a Server Profile applied by a third party user. - - """ - oneview_client = mock_get_ov_client() - - fake_server_hardware = oneview_models.ServerHardware() - fake_server_hardware.server_profile_uri = "/any/sp_uri" - + def test_is_node_in_use_by_oneview(self, mock_oneview_client): + """Node has a Server Profile applied by a third party user.""" + server_hardware = { + 'serverProfileUri': '/rest/server-profile/123456789' + } with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - task.node.driver_info = driver_info + task.node.driver_info['applied_server_profile_uri'] = ( + '/rest/server-profile/987654321' + ) self.assertTrue( - deploy_utils.is_node_in_use_by_oneview(oneview_client, - task.node) + deploy_utils._is_node_in_use( + server_hardware, + task.node.driver_info['applied_server_profile_uri'], + by_oneview=True + ) ) def test_is_node_in_use_by_oneview_no_server_profile( - self, mock_get_ov_client - ): - """Node has no Server Profile. - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh + self, mock_oneview_client): + """Node has no Server Profile.""" + server_hardware = {'serverProfileUri': None} with task_manager.acquire(self.context, self.node.uuid) as task: + task.node.driver_info['applied_server_profile_uri'] = ( + '/rest/server-profile/123456789' + ) self.assertFalse( - deploy_utils.is_node_in_use_by_oneview(oneview_client, - task.node) + deploy_utils._is_node_in_use( + server_hardware, + task.node.driver_info['applied_server_profile_uri'], + by_oneview=True + ) ) def test_is_node_in_use_by_oneview_same_server_profile_applied( - self, mock_get_ov_client - ): - """Node's Server Profile uri is the same applied by ironic. - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = 'same/applied_sp_uri/' - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - + self, mock_oneview_client): + """Check if node's Server Profile uri is the same applied by ironic.""" + server_hardware = { + 'serverProfileUri': '/rest/server-profile/123456789' + } with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'same/applied_sp_uri/' - task.node.driver_info = driver_info + task.node.driver_info['applied_server_profile_uri'] = ( + '/rest/server-profile/123456789' + ) self.assertFalse( - deploy_utils.is_node_in_use_by_oneview(oneview_client, - task.node) + deploy_utils._is_node_in_use( + server_hardware, + task.node.driver_info['applied_server_profile_uri'], + by_oneview=True + ) ) # Tests for is_node_in_use_by_ironic - def test_is_node_in_use_by_ironic(self, mock_get_ov_client): - """Node has a Server Profile applied by ironic. - - """ - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = "same/applied_sp_uri/" - - ov_client = mock_get_ov_client.return_value - ov_client.get_server_hardware_by_uuid.return_value = fake_sh - + def test_is_node_in_use_by_ironic(self, mock_oneview_client): + """Node has a Server Profile applied by ironic.""" + server_hardware = {'serverProfileUri': 'same/applied_sp_uri/'} with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'same/applied_sp_uri/' - task.node.driver_info = driver_info + task.node.driver_info['applied_server_profile_uri'] = ( + 'same/applied_sp_uri/' + ) self.assertTrue( - deploy_utils.is_node_in_use_by_ironic(ov_client, task.node) + deploy_utils._is_node_in_use( + server_hardware, + task.node.driver_info['applied_server_profile_uri'], + by_oneview=False + ) ) def test_is_node_in_use_by_ironic_no_server_profile( - self, mock_get_ov_client - ): - """Node has no Server Profile. - - """ - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - - ov_client = mock_get_ov_client.return_value - ov_client.get_server_hardware_by_uuid.return_value = fake_sh - + self, mock_oneview_client): + """Node has no Server Profile.""" + server_hardware = {'serverProfileUri': None} with task_manager.acquire(self.context, self.node.uuid) as task: + task.node.driver_info['applied_server_profile_uri'] = ( + '/applied_sp_uri/' + ) self.assertFalse( - deploy_utils.is_node_in_use_by_ironic(ov_client, task.node) + deploy_utils._is_node_in_use( + server_hardware, + task.node.driver_info['applied_server_profile_uri'], + by_oneview=False + ) ) - # Tests for _add_applied_server_profile_uri_field - def test__add_applied_server_profile_uri_field(self, mock_get_ov_client): - """Checks if applied_server_profile_uri was added to driver_info. + def test__create_profile_from_template(self, mock_oneview_client): + """Check if the server_profile was created from template.""" + server_hardware_uri = "server_hardware/12456789" + sp_template_uri = "server_profile_template_uri/13245798" + oneview_client = mock_oneview_client() + oneview_client.server_profile_templates.\ + get_new_profile.return_value = {} + server_profile = {"name": "server_profile_name", + "serverHardwareUri": server_hardware_uri, + "serverProfileTemplateUri": ""} + deploy_utils._create_profile_from_template( + oneview_client, + "server_profile_name", + server_hardware_uri, + sp_template_uri + ) + oneview_client.server_profiles.create.assert_called_with( + server_profile) - """ + # Tests for _add_applied_server_profile_uri_field + @mock.patch.object(objects.Node, 'save') + def test__add_applied_server_profile_uri_field( + self, save, mock_oneview_client): + """Check if applied_server_profile_uri was added to driver_info.""" + server_profile = {'uri': 'any/applied_sp_uri/'} with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - task.node.driver_info = driver_info - fake_server_profile = oneview_models.ServerProfile() - fake_server_profile.uri = 'any/applied_sp_uri/' - - self.assertNotIn('applied_server_profile_uri', - task.node.driver_info) + task.node.driver_info.pop('applied_server_profile_uri', None) + self.assertNotIn( + 'applied_server_profile_uri', task.node.driver_info + ) deploy_utils._add_applied_server_profile_uri_field( task.node, - fake_server_profile + server_profile ) self.assertIn('applied_server_profile_uri', task.node.driver_info) # Tests for _del_applied_server_profile_uri_field - def test__del_applied_server_profile_uri_field(self, mock_get_ov_client): - """Checks if applied_server_profile_uri was removed from driver_info. - - """ + @mock.patch.object(objects.Node, 'save') + def test__del_applied_server_profile_uri_field( + self, save, mock_oneview_client): + """Check if applied_server_profile_uri was removed from driver_info.""" with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'any/applied_sp_uri/' - task.node.driver_info = driver_info - + task.node.driver_info['applied_server_profile_uri'] = ( + 'any/applied_sp_uri/' + ) self.assertIn('applied_server_profile_uri', task.node.driver_info) deploy_utils._del_applied_server_profile_uri_field(task.node) - self.assertNotIn('applied_server_profile_uri', - task.node.driver_info) + self.assertNotIn( + 'applied_server_profile_uri', task.node.driver_info + ) # Tests for allocate_server_hardware_to_ironic @mock.patch.object(objects.Node, 'save') def test_allocate_server_hardware_to_ironic( - self, mock_node_save, mock_get_ov_client - ): - """Checks if a Server Profile was created and its uri is in driver_info. - - """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh + self, mock_node_save, mock_oneview_client): + """Check if a Profile was created and its uri is in driver_info.""" + oneview_client = mock_oneview_client() + server_hardware = {'serverProfileUri': None} + oneview_client.server_hardware.get.return_value = server_hardware with task_manager.acquire(self.context, self.node.uuid) as task: deploy_utils.allocate_server_hardware_to_ironic( - oneview_client, task.node, 'serverProfileName' + task.node, 'serverProfileName' ) - self.assertTrue(oneview_client.clone_template_and_apply.called) + self.assertTrue(mock_node_save.called) self.assertIn('applied_server_profile_uri', task.node.driver_info) @mock.patch.object(objects.Node, 'save') - @mock.patch.object(deploy_utils, - '_del_applied_server_profile_uri_field') def test_allocate_server_hardware_to_ironic_node_has_server_profile( - self, mock_delete_applied_sp, mock_node_save, mock_get_ov_client - ): - """Tests server profile allocation when applied_server_profile_uri exists. + self, mock_node_save, mock_oneview_client): + """Test profile allocation when applied_server_profile_uri exists. This test consider that no Server Profile is applied on the Server Hardware but the applied_server_profile_uri remained on the node. Thus, the conductor should remove the value and apply a new server profile to use the node. """ - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = None - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh + oneview_client = mock_oneview_client() + server_hardware = {'serverProfileUri': None} + oneview_client.server_hardware.get.return_value = server_hardware with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'any/applied_sp_uri/' - task.node.driver_info = driver_info - + task.node.driver_info['applied_server_profile_uri'] = ( + 'any/applied_sp_uri/' + ) deploy_utils.allocate_server_hardware_to_ironic( - oneview_client, task.node, 'serverProfileName' + task.node, 'serverProfileName' ) - self.assertTrue(mock_delete_applied_sp.called) + self.assertTrue(mock_node_save.called) # Tests for deallocate_server_hardware_from_ironic @mock.patch.object(objects.Node, 'save') def test_deallocate_server_hardware_from_ironic( - self, mock_node_save, mock_get_ov_client - ): - oneview_client = mock_get_ov_client() - - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = 'any/applied_sp_uri/' - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - mock_get_ov_client.return_value = oneview_client - + self, mock_node_save, mock_oneview_client): + oneview_client = mock_oneview_client() + server_hardware = {'serverProfileUri': 'any/applied_sp_uri/'} + oneview_client.server_hardware.get.return_value = server_hardware with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'any/applied_sp_uri/' - task.node.driver_info = driver_info - - deploy_utils.deallocate_server_hardware_from_ironic( - oneview_client, task.node + task.node.driver_info['applied_server_profile_uri'] = ( + 'any/applied_sp_uri/' ) - self.assertTrue(oneview_client.delete_server_profile.called) - self.assertNotIn( - 'applied_server_profile_uri', task.node.driver_info - ) - - @mock.patch.object(objects.Node, 'save') - def test_deallocate_server_hardware_from_ironic_missing_profile_uuid( - self, mock_node_save, mock_get_ov_client - ): - """Test for case when server profile application fails. - - Due to an error when applying Server Profile in OneView, - the node will have no Server Profile uuid in the - 'applied_server_profile_uri' namespace. When the method - tested is called without Server Profile uuid, the client - will raise a ValueError when trying to delete the profile, - this error is converted to an OneViewError. - """ - - ov_client = mock_get_ov_client.return_value - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = 'any/applied_sp_uri/' - ov_client.get_server_hardware_by_uuid.return_value = fake_sh - ov_client.delete_server_profile.side_effect = ValueError - mock_get_ov_client.return_value = ov_client - - with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = 'any/applied_sp_uri/' - task.node.driver_info = driver_info - self.assertRaises( - exception.OneViewError, - deploy_utils.deallocate_server_hardware_from_ironic, - ov_client, - task.node - ) - self.assertTrue(ov_client.delete_server_profile.called) - self.assertIn( - 'applied_server_profile_uri', task.node.driver_info + deploy_utils.deallocate_server_hardware_from_ironic(task) + self.assertTrue(mock_node_save.called) + self.assertTrue( + 'applied_server_profile_uri' not in task.node.driver_info ) diff --git a/ironic/tests/unit/drivers/modules/oneview/test_inspect.py b/ironic/tests/unit/drivers/modules/oneview/test_inspect.py index ebc01b101..9f7b43918 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_inspect.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_inspect.py @@ -24,8 +24,6 @@ from ironic.tests.unit.db import utils as db_utils from ironic.tests.unit.objects import utils as obj_utils -@mock.patch.object( - oneview_common, 'get_oneview_client', spec_set=True, autospec=True) class AgentPXEOneViewInspectTestCase(db_base.DbTestCase): def setUp(self): @@ -39,15 +37,14 @@ class AgentPXEOneViewInspectTestCase(db_base.DbTestCase): driver_info=db_utils.get_test_oneview_driver_info(), ) - def test_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = deploy_utils.get_properties() with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: self.assertEqual(expected, task.driver.inspect.get_properties()) - @mock.patch.object(oneview_common, 'verify_node_info', spec_set=True, - autospec=True) - def test_validate(self, mock_verify_node_info, mock_get_ov_client): + @mock.patch.object(oneview_common, 'verify_node_info') + def test_validate(self, mock_verify_node_info): self.config(enabled=False, group='inspector') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: @@ -55,16 +52,13 @@ class AgentPXEOneViewInspectTestCase(db_base.DbTestCase): mock_verify_node_info.assert_called_once_with(task.node) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') - def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic, - mock_get_ov_client): + def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.inspect.inspect_hardware(task) self.assertTrue(mock_allocate_server_hardware_to_ironic.called) -@mock.patch.object( - oneview_common, 'get_oneview_client', spec_set=True, autospec=True) class ISCSIPXEOneViewInspectTestCase(db_base.DbTestCase): def setUp(self): @@ -78,15 +72,14 @@ class ISCSIPXEOneViewInspectTestCase(db_base.DbTestCase): driver_info=db_utils.get_test_oneview_driver_info(), ) - def test_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = deploy_utils.get_properties() with task_manager.acquire(self.context, self.node.uuid, shared=True) as task: self.assertEqual(expected, task.driver.inspect.get_properties()) - @mock.patch.object(oneview_common, 'verify_node_info', spec_set=True, - autospec=True) - def test_validate(self, mock_verify_node_info, mock_get_ov_client): + @mock.patch.object(oneview_common, 'verify_node_info') + def test_validate(self, mock_verify_node_info): self.config(enabled=False, group='inspector') with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: @@ -94,8 +87,7 @@ class ISCSIPXEOneViewInspectTestCase(db_base.DbTestCase): mock_verify_node_info.assert_called_once_with(task.node) @mock.patch.object(deploy_utils, 'allocate_server_hardware_to_ironic') - def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic, - mock_get_ov_client): + def test_inspect_hardware(self, mock_allocate_server_hardware_to_ironic): with task_manager.acquire(self.context, self.node.uuid, shared=False) as task: task.driver.inspect.inspect_hardware(task) diff --git a/ironic/tests/unit/drivers/modules/oneview/test_management.py b/ironic/tests/unit/drivers/modules/oneview/test_management.py index 1e88f8fb5..f64009972 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_management.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_management.py @@ -22,6 +22,7 @@ from ironic.common import driver_factory from ironic.common import exception from ironic.conductor import task_manager from ironic.drivers.modules.oneview import common +from ironic.drivers.modules.oneview import deploy_utils from ironic.drivers.modules.oneview import management from ironic.tests.unit.conductor import mgr_utils from ironic.tests.unit.db import base as db_base @@ -29,11 +30,12 @@ from ironic.tests.unit.db import utils as db_utils from ironic.tests.unit.objects import utils as obj_utils +client_exception = importutils.try_import('hpOneView.exceptions') oneview_exceptions = importutils.try_import('oneview_client.exceptions') oneview_models = importutils.try_import('oneview_client.models') -@mock.patch.object(common, 'get_oneview_client', spect_set=True, autospec=True) +@mock.patch.object(common, 'get_hponeview_client') class OneViewManagementDriverFunctionsTestCase(db_base.DbTestCase): def setUp(self): @@ -52,44 +54,61 @@ class OneViewManagementDriverFunctionsTestCase(db_base.DbTestCase): ) self.info = common.get_oneview_info(self.node) - def test_set_boot_device(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() + @mock.patch.object(common, 'get_ilorest_client') + def test_set_boot_device( + self, mock_get_ilo_client, mock_get_ov_client): + ilo_client = mock_get_ilo_client() with task_manager.acquire(self.context, self.node.uuid) as task: driver_internal_info = task.node.driver_internal_info next_boot_device = {'boot_device': boot_devices.PXE, - 'persistent': False} + 'persistent': True} driver_internal_info['next_boot_device'] = next_boot_device task.node.driver_internal_info = driver_internal_info management.set_boot_device(task) - oneview_client.set_boot_device.assert_called_once_with( - self.info, - management.BOOT_DEVICE_MAPPING_TO_OV[boot_devices.PXE], - onetime=True - ) + self.assertFalse(ilo_client.called) + patch = ilo_client.patch + self.assertFalse(patch.called) driver_internal_info = task.node.driver_internal_info self.assertNotIn('next_boot_device', driver_internal_info) - def test_set_boot_device_persistent(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - + @mock.patch.object(common, 'get_ilorest_client') + def test_set_boot_device_not_persistent( + self, mock_get_ilo_client, mock_get_ov_client): + ilo_client = mock_get_ilo_client() + client = mock_get_ov_client() + server_profile = {'boot': {'order': + list(management.BOOT_DEVICE_MAP_ONEVIEW_REV)}} + client.server_profiles.get.return_value = server_profile + boot_device_map_ilo = management.BOOT_DEVICE_MAP_ILO + boot_device = boot_device_map_ilo.get(boot_devices.PXE) + path = '/rest/v1/Systems/1' + body = { + "Boot": { + "BootSourceOverrideTarget": boot_device, + "BootSourceOverrideEnabled": "Once" + } + } + headers = {"Content-Type": "application/json"} with task_manager.acquire(self.context, self.node.uuid) as task: + driver_info = task.node.driver_info + profile_uri = driver_info.get('applied_server_profile_uri') driver_internal_info = task.node.driver_internal_info next_boot_device = {'boot_device': boot_devices.PXE, - 'persistent': True} + 'persistent': False} driver_internal_info['next_boot_device'] = next_boot_device task.node.driver_internal_info = driver_internal_info management.set_boot_device(task) - oneview_client.set_boot_device.assert_called_once_with( - self.info, - management.BOOT_DEVICE_MAPPING_TO_OV[boot_devices.PXE], - onetime=False - ) + update = client.server_profiles.update + update.assert_called_once_with(server_profile, profile_uri) + patch = ilo_client.patch + patch.assert_called_once_with( + path=path, body=body, headers=headers) driver_internal_info = task.node.driver_internal_info self.assertNotIn('next_boot_device', driver_internal_info) def test_set_boot_device_invalid_device(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() + client = mock_get_ov_client() with task_manager.acquire(self.context, self.node.uuid) as task: driver_internal_info = task.node.driver_internal_info @@ -100,51 +119,64 @@ class OneViewManagementDriverFunctionsTestCase(db_base.DbTestCase): self.assertRaises(exception.InvalidParameterValue, management.set_boot_device, task) - self.assertFalse(oneview_client.set_boot_device.called) + self.assertFalse(client.set_boot_device.called) self.assertIn('next_boot_device', driver_internal_info) def test_set_boot_device_fail_to_get_server_profile( self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_server_profile_from_hardware.side_effect = \ - oneview_exceptions.OneViewException() + client = mock_get_ov_client() + exc = client_exception.HPOneViewException() + client.server_profiles.get.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: driver_internal_info = task.node.driver_internal_info - next_boot_device = {'boot_device': 'disk', + next_boot_device = {'device': 'disk', 'persistent': True} driver_internal_info['next_boot_device'] = next_boot_device task.node.driver_internal_info = driver_internal_info - self.assertRaises(exception.OneViewError, - management.set_boot_device, - task) - self.assertFalse(oneview_client.set_boot_device.called) + self.assertRaises( + exception.OneViewError, + management.set_boot_device, + task + ) self.assertIn('next_boot_device', driver_internal_info) - def test_set_boot_device_without_server_profile(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_server_profile_from_hardware.return_value = False - + @mock.patch.object(common, 'get_ilorest_client') + def test_set_onetime_boot_persistent( + self, mock_iloclient, mock_get_ov_client): + ilo_client = mock_iloclient() + driver_internal_info = self.node.driver_internal_info + next_boot_device = {'device': 'disk', 'persistent': False} + driver_internal_info['next_boot_device'] = next_boot_device + with task_manager.acquire(self.context, self.node.uuid) as task: + management.set_onetime_boot(task) + self.assertFalse(ilo_client.called) + self.assertFalse(ilo_client.patch.called) + + @mock.patch.object(common, 'get_ilorest_client') + def test_set_onetime_boot_not_persistent( + self, mock_iloclient, mock_get_ov_client): + ilo_client = mock_iloclient() + boot_device = management.BOOT_DEVICE_MAP_ILO.get(boot_devices.DISK) + path = '/rest/v1/Systems/1' + body = { + "Boot": { + "BootSourceOverrideTarget": boot_device, + "BootSourceOverrideEnabled": "Once" + } + } + headers = {"Content-Type": "application/json"} with task_manager.acquire(self.context, self.node.uuid) as task: driver_internal_info = task.node.driver_internal_info - next_boot_device = {'device': 'disk', - 'persistent': True} + next_boot_device = {'boot_device': 'disk', 'persistent': False} driver_internal_info['next_boot_device'] = next_boot_device task.node.driver_internal_info = driver_internal_info - expected_msg = ( - 'A Server Profile is not associated with node %s.' - % self.node.uuid - ) - self.assertRaisesRegex( - exception.OperationNotPermitted, - expected_msg, - management.set_boot_device, - task - ) - self.assertIn('next_boot_device', driver_internal_info) + management.set_onetime_boot(task) + self.assertTrue(mock_iloclient.called) + ilo_client.patch.assert_called_with( + path=path, body=body, headers=headers) -@mock.patch.object(common, 'get_oneview_client', spect_set=True, autospec=True) class OneViewManagementDriverTestCase(db_base.DbTestCase): def setUp(self): @@ -152,6 +184,8 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): self.config(manager_url='https://1.2.3.4', group='oneview') self.config(username='user', group='oneview') self.config(password='password', group='oneview') + self.config(tls_cacert_file='ca_file', group='oneview') + self.config(allow_insecure_connections=False, group='oneview') mgr_utils.mock_the_extension_manager(driver="fake_oneview") self.driver = driver_factory.get_driver("fake_oneview") @@ -163,79 +197,44 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): ) self.info = common.get_oneview_info(self.node) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - def test_validate(self, mock_validate, mock_get_ov_client): - oneview_client = mock_get_ov_client() - self.driver.management.oneview_client = oneview_client - - fake_server_hardware = oneview_models.ServerHardware() - fake_server_hardware.server_profile_uri = 'any/applied_sp_uri/' - - oneview_client.get_server_hardware_by_uuid.return_value = ( - fake_server_hardware - ) - mock_get_ov_client.return_value = oneview_client - - driver_info = self.node.driver_info - driver_info['applied_server_profile_uri'] = 'any/applied_sp_uri/' - - self.node.driver_info = driver_info - self.node.save() - + @mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic') + @mock.patch.object(common, 'validate_oneview_resources_compatibility') + def test_validate(self, mock_validate, mock_ironic_node): + mock_ironic_node.return_value = True with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.management.validate(task) self.assertTrue(mock_validate.called) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - def test_validate_for_node_not_in_use_by_ironic(self, - mock_validate, - mock_get_ov_client): - oneview_client = mock_get_ov_client() - - fake_server_hardware = oneview_models.ServerHardware() - fake_server_hardware.server_profile_uri = 'any/applied_sp_uri/' - - oneview_client.get_server_hardware_by_uuid.return_value = ( - fake_server_hardware - ) - mock_get_ov_client.return_value = oneview_client - - driver_info = self.node.driver_info - driver_info['applied_server_profile_uri'] = 'other/applied_sp_uri/' - - self.node.driver_info = driver_info - self.node.save() - + @mock.patch.object(deploy_utils, 'is_node_in_use_by_ironic') + def test_validate_for_node_not_in_use_by_ironic(self, mock_ironic_node): + mock_ironic_node.return_value = False with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises(exception.InvalidParameterValue, task.driver.management.validate, task) - def test_validate_fail(self, mock_get_ov_client): - node = obj_utils.create_test_node(self.context, - uuid=uuidutils.generate_uuid(), - id=999, - driver='fake_oneview') + def test_validate_fail(self): + node = obj_utils.create_test_node( + self.context, uuid=uuidutils.generate_uuid(), + id=999, driver='fake_oneview' + ) with task_manager.acquire(self.context, node.uuid) as task: self.assertRaises(exception.MissingParameterValue, task.driver.management.validate, task) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - def test_validate_fail_exception(self, mock_validate, mock_get_ov_client): + @mock.patch.object(common, 'validate_oneview_resources_compatibility') + def test_validate_fail_exception(self, mock_validate): mock_validate.side_effect = exception.OneViewError('message') with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises(exception.InvalidParameterValue, task.driver.management.validate, task) - def test_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = common.COMMON_PROPERTIES self.assertItemsEqual(expected, self.driver.management.get_properties()) - def test_set_boot_device_persistent_true(self, mock_get_ov_client): + def test_set_boot_device_persistent_true(self): with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.management.set_boot_device( task, boot_devices.PXE, True) @@ -246,7 +245,7 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): next_boot_device.get('boot_device'), boot_devices.PXE) self.assertTrue(next_boot_device.get('persistent')) - def test_set_boot_device_persistent_false(self, mock_get_ov_client): + def test_set_boot_device_persistent_false(self): with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.management.set_boot_device( task, boot_devices.PXE, False) @@ -257,7 +256,7 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): next_boot_device.get('boot_device'), boot_devices.PXE) self.assertFalse(next_boot_device.get('persistent')) - def test_set_boot_device_invalid_device(self, mock_get_ov_client): + def test_set_boot_device_invalid_device(self): with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises(exception.InvalidParameterValue, task.driver.management.set_boot_device, @@ -265,38 +264,32 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): driver_internal_info = task.node.driver_internal_info self.assertNotIn('next_boot_device', driver_internal_info) - def test_get_supported_boot_devices(self, mock_get_ov_client): + def test_get_supported_boot_devices(self): with task_manager.acquire(self.context, self.node.uuid) as task: - expected = [boot_devices.PXE, boot_devices.DISK, - boot_devices.CDROM] + expected = [ + boot_devices.PXE, boot_devices.DISK, boot_devices.CDROM + ] self.assertItemsEqual( expected, task.driver.management.get_supported_boot_devices(task), ) + @mock.patch.object(common, 'get_hponeview_client') def test_get_boot_device(self, mock_get_ov_client): - device_mapping = management.BOOT_DEVICE_MAPPING_TO_OV - oneview_client = mock_get_ov_client() - self.driver.management.oneview_client = oneview_client - + client = mock_get_ov_client() + device_mapping = management.BOOT_DEVICE_MAP_ONEVIEW.items() with task_manager.acquire(self.context, self.node.uuid) as task: # For each known device on OneView, Ironic should return its # counterpart value - for device_ironic, device_ov in device_mapping.items(): - oneview_client.get_boot_order.return_value = [device_ov] - expected_response = { - 'boot_device': device_ironic, - 'persistent': True - } + for ironic_device, oneview_device in device_mapping: + profile = {'boot': {'order': [oneview_device]}} + client.server_profiles.get.return_value = profile + expected = {'boot_device': ironic_device, 'persistent': True} response = self.driver.management.get_boot_device(task) - self.assertEqual(expected_response, response) - oneview_client.get_boot_order.assert_called_with(self.info) - - def test_get_boot_device_from_next_boot_device( - self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - self.driver.management.oneview_client = oneview_client + self.assertEqual(expected, response) + self.assertTrue(client.server_profiles.get.called) + def test_get_boot_device_from_next_boot_device(self): with task_manager.acquire(self.context, self.node.uuid) as task: driver_internal_info = task.node.driver_internal_info next_boot_device = {'boot_device': boot_devices.DISK, @@ -309,26 +302,21 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): } response = self.driver.management.get_boot_device(task) self.assertEqual(expected_response, response) - self.assertFalse(oneview_client.get_boot_order.called) + @mock.patch.object(common, 'get_hponeview_client') def test_get_boot_device_fail(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_boot_order.side_effect = \ - oneview_exceptions.OneViewException() - self.driver.management.oneview_client = oneview_client - + client = mock_get_ov_client() + exc = client_exception.HPOneViewException() + client.server_profiles.get.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: - self.assertRaises(exception.OneViewError, - self.driver.management.get_boot_device, - task) - oneview_client.get_boot_order.assert_called_with(self.info) - - def test_get_boot_device_unknown_device(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_boot_order.return_value = ["spam", - "bacon"] - self.driver.management.oneview_client = oneview_client + self.assertRaises( + exception.OneViewError, + self.driver.management.get_boot_device, + task + ) + self.assertTrue(client.server_profiles.get.called) + def test_get_boot_device_unknown_device(self): with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises( exception.InvalidParameterValue, @@ -336,7 +324,7 @@ class OneViewManagementDriverTestCase(db_base.DbTestCase): task ) - def test_get_sensors_data_not_implemented(self, mock_get_ov_client): + def test_get_sensors_data_not_implemented(self): with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises( NotImplementedError, diff --git a/ironic/tests/unit/drivers/modules/oneview/test_power.py b/ironic/tests/unit/drivers/modules/oneview/test_power.py index 4c0df08d0..6a8afc295 100644 --- a/ironic/tests/unit/drivers/modules/oneview/test_power.py +++ b/ironic/tests/unit/drivers/modules/oneview/test_power.py @@ -24,20 +24,17 @@ from ironic.conductor import task_manager from ironic.drivers.modules.oneview import common from ironic.drivers.modules.oneview import deploy_utils from ironic.drivers.modules.oneview import management +from ironic.drivers.modules.oneview import power from ironic.tests.unit.conductor import mgr_utils from ironic.tests.unit.db import base as db_base from ironic.tests.unit.db import utils as db_utils from ironic.tests.unit.objects import utils as obj_utils +client_exception = importutils.try_import('hpOneView.exceptions') oneview_models = importutils.try_import('oneview_client.models') oneview_exceptions = importutils.try_import('oneview_client.exceptions') -POWER_ON = 'On' -POWER_OFF = 'Off' -ERROR = 'error' - -@mock.patch.object(common, 'get_oneview_client', spec_set=True, autospec=True) class OneViewPowerDriverTestCase(db_base.DbTestCase): def setUp(self): @@ -45,6 +42,8 @@ class OneViewPowerDriverTestCase(db_base.DbTestCase): self.config(manager_url='https://1.2.3.4', group='oneview') self.config(username='user', group='oneview') self.config(password='password', group='oneview') + self.config(tls_cacert_file='ca_file', group='oneview') + self.config(allow_insecure_connections=False, group='oneview') mgr_utils.mock_the_extension_manager(driver='fake_oneview') self.driver = driver_factory.get_driver('fake_oneview') @@ -55,274 +54,197 @@ class OneViewPowerDriverTestCase(db_base.DbTestCase): driver_info=db_utils.get_test_oneview_driver_info(), ) self.info = common.get_oneview_info(self.node) + deploy_utils.is_node_in_use_by_oneview = mock.Mock(return_value=False) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - @mock.patch.object(deploy_utils, 'is_node_in_use_by_oneview', - spect_set=True, autospec=True) - def test_power_interface_validate(self, mock_is_node_in_use_by_oneview, - mock_validate, mock_get_ov_client): - mock_is_node_in_use_by_oneview.return_value = False + @mock.patch.object(common, 'validate_oneview_resources_compatibility') + def test_validate(self, mock_validate): with task_manager.acquire(self.context, self.node.uuid) as task: task.driver.power.validate(task) self.assertTrue(mock_validate.called) - def test_power_interface_validate_fail(self, mock_get_ov_client): - node = obj_utils.create_test_node(self.context, - uuid=uuidutils.generate_uuid(), - id=999, - driver='fake_oneview') + def test_validate_missing_parameter(self): + node = obj_utils.create_test_node( + self.context, uuid=uuidutils.generate_uuid(), + id=999, driver='fake_oneview') with task_manager.acquire(self.context, node.uuid) as task: - self.assertRaises(exception.MissingParameterValue, - task.driver.power.validate, task) + self.assertRaises( + exception.MissingParameterValue, + task.driver.power.validate, + task) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - def test_power_interface_validate_fail_exception(self, mock_validate, - mock_get_ov_client): + @mock.patch.object(common, 'validate_oneview_resources_compatibility') + def test_validate_exception(self, mock_validate): mock_validate.side_effect = exception.OneViewError('message') with task_manager.acquire(self.context, self.node.uuid) as task: - self.assertRaises(exception.InvalidParameterValue, - task.driver.power.validate, - task) - - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - @mock.patch.object(deploy_utils, 'is_node_in_use_by_oneview', - spect_set=True, autospec=True) - def test_power_validate_fail_node_used_by_oneview( - self, mock_is_node_in_use_by_oneview, mock_validate, - mock_get_ov_client): - mock_validate.return_value = True - mock_is_node_in_use_by_oneview.return_value = True - with task_manager.acquire(self.context, self.node.uuid) as task: - self.assertRaises(exception.InvalidParameterValue, - task.driver.power.validate, - task) + self.assertRaises( + exception.InvalidParameterValue, + task.driver.power.validate, + task) - @mock.patch.object(common, 'validate_oneview_resources_compatibility', - spect_set=True, autospec=True) - @mock.patch.object(deploy_utils, 'is_node_in_use_by_oneview', - spect_set=True, autospec=True) - def test_validate_fail_node_in_use_by_oneview( - self, mock_is_node_in_use_by_oneview, mock_validate, - mock_get_ov_client): - mock_validate.return_value = True - mock_is_node_in_use_by_oneview.side_effect = ( - exception.OneViewError('message')) + def test_validate_node_in_use_by_oneview(self): + deploy_utils.is_node_in_use_by_oneview.return_value = True with task_manager.acquire(self.context, self.node.uuid) as task: - self.assertRaises(exception.InvalidParameterValue, - task.driver.power.validate, - task) + self.assertRaises( + exception.InvalidParameterValue, + task.driver.power.validate, + task) - def test_power_interface_get_properties(self, mock_get_ov_client): + def test_get_properties(self): expected = common.COMMON_PROPERTIES - self.assertItemsEqual(expected, self.driver.power.get_properties()) + self.assertEqual(expected, self.driver.power.get_properties()) + @mock.patch.object(common, 'get_hponeview_client') def test_get_power_state(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_node_power_state.return_value = POWER_ON - self.driver.power.oneview_client = oneview_client - + client = mock_get_ov_client() + server_hardware = {'powerState': 'On'} + client.server_hardware.get.return_value = server_hardware with task_manager.acquire(self.context, self.node.uuid) as task: - self.driver.power.get_power_state(task) - oneview_client.get_node_power_state.assert_called_once_with(self.info) + power_state = self.driver.power.get_power_state(task) + self.assertEqual(states.POWER_ON, power_state) + @mock.patch.object(common, 'get_hponeview_client') def test_get_power_state_fail(self, mock_get_ov_client): - oneview_client = mock_get_ov_client() - oneview_client.get_node_power_state.side_effect = \ - oneview_exceptions.OneViewException() - self.driver.power.oneview_client = oneview_client - + client = mock_get_ov_client() + exc = client_exception.HPOneViewException() + client.server_hardware.get.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: self.assertRaises( exception.OneViewError, self.driver.power.get_power_state, - task - ) + task) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_set_power_on( - self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client = mock_get_ov_client.return_value - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - oneview_client.power_on.return_value = POWER_ON - self.driver.power.oneview_client = oneview_client - + def test_set_power_on(self, mock_set_boot_device, mock_get_ov_client): + client = mock_get_ov_client() + server_hardware = self.node.driver_info.get('server_hardware_uri') with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info self.driver.power.set_power_state(task, states.POWER_ON) - mock_set_boot_device.assert_called_once_with(task) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_on.assert_called_once_with(self.info) + self.assertTrue(mock_set_boot_device.called) + update = client.server_hardware.update_power_state + update.assert_called_once_with(power.POWER_ON, server_hardware) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_set_power_off( - self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client = mock_get_ov_client.return_value - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - oneview_client.power_off.return_value = POWER_OFF - self.driver.power.oneview_client = oneview_client - + def test_set_power_off(self, mock_set_boot_device, mock_get_ov_client): + client = mock_get_ov_client() + server_hardware = self.node.driver_info.get('server_hardware_uri') with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info self.driver.power.set_power_state(task, states.POWER_OFF) self.assertFalse(mock_set_boot_device.called) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_off.assert_called_once_with(self.info) + update = client.server_hardware.update_power_state + update.assert_called_once_with(power.POWER_OFF, server_hardware) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_set_power_on_fail( - self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - exc = oneview_exceptions.OneViewException() - oneview_client.power_on.side_effect = exc - self.driver.power.oneview_client = oneview_client + def test_set_power_reboot(self, mock_set_boot_device, mock_get_ov_client): + client = mock_get_ov_client() + server_hardware = self.node.driver_info.get('server_hardware_uri') + with task_manager.acquire(self.context, self.node.uuid) as task: + self.driver.power.set_power_state(task, states.REBOOT) + calls = [mock.call(power.POWER_OFF, server_hardware), + mock.call(power.POWER_ON, server_hardware)] + update = client.server_hardware.update_power_state + update.assert_has_calls(calls) + @mock.patch.object(common, 'get_hponeview_client') + @mock.patch.object(management, 'set_boot_device') + def test_set_power_on_fail(self, mock_set_boot_device, mock_get_ov_client): + client = mock_get_ov_client() + exc = client_exception.HPOneViewException() + client.server_hardware.update_power_state.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info - self.assertRaises(exception.OneViewError, - self.driver.power.set_power_state, task, - states.POWER_ON) + self.assertRaises( + exception.OneViewError, + self.driver.power.set_power_state, + task, + states.POWER_ON) mock_set_boot_device.assert_called_once_with(task) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_on.assert_called_once_with(self.info) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') def test_set_power_off_fail( self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - exc = oneview_exceptions.OneViewException() - oneview_client.power_off.side_effect = exc - self.driver.power.oneview_client = oneview_client - + client = mock_get_ov_client() + exc = client_exception.HPOneViewException() + client.server_hardware.update_power_state.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info - self.assertRaises(exception.OneViewError, - self.driver.power.set_power_state, task, - states.POWER_OFF) + self.assertRaises( + exception.OneViewError, + self.driver.power.set_power_state, + task, + states.POWER_OFF) self.assertFalse(mock_set_boot_device.called) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_off.assert_called_once_with(self.info) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_set_power_invalid_state( + def test_reboot_fail_with_hardware_on( self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - exc = oneview_exceptions.OneViewException() - oneview_client.power_off.side_effect = exc - self.driver.power.oneview_client = oneview_client - + client = mock_get_ov_client() + server_hardware = {'powerState': 'On'} + client.server_hardware.get.return_value = server_hardware + exc = client_exception.HPOneViewException() + client.server_hardware.update_power_state.side_effect = exc + self.driver.power.client = client with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info - self.assertRaises(exception.InvalidParameterValue, - self.driver.power.set_power_state, task, - 'fake state') + self.assertRaises( + exception.OneViewError, + self.driver.power.reboot, + task) self.assertFalse(mock_set_boot_device.called) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_set_power_reboot( + def test_reboot_fail_with_hardware_off( self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - oneview_client.power_off.return_value = POWER_OFF - oneview_client.power_on.return_value = POWER_ON - self.driver.power.oneview_client = oneview_client - + client = mock_get_ov_client() + server_hardware = {'powerState': 'Off'} + client.server_hardware.get.return_value = server_hardware + exc = client_exception.HPOneViewException() + client.server_hardware.update_power_state.side_effect = exc with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info - self.driver.power.set_power_state(task, states.REBOOT) + self.assertRaises( + exception.OneViewError, + self.driver.power.reboot, + task) mock_set_boot_device.assert_called_once_with(task) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_off.assert_called_once_with(self.info) - oneview_client.power_off.assert_called_once_with(self.info) - oneview_client.power_on.assert_called_once_with(self.info) @mock.patch.object(management, 'set_boot_device') - def test_reboot( - self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - oneview_client.power_off.return_value = POWER_OFF - oneview_client.power_on.return_value = POWER_ON - self.driver.power.oneview_client = oneview_client + def test_set_power_invalid_state(self, mock_set_boot_device): + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + exception.InvalidParameterValue, + self.driver.power.set_power_state, + task, + 'fake_state') + self.assertFalse(mock_set_boot_device.called) + @mock.patch.object(common, 'get_hponeview_client') + @mock.patch.object(management, 'set_boot_device') + def test_set_power_reboot_with_hardware_on( + self, mock_set_boot_device, mock_get_ov_client): + client = mock_get_ov_client() + server_hardware = {'powerState': 'On'} + client.server_hardware.get.return_value = server_hardware + server_hardware = self.node.driver_info.get('server_hardware_uri') with task_manager.acquire(self.context, self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info self.driver.power.reboot(task) + calls = [mock.call(power.POWER_OFF, server_hardware), + mock.call(power.POWER_ON, server_hardware)] + update = client.server_hardware.update_power_state + update.assert_has_calls(calls) mock_set_boot_device.assert_called_once_with(task) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_off.assert_called_once_with(self.info) - oneview_client.power_on.assert_called_once_with(self.info) + @mock.patch.object(common, 'get_hponeview_client') @mock.patch.object(management, 'set_boot_device') - def test_reboot_fail( + def test_set_power_reboot_with_hardware_off( self, mock_set_boot_device, mock_get_ov_client): - - sp_uri = '/any/server-profile' - oneview_client = mock_get_ov_client() - fake_sh = oneview_models.ServerHardware() - fake_sh.server_profile_uri = sp_uri - oneview_client.get_server_hardware_by_uuid.return_value = fake_sh - exc = oneview_exceptions.OneViewException() - oneview_client.power_off.side_effect = exc - self.driver.power.oneview_client = oneview_client - - with task_manager.acquire(self.context, - self.node.uuid) as task: - driver_info = task.node.driver_info - driver_info['applied_server_profile_uri'] = sp_uri - task.node.driver_info = driver_info - self.assertRaises(exception.OneViewError, - self.driver.power.reboot, task) - self.assertFalse(mock_set_boot_device.called) - self.info['applied_server_profile_uri'] = sp_uri - oneview_client.power_off.assert_called_once_with(self.info) - self.assertFalse(oneview_client.power_on.called) + client = mock_get_ov_client() + server_hardware = {'powerState': 'Off'} + client.server_hardware.get.return_value = server_hardware + server_hardware = self.node.driver_info.get('server_hardware_uri') + with task_manager.acquire(self.context, self.node.uuid) as task: + self.driver.power.reboot(task) + update = client.server_hardware.update_power_state + update.assert_called_once_with(power.POWER_ON, server_hardware) + mock_set_boot_device.assert_called_once_with(task) diff --git a/ironic/tests/unit/drivers/third_party_driver_mock_specs.py b/ironic/tests/unit/drivers/third_party_driver_mock_specs.py index 2574743c9..8126f7add 100644 --- a/ironic/tests/unit/drivers/third_party_driver_mock_specs.py +++ b/ironic/tests/unit/drivers/third_party_driver_mock_specs.py @@ -162,6 +162,10 @@ HPE_ONEVIEW_STATES_SPEC = ( 'ONEVIEW_ERROR', ) +REDFISH_SPEC = ( + 'redfish', +) + SUSHY_CONSTANTS_SPEC = ( 'BOOT_SOURCE_TARGET_PXE', 'BOOT_SOURCE_TARGET_HDD', diff --git a/ironic/tests/unit/drivers/third_party_driver_mocks.py b/ironic/tests/unit/drivers/third_party_driver_mocks.py index 28e374198..f813a69c0 100644 --- a/ironic/tests/unit/drivers/third_party_driver_mocks.py +++ b/ironic/tests/unit/drivers/third_party_driver_mocks.py @@ -116,6 +116,14 @@ if 'ironic.drivers.oneview' in sys.modules: six.moves.reload_module(sys.modules['ironic.drivers.modules.oneview']) +redfish = importutils.try_import('redfish') +if not redfish: + redfish = mock.MagicMock(spec_set=mock_specs.REDFISH_SPEC) + sys.modules['redfish'] = redfish +if 'ironic.drivers.oneview' in sys.modules: + six.moves.reload_module(sys.modules['ironic.drivers.modules.oneview']) + + # attempt to load the external 'python-dracclient' library, which is required # by the optional drivers.modules.drac module dracclient = importutils.try_import('dracclient') |