summaryrefslogtreecommitdiff
path: root/cloudinit/sources
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2017-08-29 10:34:19 -0600
committerChad Smith <chad.smith@canonical.com>2017-08-29 10:34:19 -0600
commit3c45330af2a301f2bf219da556844d01cef6778e (patch)
tree3498d08d5fedc652bac7f27938c009b515dffe0b /cloudinit/sources
parentaf4630c9846fe979152320035e9cc6c411506503 (diff)
downloadvyos-cloud-init-3c45330af2a301f2bf219da556844d01cef6778e.tar.gz
vyos-cloud-init-3c45330af2a301f2bf219da556844d01cef6778e.zip
ec2: Add IPv6 dhcp support to Ec2DataSource.
DataSourceEc2 now parses the metadata for each nic to determine if configured for ipv6 and/or ipv4 addresses. In AWS for metadata version 2016-09-02, nics configured for ipv4 or ipv6 addresses will have non-zero values stored in metadata at network/interfaces/macs/<MAC>/public-ipv4 or ipv6s respectively. Those metadata files are only non-zero when an ipv4 or ipv6 ip is associated to the specific nic. A new DataSourceEc2.network_config property is added which parses the metadata and renders a network version 1 dictionary representing both dhcp4 and dhcp6 configuration for associated nics. The network configuration returned from the datasource will also 'pin' the nic name to the name presented on the instance for each nic. LP: #1639030
Diffstat (limited to 'cloudinit/sources')
-rw-r--r--cloudinit/sources/DataSourceEc2.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index 8e5f8ee4..07c12bb4 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -57,6 +57,8 @@ class DataSourceEc2(sources.DataSource):
_cloud_platform = None
+ _network_config = None # Used for caching calculated network config v1
+
# Whether we want to get network configuration from the metadata service.
get_network_metadata = False
@@ -279,6 +281,15 @@ class DataSourceEc2(sources.DataSource):
util.get_cfg_by_path(cfg, STRICT_ID_PATH, STRICT_ID_DEFAULT),
cfg)
+ @property
+ def network_config(self):
+ """Return a network config dict for rendering ENI or netplan files."""
+ if self._network_config is None:
+ if self.metadata is not None:
+ self._network_config = convert_ec2_metadata_network_config(
+ self.metadata)
+ return self._network_config
+
def _crawl_metadata(self):
"""Crawl metadata service when available.
@@ -423,6 +434,33 @@ def _collect_platform_data():
return data
+def convert_ec2_metadata_network_config(metadata=None, macs_to_nics=None):
+ """Convert ec2 metadata to network config version 1 data dict.
+
+ @param: metadata: Dictionary of metadata crawled from EC2 metadata url.
+ @param: macs_to_name: Optional dict mac addresses and the nic name. If
+ not provided, get_interfaces_by_mac is called to get it from the OS.
+
+ @return A dict of network config version 1 based on the metadata and macs.
+ """
+ netcfg = {'version': 1, 'config': []}
+ if not macs_to_nics:
+ macs_to_nics = net.get_interfaces_by_mac()
+ macs_metadata = metadata['network']['interfaces']['macs']
+ for mac, nic_name in macs_to_nics.items():
+ nic_metadata = macs_metadata.get(mac)
+ if not nic_metadata:
+ continue # Not a physical nic represented in metadata
+ nic_cfg = {'type': 'physical', 'name': nic_name, 'subnets': []}
+ nic_cfg['mac_address'] = mac
+ if nic_metadata.get('public-ipv4s'):
+ nic_cfg['subnets'].append({'type': 'dhcp4'})
+ if nic_metadata.get('ipv6s'):
+ nic_cfg['subnets'].append({'type': 'dhcp6'})
+ netcfg['config'].append(nic_cfg)
+ return netcfg
+
+
# Used to match classes to dependencies
datasources = [
(DataSourceEc2Local, (sources.DEP_FILESYSTEM,)), # Run at init-local