summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Watkins <daniel.watkins@canonical.com>2019-03-04 18:41:05 +0000
committerServer Team CI Bot <josh.powers+server-team-bot@canonical.com>2019-03-04 18:41:05 +0000
commit5352dd99eb2937b4eaaaf596b40ad7ca69d87f64 (patch)
tree9f705286334ed161e171793bed907795b3b2ed6e
parentedf052c3196139169ecbfe98049c278f4babc8ca (diff)
downloadcloud-init-git-5352dd99eb2937b4eaaaf596b40ad7ca69d87f64.tar.gz
helpers/openstack: Treat unknown link types as physical
Some deployments of OpenStack expose link types to the guest which cloud-init doesn't recognise. These will almost always be physical, so we can operate more robustly if we assume that they are (whilst warning the user that we're seeing something unexpected). LP: #1639263
-rw-r--r--cloudinit/sources/helpers/openstack.py12
-rw-r--r--tests/unittests/test_datasource/test_configdrive.py23
2 files changed, 29 insertions, 6 deletions
diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py
index 9c29ceac..8f069115 100644
--- a/cloudinit/sources/helpers/openstack.py
+++ b/cloudinit/sources/helpers/openstack.py
@@ -67,7 +67,7 @@ OS_VERSIONS = (
OS_ROCKY,
)
-PHYSICAL_TYPES = (
+KNOWN_PHYSICAL_TYPES = (
None,
'bgpovs', # not present in OpenStack upstream but used on OVH cloud.
'bridge',
@@ -600,9 +600,7 @@ def convert_net_json(network_json=None, known_macs=None):
subnet['ipv6'] = True
subnets.append(subnet)
cfg.update({'subnets': subnets})
- if link['type'] in PHYSICAL_TYPES:
- cfg.update({'type': 'physical', 'mac_address': link_mac_addr})
- elif link['type'] in ['bond']:
+ if link['type'] in ['bond']:
params = {}
if link_mac_addr:
params['mac_address'] = link_mac_addr
@@ -641,8 +639,10 @@ def convert_net_json(network_json=None, known_macs=None):
curinfo.update({'mac': link['vlan_mac_address'],
'name': name})
else:
- raise ValueError(
- 'Unknown network_data link type: %s' % link['type'])
+ if link['type'] not in KNOWN_PHYSICAL_TYPES:
+ LOG.warning('Unknown network_data link type (%s); treating as'
+ ' physical', link['type'])
+ cfg.update({'type': 'physical', 'mac_address': link_mac_addr})
config.append(cfg)
link_id_info[curinfo['id']] = curinfo
diff --git a/tests/unittests/test_datasource/test_configdrive.py b/tests/unittests/test_datasource/test_configdrive.py
index 7a6802f6..520c50fe 100644
--- a/tests/unittests/test_datasource/test_configdrive.py
+++ b/tests/unittests/test_datasource/test_configdrive.py
@@ -600,6 +600,9 @@ class TestNetJson(CiTestCase):
class TestConvertNetworkData(CiTestCase):
+
+ with_logs = True
+
def setUp(self):
super(TestConvertNetworkData, self).setUp()
self.tmp = self.tmp_dir()
@@ -726,6 +729,26 @@ class TestConvertNetworkData(CiTestCase):
'enp0s2': 'fa:16:3e:d4:57:ad'}
self.assertEqual(expected, config_name2mac)
+ def test_unknown_device_types_accepted(self):
+ # If we don't recognise a link, we should treat it as physical for a
+ # best-effort boot
+ my_netdata = deepcopy(NETWORK_DATA)
+ my_netdata['links'][0]['type'] = 'my-special-link-type'
+
+ ncfg = openstack.convert_net_json(my_netdata, known_macs=KNOWN_MACS)
+ config_name2mac = {}
+ for n in ncfg['config']:
+ if n['type'] == 'physical':
+ config_name2mac[n['name']] = n['mac_address']
+
+ expected = {'nic0': 'fa:16:3e:05:30:fe', 'enp0s1': 'fa:16:3e:69:b0:58',
+ 'enp0s2': 'fa:16:3e:d4:57:ad'}
+ self.assertEqual(expected, config_name2mac)
+
+ # We should, however, warn the user that we don't recognise the type
+ self.assertIn('Unknown network_data link type (my-special-link-type)',
+ self.logs.getvalue())
+
def cfg_ds_from_dir(base_d, files=None):
run = os.path.join(base_d, "run")