summaryrefslogtreecommitdiff
path: root/cloudinit/stages.py
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2018-07-01 16:46:23 -0600
committerChad Smith <chad.smith@canonical.com>2018-07-01 16:46:23 -0600
commitbe9ecc12823607b4709b64408aee137bfdfc7d01 (patch)
tree808ef44d9de159bf3307f95e1f8e2d6d600c7e91 /cloudinit/stages.py
parent5858136215753cffc2080c85429a3c7a3754741c (diff)
downloadvyos-cloud-init-be9ecc12823607b4709b64408aee137bfdfc7d01.tar.gz
vyos-cloud-init-be9ecc12823607b4709b64408aee137bfdfc7d01.zip
update_metadata: a datasource can support network re-config every boot
Very basic type definitions are now defined to distinguish 'boot' events from 'new instance (first boot)'. Event types will now be handed to a datasource.update_metadata method which can determine whether to refresh its metadata and re-render configuration based on that source event. A datasource can 'subscribe' to an event by setting up the update_events attribute on the datasource class which describe what config scope is updated by a list of matching events. By default datasources will have the following update_events: {'network': [EventType.BOOT_NEW_INSTANCE]} This setting says the datasource will re-write network configuration only on first boot of a new instance or when the instance id changes. New methods are now present on the datasource: - clear_cached_attrs: Resets cached datasource attributes to values listed in datasource.cached_attr_defaults. This is performed prior to processing a fresh metadata process to avoid keeping old/invalid cached data around. - update_metadata: accepts source_event_types to determine if the metadata should be crawled again and processed
Diffstat (limited to 'cloudinit/stages.py')
-rw-r--r--cloudinit/stages.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/cloudinit/stages.py b/cloudinit/stages.py
index 286607bf..c132b57d 100644
--- a/cloudinit/stages.py
+++ b/cloudinit/stages.py
@@ -22,6 +22,8 @@ from cloudinit.handlers import cloud_config as cc_part
from cloudinit.handlers import shell_script as ss_part
from cloudinit.handlers import upstart_job as up_part
+from cloudinit.event import EventType
+
from cloudinit import cloud
from cloudinit import config
from cloudinit import distros
@@ -648,10 +650,14 @@ class Init(object):
except Exception as e:
LOG.warning("Failed to rename devices: %s", e)
- if (self.datasource is not NULL_DATA_SOURCE and
- not self.is_new_instance()):
- LOG.debug("not a new instance. network config is not applied.")
- return
+ if self.datasource is not NULL_DATA_SOURCE:
+ if not self.is_new_instance():
+ if not self.datasource.update_metadata([EventType.BOOT]):
+ LOG.debug(
+ "No network config applied. Neither a new instance"
+ " nor datasource network update on '%s' event",
+ EventType.BOOT)
+ return
LOG.info("Applying network configuration from %s bringup=%s: %s",
src, bring_up, netcfg)