summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Higgins <derekh@redhat.com>2022-06-16 14:59:07 +0100
committerRiccardo Pittau <elfosardo@gmail.com>2022-07-13 14:50:28 +0200
commit3bf414ed6aa5ac4b87b2b1cbb1c71b651e9b19a9 (patch)
tree85b8859f55300badadc91f41f9b18b349362c912
parent5e85e5e838c4f50a75b3e887e700a050fbb82a0e (diff)
downloadironic-python-agent-3bf414ed6aa5ac4b87b2b1cbb1c71b651e9b19a9.tar.gz
Gather details about bond interfaces if present
If present gather information about bonded interfaces. Story: #2010093 Task: #45637 Change-Id: I394187640b4788ebec21c3391d33ed728fb72ffa (cherry picked from commit 7e4fe3bf6a2ae41656b7923796f9c2d056a2ed04)
-rw-r--r--ironic_python_agent/hardware.py8
-rw-r--r--ironic_python_agent/tests/unit/test_hardware.py64
-rw-r--r--releasenotes/notes/findbonds-733c7c91a5665b05.yaml5
3 files changed, 66 insertions, 11 deletions
diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py
index 60e3bc0b..36cea983 100644
--- a/ironic_python_agent/hardware.py
+++ b/ironic_python_agent/hardware.py
@@ -1237,11 +1237,17 @@ class GenericHardwareManager(HardwareManager):
return vlan.isdigit()
+ def _is_bond(self, interface_name):
+ device_path = '{}/class/net/{}/bonding'.format(self.sys_path,
+ interface_name)
+ return os.path.exists(device_path)
+
def list_network_interfaces(self):
network_interfaces_list = []
iface_names = os.listdir('{}/class/net'.format(self.sys_path))
iface_names = [name for name in iface_names
- if self._is_vlan(name) or self._is_device(name)]
+ if self._is_vlan(name) or self._is_device(name)
+ or self._is_bond(name)]
if CONF.collect_lldp:
self.lldp_data = dispatch_to_managers('collect_lldp_data',
diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py
index 8c4050da..7a3b525d 100644
--- a/ironic_python_agent/tests/unit/test_hardware.py
+++ b/ironic_python_agent/tests/unit/test_hardware.py
@@ -246,7 +246,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
mocked_listdir.return_value = ['lo', 'eth0', 'foobar']
- mocked_exists.side_effect = [False, True, True]
+ mocked_exists.side_effect = [False, False, True, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -290,7 +290,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -385,7 +385,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
CONF.set_override('collect_lldp', True)
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -435,7 +435,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
CONF.set_override('collect_lldp', True)
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -478,7 +478,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -519,7 +519,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -551,6 +551,50 @@ class TestGenericHardwareManager(base.IronicAgentTest):
@mock.patch.object(utils, 'execute', autospec=True)
@mock.patch.object(netutils, 'get_mac_addr', autospec=True)
@mock.patch.object(netutils, 'interface_has_carrier', autospec=True)
+ def test_list_network_interfaces_with_bond(self,
+ mock_has_carrier,
+ mock_get_mac,
+ mocked_execute,
+ mocked_open,
+ mocked_exists,
+ mocked_listdir,
+ mocked_ifaddresses,
+ mockedget_managers):
+ mockedget_managers.return_value = [hardware.GenericHardwareManager()]
+ mocked_listdir.return_value = ['lo', 'bond0']
+ mocked_exists.side_effect = [False, 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 = ['1']
+ mocked_ifaddresses.return_value = {
+ netifaces.AF_INET: [{'addr': '192.168.1.2'}],
+ netifaces.AF_INET6: [{'addr': 'fd00::101'}]
+ }
+ mocked_execute.return_value = ('\n', '')
+ mock_has_carrier.return_value = True
+ mock_get_mac.side_effect = [
+ '00:0c:29:8c:11:b1',
+ None,
+ ]
+ interfaces = self.hardware.list_network_interfaces()
+ self.assertEqual(1, len(interfaces))
+ self.assertEqual('bond0', 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.assertEqual('fd00::101', interfaces[0].ipv6_address)
+ self.assertIsNone(interfaces[0].lldp)
+ self.assertTrue(interfaces[0].has_carrier)
+ self.assertEqual('', 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('builtins.open', autospec=True)
+ @mock.patch.object(utils, 'execute', autospec=True)
+ @mock.patch.object(netutils, 'get_mac_addr', autospec=True)
+ @mock.patch.object(netutils, 'interface_has_carrier', autospec=True)
def test_list_network_vlan_interfaces(self,
mock_has_carrier,
mock_get_mac,
@@ -563,7 +607,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
mockedget_managers.return_value = [hardware.GenericHardwareManager()]
CONF.set_override('enable_vlan_interfaces', 'eth0.100')
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True, False]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -610,7 +654,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
CONF.set_override('enable_vlan_interfaces', 'eth0')
mocked_listdir.return_value = ['lo', 'eth0']
mocked_execute.return_value = ('em0\n', '')
- mocked_exists.side_effect = [False, True, False]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -662,7 +706,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
CONF.set_override('collect_lldp', True)
CONF.set_override('enable_vlan_interfaces', 'enp0s1')
mocked_listdir.return_value = ['lo', 'eth0']
- mocked_exists.side_effect = [False, True, False]
+ mocked_exists.side_effect = [False, False, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
@@ -699,7 +743,7 @@ class TestGenericHardwareManager(base.IronicAgentTest):
CONF.set_override('enable_vlan_interfaces', 'all')
mocked_listdir.return_value = ['lo', 'eth0', 'eth1']
mocked_execute.return_value = ('em0\n', '')
- mocked_exists.side_effect = [False, True, True]
+ mocked_exists.side_effect = [False, False, True, True]
mocked_open.return_value.__enter__ = lambda s: s
mocked_open.return_value.__exit__ = mock.Mock()
read_mock = mocked_open.return_value.read
diff --git a/releasenotes/notes/findbonds-733c7c91a5665b05.yaml b/releasenotes/notes/findbonds-733c7c91a5665b05.yaml
new file mode 100644
index 00000000..d1161cf6
--- /dev/null
+++ b/releasenotes/notes/findbonds-733c7c91a5665b05.yaml
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Fixes GenericHardwareManager to find network information
+ for bonded interfaces if they exist.