summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/sources/DataSourceEc2.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index eb6f27b2..4f2f6ccb 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -19,6 +19,7 @@ from cloudinit import sources
from cloudinit import url_helper as uhelp
from cloudinit import util
from cloudinit import warnings
+from cloudinit.event import EventType
LOG = logging.getLogger(__name__)
@@ -107,6 +108,19 @@ class DataSourceEc2(sources.DataSource):
'dynamic', {}).get('instance-identity', {}).get('document', {})
return True
+ def is_classic_instance(self):
+ """Report if this instance type is Ec2 Classic (non-vpc)."""
+ if not self.metadata:
+ # Can return False on inconclusive as we are also called in
+ # network_config where metadata will be present.
+ # Secondary call site is in packaging postinst script.
+ return False
+ ifaces_md = self.metadata.get('network', {}).get('interfaces', {})
+ for _mac, mac_data in ifaces_md.get('macs', {}).items():
+ if 'vpc-id' in mac_data:
+ return False
+ return True
+
@property
def launch_index(self):
if not self.metadata:
@@ -320,6 +334,13 @@ class DataSourceEc2(sources.DataSource):
if isinstance(net_md, dict):
result = convert_ec2_metadata_network_config(
net_md, macs_to_nics=macs_to_nics, fallback_nic=iface)
+ # RELEASE_BLOCKER: Xenial debian/postinst needs to add
+ # EventType.BOOT on upgrade path for classic.
+
+ # Non-VPC (aka Classic) Ec2 instances need to rewrite the
+ # network config file every boot due to MAC address change.
+ if self.is_classic_instance():
+ self.update_events['network'].add(EventType.BOOT)
else:
LOG.warning("Metadata 'network' key not valid: %s.", net_md)
self._network_config = result