More details, this is a upstream bug due to a cloudinit/stages creating a copy 
of the distro instance based on re-reading and updating distro config from disk 
if unset in Init
https://github.com/canonical/cloud-init/blob/master/cloudinit/stages.py#L91-L96


The two problems upstream are that are:
 1.  cloudinit/distros/networking.py get_interfaces_by_mac doesn't honor 
blacklist_drivers from a datasource
 2. DataSourceAzure sets blacklist_drivers on 
DataSourceAzure.distro.networking.blacklist_drivers during _get_data.
 3. stages.py also does not copy blacklist_drivers into a newly instantiated 
distro instance on the found datasource.
 

This will only affect older kernels like 4.4 because any newer kernels
surface a sysfs "master" links in SRIOV devices so cloud-init ignores
them by default so no duplicate mac errors are seen.

The following diff resolves this for Azure on 4.4 FIPS kernel.

I'll have to talk with the team about how best to support this on Xenial
PRO images.


diff --git a/cloudinit/distros/networking.py b/cloudinit/distros/networking.py
index c291196a..471d7e52 100644
--- a/cloudinit/distros/networking.py
+++ b/cloudinit/distros/networking.py
@@ -71,7 +71,7 @@ class Networking(metaclass=abc.ABCMeta):
     def get_interfaces(self) -> list:
         return net.get_interfaces()
 
-    def get_interfaces_by_mac(self) -> dict:
+    def get_interfaces_by_mac(self, *, blacklist_drivers=None) -> dict:
         return net.get_interfaces_by_mac(
             blacklist_drivers=self.blacklist_drivers)
 
@@ -144,7 +144,9 @@ class Networking(metaclass=abc.ABCMeta):
         expected_macs = set(expected_ifaces.keys())
 
         # set of current macs
-        present_macs = self.get_interfaces_by_mac().keys()
+        present_macs = self.get_interfaces_by_mac(
+            blacklist_drivers=self.blacklist_drivers
+        ).keys()
 
         # compare the set of expected mac address values to
         # the current macs present; we only check MAC as cloud-init
diff --git a/cloudinit/sources/DataSourceAzure.py 
b/cloudinit/sources/DataSourceAzure.py
index dcdf9f8f..0069bd0a 100755
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -344,6 +344,7 @@ class DataSourceAzure(sources.DataSource):
         EventType.BOOT,
         EventType.BOOT_LEGACY
     }}
+    blacklist_drivers = BLACKLIST_DRIVERS
 
     _negotiated = False
     _metadata_imds = sources.UNSET
@@ -626,7 +627,7 @@ class DataSourceAzure(sources.DataSource):
         except Exception as e:
             LOG.warning("Failed to get system information: %s", e)
 
-        self.distro.networking.blacklist_drivers = BLACKLIST_DRIVERS
+        self.distro.networking.blacklist_drivers = self.blacklist_drivers
 
         try:
             crawled_data = util.log_time(
diff --git a/cloudinit/stages.py b/cloudinit/stages.py
index bbded1e9..cc7619b3 100644
--- a/cloudinit/stages.py
+++ b/cloudinit/stages.py
@@ -92,6 +92,14 @@ class Init(object):
             # said datasource and move its distro/system config
             # from whatever it was to a new set...
             if self.datasource is not NULL_DATA_SOURCE:
+                # Certain datasources exclude network devices based
+                # on the corresponding driver (Azure SRIOV).
+                # When copying in a new distro, reset the
+                # blacklist_drivers for networking config generation.
+                if hasattr(self.datasource, "blacklist_drivers"):
+                    self._distro.networking.blacklist_drivers = getattr(
+                        self.datasource, "blacklist_drivers"
+                    )
                 self.datasource.distro = self._distro
                 self.datasource.sys_cfg = self.cfg
         return self._distro

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1927124

Title:
  Azure/Xenial Pro FIPS: RuntimeError: duplicate mac found!

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/cloud-init/+bug/1927124/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to