summaryrefslogtreecommitdiff
path: root/ironic_python_agent/tests
diff options
context:
space:
mode:
authorAnnie Lezil <annie.lezil@gmail.com>2016-11-10 21:29:40 +0000
committerRamamani Yeleswarapu <ramamani.yeleswarapu@intel.com>2017-05-18 14:44:11 -0700
commitfdcb0922a5c4a4ecbb8cb1b307c6c750990699ff (patch)
tree20eaddc9e897b27d840e492acd9b999c6abd2e42 /ironic_python_agent/tests
parent15878b7b181098db7abb6601ada0e245b6722d46 (diff)
downloadironic-python-agent-fdcb0922a5c4a4ecbb8cb1b307c6c750990699ff.tar.gz
Collect NIC name given by BIOS
Adds an extra field ``biosdevname`` to network interface inventory collected by ``default`` inspection collector (which collects the whole inventory returned by hardware manager) of ironic-python-agent. This feature requires biosdevname utility to collect the bios given NIC names. The tooling module for tinyIPA is created for the same purpose. For CoreOS IPA pxe images, biosdevname tooling module is limited, because Docker repository is created and embedded into CoreOS pxe images. The Docker repository uses debian to download the packages. Debian does not have biosdevname package. Adds an export variable TINYIPA_REQUIRE_BIOSDEVNAME. Set this variable to ``true`` in your shell before building tinyIPA. Closes-Bug: #1635351 Change-Id: Ia96af59e2a74868cac59e5a88cfbb3be60d85687
Diffstat (limited to 'ironic_python_agent/tests')
-rw-r--r--ironic_python_agent/tests/unit/test_agent.py18
-rw-r--r--ironic_python_agent/tests/unit/test_hardware.py106
2 files changed, 114 insertions, 10 deletions
diff --git a/ironic_python_agent/tests/unit/test_agent.py b/ironic_python_agent/tests/unit/test_agent.py
index f2ede91c..204bfbab 100644
--- a/ironic_python_agent/tests/unit/test_agent.py
+++ b/ironic_python_agent/tests/unit/test_agent.py
@@ -385,15 +385,14 @@ class TestBaseAgent(ironic_agent_base.IronicAgentTest):
mock_dispatch.assert_has_calls(expected_dispatch_calls)
mock_sleep.assert_has_calls(expected_sleep_calls)
- @mock.patch('ironic_python_agent.hardware_managers.cna._detect_cna_card',
- autospec=True)
+ @mock.patch.object(hardware, 'load_managers', autospec=True)
@mock.patch.object(time, 'sleep', autospec=True)
- @mock.patch('wsgiref.simple_server.make_server', autospec=True)
- @mock.patch.object(hardware, '_check_for_iscsi', autospec=True)
- @mock.patch.object(hardware.HardwareManager, 'list_hardware_info',
+ @mock.patch.object(agent.IronicPythonAgent, '_wait_for_interface',
autospec=True)
- def test_run_with_sleep(self, mock_check_for_iscsi, mock_list_hardware,
- mock_make_server, mock_sleep, mock_cna):
+ @mock.patch.object(hardware, 'dispatch_to_managers', autospec=True)
+ @mock.patch('wsgiref.simple_server.make_server', autospec=True)
+ def test_run_with_sleep(self, mock_make_server, mock_dispatch,
+ mock_load_managers, mock_sleep, mock_wait):
CONF.set_override('inspection_callback_url', '', enforce_type=True)
wsgi_server = mock_make_server.return_value
wsgi_server.start.side_effect = KeyboardInterrupt()
@@ -409,7 +408,6 @@ class TestBaseAgent(ironic_agent_base.IronicAgentTest):
'heartbeat_timeout': 300
}
}
- mock_cna.return_value = False
self.agent.run()
listen_addr = agent.Host('192.0.2.1', 9999)
@@ -422,7 +420,9 @@ class TestBaseAgent(ironic_agent_base.IronicAgentTest):
self.agent.heartbeater.start.assert_called_once_with()
mock_sleep.assert_called_once_with(10)
- self.assertTrue(mock_check_for_iscsi.called)
+ self.assertTrue(mock_load_managers.called)
+ self.assertTrue(mock_wait.called)
+ mock_dispatch.assert_called_once_with('list_hardware_info')
def test_async_command_success(self):
result = base.AsyncCommandResult('foo_command', {'fail': False},
diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py
index b637cfae..7eb06bf6 100644
--- a/ironic_python_agent/tests/unit/test_hardware.py
+++ b/ironic_python_agent/tests/unit/test_hardware.py
@@ -378,7 +378,9 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('os.listdir', autospec=True)
@mock.patch('os.path.exists', autospec=True)
@mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_list_network_interfaces(self,
+ mocked_execute,
mocked_open,
mocked_exists,
mocked_listdir,
@@ -394,6 +396,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mocked_ifaddresses.return_value = {
netifaces.AF_INET: [{'addr': '192.168.1.2'}]
}
+ mocked_execute.return_value = ('em0\n', '')
interfaces = self.hardware.list_network_interfaces()
self.assertEqual(1, len(interfaces))
self.assertEqual('eth0', interfaces[0].name)
@@ -401,6 +404,92 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertEqual('192.168.1.2', interfaces[0].ipv4_address)
self.assertIsNone(interfaces[0].lldp)
self.assertTrue(interfaces[0].has_carrier)
+ self.assertEqual('em0', interfaces[0].biosdevname)
+
+ @mock.patch('ironic_python_agent.hardware._get_managers', autospec=True)
+ @mock.patch('netifaces.ifaddresses', autospec=True)
+ @mock.patch('os.listdir', autospec=True)
+ @mock.patch('os.path.exists', autospec=True)
+ @mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
+ def test_list_network_interfaces_with_biosdevname(self,
+ mocked_execute,
+ mocked_open,
+ mocked_exists,
+ mocked_listdir,
+ mocked_ifaddresses,
+ mocked_get_managers):
+ mocked_get_managers.return_value = [hardware.GenericHardwareManager()]
+ mocked_listdir.return_value = ['lo', 'eth0']
+ mocked_exists.side_effect = [False, True]
+ mocked_open.return_value.__enter__ = lambda s: s
+ mocked_open.return_value.__exit__ = mock.Mock()
+ read_mock = mocked_open.return_value.read
+ read_mock.side_effect = ['00:0c:29:8c:11:b1\n', '1']
+ mocked_ifaddresses.return_value = {
+ netifaces.AF_INET: [{'addr': '192.168.1.2'}]
+ }
+ mocked_execute.return_value = ('em0\n', '')
+
+ interfaces = self.hardware.list_network_interfaces()
+ self.assertEqual(1, len(interfaces))
+ self.assertEqual('eth0', interfaces[0].name)
+ self.assertEqual('00:0c:29:8c:11:b1', interfaces[0].mac_address)
+ self.assertEqual('192.168.1.2', interfaces[0].ipv4_address)
+ self.assertIsNone(interfaces[0].lldp)
+ self.assertTrue(interfaces[0].has_carrier)
+ self.assertEqual('em0', interfaces[0].biosdevname)
+
+ @mock.patch.object(utils, 'execute', autospec=True)
+ def test_get_bios_given_nic_name_ok(self, mock_execute):
+ interface_name = 'eth0'
+ mock_execute.return_value = ('em0\n', '')
+ result = self.hardware.get_bios_given_nic_name(interface_name)
+ self.assertEqual('em0', result)
+ mock_execute.assert_called_once_with('biosdevname', '-i',
+ interface_name)
+
+ @mock.patch.object(utils, 'execute', autospec=True)
+ def test_get_bios_given_nic_name_oserror(self, mock_execute):
+ interface_name = 'eth0'
+ mock_execute.side_effect = OSError()
+ result = self.hardware.get_bios_given_nic_name(interface_name)
+ self.assertIsNone(result)
+ mock_execute.assert_called_once_with('biosdevname', '-i',
+ interface_name)
+
+ @mock.patch.object(utils, 'execute', autospec=True)
+ @mock.patch.object(hardware, 'LOG', autospec=True)
+ def test_get_bios_given_nic_name_process_exec_err4(self, mock_log,
+ mock_execute):
+ interface_name = 'eth0'
+ mock_execute.side_effect = [
+ processutils.ProcessExecutionError(exit_code=4)]
+
+ result = self.hardware.get_bios_given_nic_name(interface_name)
+
+ mock_log.info.assert_called_once_with(
+ 'The system is a virtual machine, so biosdevname utility does '
+ 'not provide names for virtual NICs.')
+ self.assertIsNone(result)
+ mock_execute.assert_called_once_with('biosdevname', '-i',
+ interface_name)
+
+ @mock.patch.object(utils, 'execute', autospec=True)
+ @mock.patch.object(hardware, 'LOG', autospec=True)
+ def test_get_bios_given_nic_name_process_exec_err3(self, mock_log,
+ mock_execute):
+ interface_name = 'eth0'
+ mock_execute.side_effect = [
+ processutils.ProcessExecutionError(exit_code=3)]
+
+ result = self.hardware.get_bios_given_nic_name(interface_name)
+
+ mock_log.warning.assert_called_once_with(
+ 'Biosdevname returned exit code %s', 3)
+ self.assertIsNone(result)
+ mock_execute.assert_called_once_with('biosdevname', '-i',
+ interface_name)
@mock.patch('ironic_python_agent.hardware._get_managers', autospec=True)
@mock.patch('ironic_python_agent.netutils.get_lldp_info', autospec=True)
@@ -408,7 +497,9 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('os.listdir', autospec=True)
@mock.patch('os.path.exists', autospec=True)
@mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_list_network_interfaces_with_lldp(self,
+ mocked_execute,
mocked_open,
mocked_exists,
mocked_listdir,
@@ -432,6 +523,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
(2, b'\x05Ethernet1/18'),
(3, b'\x00x')]
}
+ mocked_execute.return_value = ('em0\n', '')
interfaces = self.hardware.list_network_interfaces()
self.assertEqual(1, len(interfaces))
self.assertEqual('eth0', interfaces[0].name)
@@ -445,6 +537,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
]
self.assertEqual(expected_lldp_info, interfaces[0].lldp)
self.assertTrue(interfaces[0].has_carrier)
+ self.assertEqual('em0', interfaces[0].biosdevname)
@mock.patch('ironic_python_agent.hardware._get_managers', autospec=True)
@mock.patch('ironic_python_agent.netutils.get_lldp_info', autospec=True)
@@ -452,8 +545,9 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch('os.listdir', autospec=True)
@mock.patch('os.path.exists', autospec=True)
@mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_list_network_interfaces_with_lldp_error(
- self, mocked_open, mocked_exists, mocked_listdir,
+ self, mocked_execute, mocked_open, mocked_exists, mocked_listdir,
mocked_ifaddresses, mocked_lldp_info, mocked_get_managers):
mocked_get_managers.return_value = [hardware.GenericHardwareManager()]
CONF.set_override('collect_lldp', True)
@@ -467,6 +561,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
netifaces.AF_INET: [{'addr': '192.168.1.2'}]
}
mocked_lldp_info.side_effect = Exception('Boom!')
+ mocked_execute.return_value = ('em0\n', '')
interfaces = self.hardware.list_network_interfaces()
self.assertEqual(1, len(interfaces))
self.assertEqual('eth0', interfaces[0].name)
@@ -474,13 +569,16 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertEqual('192.168.1.2', interfaces[0].ipv4_address)
self.assertIsNone(interfaces[0].lldp)
self.assertTrue(interfaces[0].has_carrier)
+ self.assertEqual('em0', interfaces[0].biosdevname)
@mock.patch('ironic_python_agent.hardware._get_managers', autospec=True)
@mock.patch('netifaces.ifaddresses', autospec=True)
@mock.patch('os.listdir', autospec=True)
@mock.patch('os.path.exists', autospec=True)
@mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_list_network_interfaces_no_carrier(self,
+ mocked_execute,
mocked_open,
mocked_exists,
mocked_listdir,
@@ -497,6 +595,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mocked_ifaddresses.return_value = {
netifaces.AF_INET: [{'addr': '192.168.1.2'}]
}
+ mocked_execute.return_value = ('em0\n', '')
interfaces = self.hardware.list_network_interfaces()
self.assertEqual(1, len(interfaces))
self.assertEqual('eth0', interfaces[0].name)
@@ -504,13 +603,16 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertEqual('192.168.1.2', interfaces[0].ipv4_address)
self.assertFalse(interfaces[0].has_carrier)
self.assertIsNone(interfaces[0].vendor)
+ self.assertEqual('em0', interfaces[0].biosdevname)
@mock.patch('ironic_python_agent.hardware._get_managers', autospec=True)
@mock.patch('netifaces.ifaddresses', autospec=True)
@mock.patch('os.listdir', autospec=True)
@mock.patch('os.path.exists', autospec=True)
@mock.patch('six.moves.builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
def test_list_network_interfaces_with_vendor_info(self,
+ mocked_execute,
mocked_open,
mocked_exists,
mocked_listdir,
@@ -527,6 +629,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mocked_ifaddresses.return_value = {
netifaces.AF_INET: [{'addr': '192.168.1.2'}]
}
+ mocked_execute.return_value = ('em0\n', '')
interfaces = self.hardware.list_network_interfaces()
self.assertEqual(1, len(interfaces))
self.assertEqual('eth0', interfaces[0].name)
@@ -535,6 +638,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
self.assertTrue(interfaces[0].has_carrier)
self.assertEqual('0x15b3', interfaces[0].vendor)
self.assertEqual('0x1014', interfaces[0].product)
+ self.assertEqual('em0', interfaces[0].biosdevname)
@mock.patch.object(hardware, 'get_cached_node', autospec=True)
@mock.patch.object(utils, 'execute', autospec=True)