From d01715321a484c24767f64edf77514b9609c279c Mon Sep 17 00:00:00 2001 From: Zenghui Shi Date: Tue, 8 May 2018 15:19:18 +0800 Subject: [PATCH] BIOS Settings: Add BIOS caching The BIOS settings will be retrieved and cached for the node as part of entering cleaning step in ``_do_node_clean``, this will work for both manual and automated cleaning. Co-Authored-By: Yolanda Robla Mota Change-Id: I1d56b0b5ec7e91919df43a2bec5196dc13726c26 Story: #1712032 --- ironic/conductor/manager.py | 11 ++++++++ ironic/tests/unit/conductor/test_manager.py | 28 +++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index e0eb434792..c3fd1d3942 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -1175,6 +1175,17 @@ class ConductorManager(base_manager.BaseConductorManager): node.driver_internal_info = info node.save() + # Do caching of bios settings if supported by driver, + # this will be called for both manual and automated cleaning. + # TODO(zshi) remove this check when classic drivers are removed + if getattr(task.driver, 'bios', None): + try: + task.driver.bios.cache_bios_settings(task) + except Exception as e: + msg = (_('Caching of bios settings failed on node %(node)s.') + % {'node': node.uuid}) + LOG.exception(msg) + # Allow the deploy driver to set up the ramdisk again (necessary for # IPA cleaning) try: diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index 26ed64afab..71cdcaffbb 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -2382,6 +2382,34 @@ class DoNodeCleanTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase): def test__do_node_clean_manual_network_validate_fail(self, mock_validate): self.__do_node_clean_validate_fail(mock_validate, clean_steps=[]) + @mock.patch('ironic.drivers.modules.network.flat.FlatNetwork.validate') + @mock.patch('ironic.drivers.modules.fake.FakeBIOS.cache_bios_settings') + def test__do_node_clean_cache_bios(self, mock_bios, mock_validate, + clean_steps=None): + tgt_prov_state = states.MANAGEABLE if clean_steps else states.AVAILABLE + node = obj_utils.create_test_node( + self.context, driver='fake', + provision_state=states.CLEANING, + target_provision_state=tgt_prov_state) + with task_manager.acquire( + self.context, node.uuid, shared=False) as task: + self.service._do_node_clean(task, clean_steps=clean_steps) + node.refresh() + self.assertFalse(mock_bios.called) + if clean_steps: + self.assertEqual(states.CLEANFAIL, node.provision_state) + self.assertEqual(tgt_prov_state, node.target_provision_state) + else: + self.assertEqual(states.AVAILABLE, node.provision_state) + self.assertEqual(states.NOSTATE, node.target_provision_state) + mock_validate.assert_called_once_with(task) + + def test__do_node_clean_manual_cache_bios(self): + self.test__do_node_clean_cache_bios(clean_steps=[self.deploy_raid]) + + def test__do_node_clean_automated_cache_bios(self): + self.test__do_node_clean_cache_bios() + @mock.patch('ironic.drivers.modules.fake.FakePower.validate') def test__do_node_clean_automated_disabled(self, mock_validate): self.config(automated_clean=False, group='conductor')