From 913e4cebb2bdb96dad0562a09926d9aed76eaf13 Mon Sep 17 00:00:00 2001 From: Nisha Agarwal Date: Mon, 8 Oct 2018 17:13:29 -0700 Subject: [PATCH] Log a warning for Gen8 Inspection This patch adds a warning for Prolaint Gen8 server's NIC inspection. The proliantutils will start returning only active NICs starting this patch Ica624aae8f956a2da061801def6ddc43152a5b09. story: #2004950 task: #29366 Depends-On: Ica624aae8f956a2da061801def6ddc43152a5b09 Change-Id: I71feefa3d0593fd185a286bec4ce38607203641d --- ironic/drivers/modules/ilo/inspect.py | 17 ++++ .../unit/drivers/modules/ilo/test_inspect.py | 90 ++++++++++++++++++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/ironic/drivers/modules/ilo/inspect.py b/ironic/drivers/modules/ilo/inspect.py index ee4e5c7ba5..2a350f6169 100644 --- a/ironic/drivers/modules/ilo/inspect.py +++ b/ironic/drivers/modules/ilo/inspect.py @@ -233,7 +233,9 @@ class IloInspect(base.InspectInterface): # hardwares, the method inspect_hardware() doesn't raise an error # for these capabilities. capabilities = _get_capabilities(task.node, ilo_object) + model = None if capabilities: + model = capabilities.get('server_model') valid_cap = _create_supported_capabilities_dict(capabilities) capabilities = utils.get_updated_capabilities( task.node.properties.get('capabilities'), valid_cap) @@ -241,6 +243,21 @@ class IloInspect(base.InspectInterface): node_properties['capabilities'] = capabilities task.node.properties = node_properties + # RIBCL(Gen8) protocol cannot determine if a NIC + # is physically connected with cable or not when the server + # is not provisioned. However it is possible to determine + # the same using RIS(Gen9) and Redfish(Gen10) protocols. + # Hence proliantutils return ALL MACs for Gen8 while returns + # only active MACs for Gen9 and Gen10. A warning is been added + # for the user so that he knows that he needs to remove the + # ironic ports created for inactive ports for Gen8. + if model is not None and 'Gen8' in model: + LOG.warning('iLO cannot determine if the NICs are physically ' + 'connected or not for ProLiant Gen8 servers. ' + 'Hence returns all the MACs present on the server. ' + 'Please remove the ironic ports created for inactive ' + 'NICs manually for the node %(node)', + {"node": task.node.uuid}) task.node.save() # Create ports for the nics detected. diff --git a/ironic/tests/unit/drivers/modules/ilo/test_inspect.py b/ironic/tests/unit/drivers/modules/ilo/test_inspect.py index f32a34bb90..bc2b92e61c 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_inspect.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_inspect.py @@ -68,7 +68,7 @@ class IloInspectTestCase(test_common.BaseIloTest): properties = {'memory_mb': '512', 'local_gb': '10', 'cpus': '1', 'cpu_arch': 'x86_64'} macs = {'Port 1': 'aa:aa:aa:aa:aa:aa', 'Port 2': 'bb:bb:bb:bb:bb:bb'} - capabilities = '' + capabilities = {} result = {'properties': properties, 'macs': macs} get_essential_mock.return_value = result get_capabilities_mock.return_value = capabilities @@ -106,7 +106,7 @@ class IloInspectTestCase(test_common.BaseIloTest): properties = {'memory_mb': '512', 'local_gb': 0, 'cpus': '1', 'cpu_arch': 'x86_64'} macs = {'Port 1': 'aa:aa:aa:aa:aa:aa', 'Port 2': 'bb:bb:bb:bb:bb:bb'} - capabilities = '' + capabilities = {} result = {'properties': properties, 'macs': macs} get_essential_mock.return_value = result get_capabilities_mock.return_value = capabilities @@ -129,6 +129,90 @@ class IloInspectTestCase(test_common.BaseIloTest): ilo_object_mock) create_port_mock.assert_called_once_with(task, macs) + @mock.patch.object(ilo_inspect.LOG, 'warning', + spec_set=True, autospec=True) + @mock.patch.object(ilo_inspect, '_get_capabilities', spec_set=True, + autospec=True) + @mock.patch.object(inspect_utils, 'create_ports_if_not_exist', + spec_set=True, autospec=True) + @mock.patch.object(ilo_inspect, '_get_essential_properties', spec_set=True, + autospec=True) + @mock.patch.object(ilo_power.IloPower, 'get_power_state', spec_set=True, + autospec=True) + @mock.patch.object(ilo_common, 'get_ilo_object', spec_set=True, + autospec=True) + def test_inspect_ok_gen8(self, get_ilo_object_mock, + power_mock, + get_essential_mock, + create_port_mock, + get_capabilities_mock, + log_mock): + ilo_object_mock = get_ilo_object_mock.return_value + properties = {'memory_mb': '512', 'local_gb': 10, + 'cpus': '1', 'cpu_arch': 'x86_64'} + macs = {'Port 1': 'aa:aa:aa:aa:aa:aa', 'Port 2': 'bb:bb:bb:bb:bb:bb'} + capabilities = {'server_model': 'Gen8'} + result = {'properties': properties, 'macs': macs} + get_essential_mock.return_value = result + get_capabilities_mock.return_value = capabilities + power_mock.return_value = states.POWER_ON + with task_manager.acquire(self.context, self.node.uuid, + shared=False) as task: + expected_properties = {'memory_mb': '512', 'local_gb': 10, + 'cpus': '1', 'cpu_arch': 'x86_64', + 'capabilities': 'server_model:Gen8'} + task.driver.inspect.inspect_hardware(task) + self.assertEqual(expected_properties, task.node.properties) + power_mock.assert_called_once_with(mock.ANY, task) + get_essential_mock.assert_called_once_with(task.node, + ilo_object_mock) + self.assertTrue(log_mock.called) + get_capabilities_mock.assert_called_once_with(task.node, + ilo_object_mock) + create_port_mock.assert_called_once_with(task, macs) + + @mock.patch.object(ilo_inspect.LOG, 'warning', + spec_set=True, autospec=True) + @mock.patch.object(ilo_inspect, '_get_capabilities', spec_set=True, + autospec=True) + @mock.patch.object(inspect_utils, 'create_ports_if_not_exist', + spec_set=True, autospec=True) + @mock.patch.object(ilo_inspect, '_get_essential_properties', spec_set=True, + autospec=True) + @mock.patch.object(ilo_power.IloPower, 'get_power_state', spec_set=True, + autospec=True) + @mock.patch.object(ilo_common, 'get_ilo_object', spec_set=True, + autospec=True) + def test_inspect_ok_gen9(self, get_ilo_object_mock, + power_mock, + get_essential_mock, + create_port_mock, + get_capabilities_mock, + log_mock): + ilo_object_mock = get_ilo_object_mock.return_value + properties = {'memory_mb': '512', 'local_gb': 10, + 'cpus': '1', 'cpu_arch': 'x86_64'} + macs = {'NIC.LOM.1.1': 'aa:aa:aa:aa:aa:aa'} + capabilities = {'server_model': 'Gen9'} + result = {'properties': properties, 'macs': macs} + get_essential_mock.return_value = result + get_capabilities_mock.return_value = capabilities + power_mock.return_value = states.POWER_ON + with task_manager.acquire(self.context, self.node.uuid, + shared=False) as task: + expected_properties = {'memory_mb': '512', 'local_gb': 10, + 'cpus': '1', 'cpu_arch': 'x86_64', + 'capabilities': 'server_model:Gen9'} + task.driver.inspect.inspect_hardware(task) + self.assertEqual(expected_properties, task.node.properties) + power_mock.assert_called_once_with(mock.ANY, task) + get_essential_mock.assert_called_once_with(task.node, + ilo_object_mock) + self.assertFalse(log_mock.called) + get_capabilities_mock.assert_called_once_with(task.node, + ilo_object_mock) + create_port_mock.assert_called_once_with(task, macs) + @mock.patch.object(ilo_inspect, '_get_capabilities', spec_set=True, autospec=True) @mock.patch.object(inspect_utils, 'create_ports_if_not_exist', @@ -151,7 +235,7 @@ class IloInspectTestCase(test_common.BaseIloTest): properties = {'memory_mb': '512', 'local_gb': '10', 'cpus': '1', 'cpu_arch': 'x86_64'} macs = {'Port 1': 'aa:aa:aa:aa:aa:aa', 'Port 2': 'bb:bb:bb:bb:bb:bb'} - capabilities = '' + capabilities = {} result = {'properties': properties, 'macs': macs} get_essential_mock.return_value = result get_capabilities_mock.return_value = capabilities