From 3c548670b7af6ecbe51ff16121f6ef97213c2f59 Mon Sep 17 00:00:00 2001 From: "Qianbiao.NG" Date: Tue, 15 Sep 2020 18:09:25 +0800 Subject: [PATCH] Fix: make Intel CNA hardware manager none generic Currently, IntelCnaHardwareManager inherits GenericHardwareManager which makes it a new "GenericHardwareManager" with "MAINLINE" priority. This causes all other hardware-managers with lower priority than "MAINLINE" never be used. To fix this, make IntelCnaHardwareManager inherit basic HardwareManager. Change-Id: I28b665d8841b0b2e83b132e1f25df95e03e7ba10 Story: 2008142 Task: 40882 (cherry picked from commit 4b0ef13d0812f4302e7b9ad08d94a04be4729583) --- ironic_python_agent/hardware_managers/cna.py | 23 ++++--------- .../tests/unit/hardware_managers/test_cna.py | 34 +++++++++---------- ...rdware-mgr-never-run-72072580be4d6e7a.yaml | 7 ++++ 3 files changed, 31 insertions(+), 33 deletions(-) create mode 100644 releasenotes/notes/fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml diff --git a/ironic_python_agent/hardware_managers/cna.py b/ironic_python_agent/hardware_managers/cna.py index 6998422ae..2d49d9e03 100644 --- a/ironic_python_agent/hardware_managers/cna.py +++ b/ironic_python_agent/hardware_managers/cna.py @@ -69,29 +69,20 @@ def _disable_embedded_lldp_agent_in_cna_card(): .format(str(failed_dirs).strip('[]'))) -class IntelCnaHardwareManager(hardware.GenericHardwareManager): +class IntelCnaHardwareManager(hardware.HardwareManager): HARDWARE_MANAGER_NAME = 'IntelCnaHardwareManager' HARDWARE_MANAGER_VERSION = '1.0' def evaluate_hardware_support(self): if _detect_cna_card(): LOG.debug('Found Intel CNA network card') + # On Intel CNA cards, in order to make LLDP info collecting + # possible, the embedded LLDP agent, which runs inside that + # card, needs to be turned off. + if CONF.collect_lldp: + LOG.info('Disable CNA network card embedded lldp agent now') + _disable_embedded_lldp_agent_in_cna_card() return hardware.HardwareSupport.MAINLINE else: LOG.debug('No Intel CNA network card found') return hardware.HardwareSupport.NONE - - def collect_lldp_data(self, interface_names): - """Collect and convert LLDP info from the node. - - On Intel CNA cards, in order to make LLDP info collecting possible, - the embedded LLDP agent, which runs inside that card, needs to be - turned off. Then we can give the control back to the super class. - - :param interface_names: list of names of node's interfaces. - :return: a dict, containing the lldp data from every interface. - """ - - _disable_embedded_lldp_agent_in_cna_card() - return super(IntelCnaHardwareManager, self).collect_lldp_data( - interface_names) diff --git a/ironic_python_agent/tests/unit/hardware_managers/test_cna.py b/ironic_python_agent/tests/unit/hardware_managers/test_cna.py index 212942ce9..b38d6d203 100644 --- a/ironic_python_agent/tests/unit/hardware_managers/test_cna.py +++ b/ironic_python_agent/tests/unit/hardware_managers/test_cna.py @@ -118,13 +118,29 @@ class TestIntelCnaHardwareManager(base.IronicAgentTest): @mock.patch.object(cna, 'LOG', autospec=True) @mock.patch.object(cna, '_detect_cna_card', autospec=True) - def test_evaluate_hardware_support(self, mock_detect_card, mock_log): + def test_evaluate_hardware_support_with_collect_lldp_disabled( + self, mock_detect_card, mock_log): mock_detect_card.return_value = True expected_support = hardware.HardwareSupport.MAINLINE actual_support = self.hardware.evaluate_hardware_support() self.assertEqual(expected_support, actual_support) mock_log.debug.assert_called_once() + @mock.patch.object(cna, 'LOG', autospec=True) + @mock.patch.object(cna, '_detect_cna_card', autospec=True) + @mock.patch.object(cna, '_disable_embedded_lldp_agent_in_cna_card', + autospec=True) + def test_evaluate_hardware_support_with_collect_lldp_enabled( + self, mock_disable_lldp_agent, mock_detect_card, mock_log): + self.config(collect_lldp=True) + mock_detect_card.return_value = True + expected_support = hardware.HardwareSupport.MAINLINE + actual_support = self.hardware.evaluate_hardware_support() + self.assertEqual(expected_support, actual_support) + mock_log.debug.assert_called_once() + mock_log.info.assert_called_once() + mock_disable_lldp_agent.assert_called_once() + @mock.patch.object(cna, 'LOG', autospec=True) @mock.patch.object(cna, '_detect_cna_card', autospec=True) def test_evaluate_hardware_support_no_cna_card_detected(self, @@ -135,19 +151,3 @@ class TestIntelCnaHardwareManager(base.IronicAgentTest): actual_support = self.hardware.evaluate_hardware_support() self.assertEqual(expected_support, actual_support) mock_log.debug.assert_called_once() - - @mock.patch.object(hardware.GenericHardwareManager, 'collect_lldp_data', - autospec=True) - def test_collect_lldp_data(self, mock_super_collect): - iface_names = ['eth0', 'eth1'] - returned_lldp_data = [ - (0, 'foo'), - (1, 'bar'), - ] - mock_super_collect.return_value = returned_lldp_data - with mock.patch.object(cna, '_disable_embedded_lldp_agent_in_cna_card', - autospec=True): - result = self.hardware.collect_lldp_data(iface_names) - mock_super_collect.assert_called_once_with(self.hardware, - iface_names) - self.assertEqual(returned_lldp_data, result) diff --git a/releasenotes/notes/fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml b/releasenotes/notes/fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml new file mode 100644 index 000000000..28aaf1c4b --- /dev/null +++ b/releasenotes/notes/fix-mlnx-hardware-mgr-never-run-72072580be4d6e7a.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes an issue with the IntelCnaHardwareManager which prevented hardware + managers with lower priority to be executed and therefore may blocked the + initialization and collection of hardware these managers are supposed to take + care of.