diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index 41367a8b..88d4a0c3 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -297,11 +297,12 @@ class DataSourceEc2(sources.DataSource):
result = None
net_md = self.metadata.get('network')
- if isinstance(net_md, dict):
+ try:
result = convert_ec2_metadata_network_config(net_md)
- else:
- LOG.warning("unexpected metadata 'network' key not valid: %s",
- net_md)
+ except ValueError as e:
+ LOG.warning("Failed converting metadata (%s). network config=%s",
+ e, net_md)
+
self._network_config = result
return self._network_config
@@ -470,10 +471,21 @@ def convert_ec2_metadata_network_config(network_md, macs_to_nics=None):
@return A dict of network config version 1 based on the metadata and macs.
"""
- netcfg = {'version': 1, 'config': []}
+ if not isinstance(network_md, dict):
+ raise ValueError("network_md is not a dict")
+
+ if not isinstance(network_md.get('interfaces'), dict):
+ raise ValueError("network_md had non-dict at 'interfaces'")
+
+ if not isinstance(network_md['interfaces'].get('macs'), dict):
+ raise ValueError("network_md['interfaces'] had non-dict at 'macs'")
+
+ macs_metadata = network_md['interfaces']['macs']
+
if not macs_to_nics:
macs_to_nics = net.get_interfaces_by_mac()
- macs_metadata = network_md['interfaces']['macs']
+
+ netcfg = {'version': 1, 'config': []}
for mac, nic_name in macs_to_nics.items():
nic_metadata = macs_metadata.get(mac)
if not nic_metadata: