From 1ab405b5095975c3cf1334477fd40f738f7105b8 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Wed, 7 Apr 2021 17:15:10 +0200 Subject: [PATCH] Do not fail network interface collection on unsupported interface Currently if one interface cannot be handled (e.g. it has empty MAC), the whole collection fails. Ignore unsupported interfaces instead. Change-Id: Ibdaad62b39c239d4f3fb3111c2fae9e31e877b28 --- ironic_python_agent/hardware.py | 9 +++++++-- ironic_python_agent/tests/unit/test_hardware.py | 11 +++++++---- releasenotes/notes/no-mac-54616606ee6b844d.yaml | 5 +++++ 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/no-mac-54616606ee6b844d.yaml diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py index e58da8c6e..abda1f1a1 100644 --- a/ironic_python_agent/hardware.py +++ b/ironic_python_agent/hardware.py @@ -1100,8 +1100,13 @@ class GenericHardwareManager(HardwareManager): interface_names=iface_names) for iface_name in iface_names: - result = dispatch_to_managers( - 'get_interface_info', interface_name=iface_name) + try: + result = dispatch_to_managers( + 'get_interface_info', interface_name=iface_name) + except errors.HardwareManagerMethodNotFound: + LOG.warning('No hardware manager was able to handle ' + 'interface %s', iface_name) + continue result.lldp = self._get_lldp_data(iface_name) network_interfaces_list.append(result) diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py index 086080be7..4135985e0 100644 --- a/ironic_python_agent/tests/unit/test_hardware.py +++ b/ironic_python_agent/tests/unit/test_hardware.py @@ -238,8 +238,8 @@ class TestGenericHardwareManager(base.IronicAgentTest): mocked_ifaddresses, mockedget_managers): mockedget_managers.return_value = [hardware.GenericHardwareManager()] - mocked_listdir.return_value = ['lo', 'eth0'] - mocked_exists.side_effect = [False, True] + mocked_listdir.return_value = ['lo', 'eth0', 'foobar'] + mocked_exists.side_effect = [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 @@ -249,8 +249,11 @@ class TestGenericHardwareManager(base.IronicAgentTest): netifaces.AF_INET6: [{'addr': 'fd00::101'}] } mocked_execute.return_value = ('em0\n', '') - mock_get_mac.mock_has_carrier = True - mock_get_mac.return_value = '00:0c:29:8c:11:b1' + 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('eth0', interfaces[0].name) diff --git a/releasenotes/notes/no-mac-54616606ee6b844d.yaml b/releasenotes/notes/no-mac-54616606ee6b844d.yaml new file mode 100644 index 000000000..19933cc88 --- /dev/null +++ b/releasenotes/notes/no-mac-54616606ee6b844d.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + No longer crashes if MAC address cannot be determined for one of the + network interfaces.