summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/sources/DataSourceScaleway.py3
-rw-r--r--cloudinit/sources/__init__.py6
-rw-r--r--cloudinit/sources/tests/test_init.py15
-rw-r--r--tests/unittests/test_datasource/test_scaleway.py7
4 files changed, 27 insertions, 4 deletions
diff --git a/cloudinit/sources/DataSourceScaleway.py b/cloudinit/sources/DataSourceScaleway.py
index b573b382..54bfc1fe 100644
--- a/cloudinit/sources/DataSourceScaleway.py
+++ b/cloudinit/sources/DataSourceScaleway.py
@@ -171,10 +171,11 @@ def query_data_api(api_type, api_address, retries, timeout):
class DataSourceScaleway(sources.DataSource):
dsname = "Scaleway"
- update_events = {'network': [EventType.BOOT_NEW_INSTANCE, EventType.BOOT]}
def __init__(self, sys_cfg, distro, paths):
super(DataSourceScaleway, self).__init__(sys_cfg, distro, paths)
+ self.update_events = {
+ 'network': {EventType.BOOT_NEW_INSTANCE, EventType.BOOT}}
self.ds_cfg = util.mergemanydict([
util.get_cfg_by_path(sys_cfg, ["datasource", "Scaleway"], {}),
diff --git a/cloudinit/sources/__init__.py b/cloudinit/sources/__init__.py
index e6966b31..1604932d 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': {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 6378e98b..cb1912be 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):
diff --git a/tests/unittests/test_datasource/test_scaleway.py b/tests/unittests/test_datasource/test_scaleway.py
index f96bf0a2..3bfd7527 100644
--- a/tests/unittests/test_datasource/test_scaleway.py
+++ b/tests/unittests/test_datasource/test_scaleway.py
@@ -7,6 +7,7 @@ import requests
from cloudinit import helpers
from cloudinit import settings
+from cloudinit.event import EventType
from cloudinit.sources import DataSourceScaleway
from cloudinit.tests.helpers import mock, HttprettyTestCase, CiTestCase
@@ -403,3 +404,9 @@ class TestDataSourceScaleway(HttprettyTestCase):
netcfg = self.datasource.network_config
self.assertEqual(netcfg, '0xdeadbeef')
+
+ def test_update_events_is_correct(self):
+ """ensure update_events contains correct data"""
+ self.assertEqual(
+ {'network': {EventType.BOOT_NEW_INSTANCE, EventType.BOOT}},
+ self.datasource.update_events)