← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~daniel-thewatkins/cloud-init/+git/cloud-init:ds_update_events into cloud-init:master

 

Dan Watkins has proposed merging ~daniel-thewatkins/cloud-init/+git/cloud-init:ds_update_events into cloud-init:master.

Requested reviews:
  cloud-init commiters (cloud-init-dev)
Related bugs:
  Bug #1819913 in cloud-init: "cloud-init on xenial may generate network config on every boot"
  https://bugs.launchpad.net/cloud-init/+bug/1819913

For more details, see:
https://code.launchpad.net/~daniel-thewatkins/cloud-init/+git/cloud-init/+merge/364464
-- 
Your team cloud-init commiters is requested to review the proposed merge of ~daniel-thewatkins/cloud-init/+git/cloud-init:ds_update_events into cloud-init:master.
diff --git a/cloudinit/sources/__init__.py b/cloudinit/sources/__init__.py
index e6966b3..a3446e7 100644
--- a/cloudinit/sources/__init__.py
+++ b/cloudinit/sources/__init__.py
@@ -164,9 +164,6 @@ class DataSource(object):
     # A datasource which supports writing network config on each system boot
     # would call update_events['network'].add(EventType.BOOT).
 
-    # Default: generate network config on new instance id (first boot).
-    update_events = {'network': set([EventType.BOOT_NEW_INSTANCE])}
-
     # N-tuple listing default values for any metadata-related class
     # attributes cached on an instance by a process_data runs. These attribute
     # values are reset via clear_cached_attrs during any update_metadata call.
@@ -191,6 +188,9 @@ class DataSource(object):
         self.vendordata = None
         self.vendordata_raw = None
 
+        # Default: generate network config on new instance id (first boot).
+        self.update_events = {'network': set([EventType.BOOT_NEW_INSTANCE])}
+
         self.ds_cfg = util.get_cfg_by_path(
             self.sys_cfg, ("datasource", self.dsname), {})
         if not self.ds_cfg:
diff --git a/cloudinit/sources/tests/test_init.py b/cloudinit/sources/tests/test_init.py
index 6378e98..cb1912b 100644
--- a/cloudinit/sources/tests/test_init.py
+++ b/cloudinit/sources/tests/test_init.py
@@ -575,6 +575,21 @@ class TestDataSource(CiTestCase):
             " events: New instance first boot",
             self.logs.getvalue())
 
+    def test_data_sources_cant_mutate_update_events_for_others(self):
+        """update_events shouldn't be changed for other DSes (LP: #1819913)"""
+
+        class ModifyingDS(DataSource):
+
+            def __init__(self, sys_cfg, distro, paths):
+                # This mirrors what DataSourceAzure does which causes LP:
+                # #1819913
+                DataSource.__init__(self, sys_cfg, distro, paths)
+                self.update_events['network'].add(EventType.BOOT)
+
+        before_update_events = copy.deepcopy(self.datasource.update_events)
+        ModifyingDS(self.sys_cfg, self.distro, self.paths)
+        self.assertEqual(before_update_events, self.datasource.update_events)
+
 
 class TestRedactSensitiveData(CiTestCase):
 

Follow ups