summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Falcon <james.falcon@canonical.com>2023-02-02 10:13:08 -0600
committerGitHub <noreply@github.com>2023-02-02 09:13:08 -0700
commit4610833d1e9a0839321f84bbc3c8d27ff19a17f2 (patch)
treee9072206c14c6034d6a03d370d98c211368a8a48
parent80931b531aa992b5bde355f26321c2b402c68c6f (diff)
downloadcloud-init-git-4610833d1e9a0839321f84bbc3c8d27ff19a17f2.tar.gz
Ignore duplicate macs from mscc_felix and fsl_enetc
mscc_felix and fsl_enetc are drivers representing a switch that is expected to have duplicate macs. If we encounter either of these drivers, we should not raise the duplicate mac exception. LP: #1997922
-rw-r--r--cloudinit/net/__init__.py16
-rw-r--r--tests/unittests/test_net.py20
2 files changed, 36 insertions, 0 deletions
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py
index 0a41a2d4..50e445ec 100644
--- a/cloudinit/net/__init__.py
+++ b/cloudinit/net/__init__.py
@@ -1034,6 +1034,22 @@ def get_interfaces_by_mac_on_linux(blacklist_drivers=None) -> dict:
% (ret[mac], driver_map[mac], name)
)
+ # This is intended to be a short-term fix of LP: #1997922
+ # Long term, we should better handle configuration of virtual
+ # devices where duplicate MACs are expected early in boot if
+ # cloud-init happens to enumerate network interfaces before drivers
+ # have fully initialized the leader/subordinate relationships for
+ # those devices or switches.
+ if driver == "mscc_felix" or driver == "fsl_enetc":
+ LOG.debug(
+ "Ignoring duplicate macs from '%s' and '%s' due to "
+ "driver '%s'.",
+ name,
+ ret[mac],
+ driver,
+ )
+ continue
+
if raise_duplicate_mac_error:
raise RuntimeError(msg)
diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py
index ec9d76b0..056aaeb6 100644
--- a/tests/unittests/test_net.py
+++ b/tests/unittests/test_net.py
@@ -34,6 +34,7 @@ from tests.unittests.helpers import (
CiTestCase,
FilesystemMockingTestCase,
dir2dict,
+ does_not_raise,
mock,
populate_dir,
)
@@ -8008,6 +8009,7 @@ class TestInterfaceHasOwnMac(CiTestCase):
mock.Mock(return_value=False),
)
class TestGetInterfacesByMac(CiTestCase):
+ with_logs = True
_data = {
"bonds": ["bond1"],
"bridges": ["bridge1"],
@@ -8220,6 +8222,24 @@ class TestGetInterfacesByMac(CiTestCase):
}
self.assertEqual(expected, result)
+ def test_duplicate_ignored_macs(self):
+ # LP: #199792
+ self._data = copy.deepcopy(self._data)
+ self._data["macs"]["swp0"] = "9a:57:7d:78:47:c0"
+ self._data["macs"]["swp1"] = "9a:57:7d:78:47:c0"
+ self._data["own_macs"].append("swp0")
+ self._data["own_macs"].append("swp1")
+ self._data["drivers"]["swp0"] = "mscc_felix"
+ self._data["drivers"]["swp1"] = "mscc_felix"
+ self._mock_setup()
+ with does_not_raise():
+ net.get_interfaces_by_mac()
+ pattern = (
+ "Ignoring duplicate macs from 'swp[0-1]' and 'swp[0-1]' due to "
+ "driver 'mscc_felix'."
+ )
+ assert re.search(pattern, self.logs.getvalue())
+
class TestInterfacesSorting(CiTestCase):
def test_natural_order(self):