I have some nits there, but I think this looks good. Thanks.
Diff comments: > diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py > index a1b0db1..c3a8add 100644 > --- a/cloudinit/net/__init__.py > +++ b/cloudinit/net/__init__.py > @@ -275,20 +275,45 @@ def apply_network_config_names(netcfg, > strict_present=True, strict_busy=True): > expected that the network system will create other devices with the > correct name in place.""" > renames = [] > - for ent in netcfg.get('config', {}): > - if ent.get('type') != 'physical': > - continue > - mac = ent.get('mac_address') > - if not mac: > - continue > - name = ent.get('name') > - driver = ent.get('params', {}).get('driver') > - device_id = ent.get('params', {}).get('device_id') > - if not driver: > - driver = device_driver(name) > - if not device_id: > - device_id = device_devid(name) > - renames.append([mac, name, driver, device_id]) > + > + def _version_1(netcfg): > + for ent in netcfg.get('config', {}): > + if ent.get('type') != 'physical': > + continue > + mac = ent.get('mac_address') > + if not mac: > + continue > + name = ent.get('name') > + driver = ent.get('params', {}).get('driver') > + device_id = ent.get('params', {}).get('device_id') > + if not driver: > + driver = device_driver(name) > + if not device_id: > + device_id = device_devid(name) > + renames.append([mac, name, driver, device_id]) > + > + def _version_2(netcfg): > + for key, ent in netcfg.get('ethernets', {}).items(): > + # only rename if configured to do so > + name = ent.get('set-name') > + if not name: > + continue > + # cloud-init requires macaddress for renaming > + mac = ent.get('match', {}).get('macaddress') > + if not mac: > + continue > + driver = ent.get('match', {}).get('driver') > + device_id = ent.get('match', {}).get('device_id') > + if not driver: > + driver = device_driver(name) > + if not device_id: > + device_id = device_devid(name) > + renames.append([mac, name, driver, device_id]) > + > + if netcfg.get('version') == 1: can you just make _version_2 and _version_1 return renames ? rather than modifying the locally scoped rename ? it just is more obvious i think. then i guess we should probably raise a RuntimeError if we get something else. Right? > + _version_1(netcfg) > + elif netcfg.get('version') == 2: > + _version_2(netcfg) > > return _rename_interfaces(renames) > > diff --git a/cloudinit/net/tests/test_init.py > b/cloudinit/net/tests/test_init.py > index 8cb4114..7ac9041 100644 > --- a/cloudinit/net/tests/test_init.py > +++ b/cloudinit/net/tests/test_init.py > @@ -520,3 +522,88 @@ class TestEphemeralIPV4Network(CiTestCase): > with net.EphemeralIPv4Network(**params): > self.assertEqual(expected_setup_calls, m_subp.call_args_list) > m_subp.assert_has_calls(expected_teardown_calls) > + > + > +class TestApplyNetworkCfgNames(CiTestCase): > + V1_CONFIG = textwrap.dedent("""\ > + version: 1 > + config: > + - type: physical > + name: interface0 > + mac_address: "52:54:00:12:34:00" > + subnets: > + - type: static > + address: 10.0.2.15 > + netmask: 255.255.255.0 > + gateway: 10.0.2.2 > + """) > + V2_CONFIG = textwrap.dedent("""\ > + version: 2 > + ethernets: > + interface0: > + match: > + macaddress: "52:54:00:12:34:00" > + addresses: > + - 10.0.2.15/24 > + gateway4: 10.0.2.2 > + set-name: interface0 > + """) > + > + V2_CONFIG_NO_SETNAME = textwrap.dedent("""\ > + version: 2 > + ethernets: > + interface0: > + match: > + macaddress: "52:54:00:12:34:00" > + addresses: > + - 10.0.2.15/24 > + gateway4: 10.0.2.2 > + """) > + > + V2_CONFIG_NO_MAC = textwrap.dedent("""\ > + version: 2 > + ethernets: > + interface0: > + match: > + driver: virtio-net > + addresses: > + - 10.0.2.15/24 > + gateway4: 10.0.2.2 > + set-name: interface0 > + """) > + > + @mock.patch('cloudinit.net.device_devid') > + @mock.patch('cloudinit.net.device_driver') > + @mock.patch('cloudinit.net._rename_interfaces') > + def test_apply_v1_renames(self, m_rename_interfaces, m_device_driver, > + m_device_devid): > + m_device_driver.return_value = 'virtio_net' > + m_device_devid.return_value = '0x15d8' > + > + net.apply_network_config_names(yaml.load(self.V1_CONFIG)) the yaml.load() doesnt give us much does it? compared to: V2_CONFIG_NO_MAC = { 'version': 2, 'ethernets': { 'interface0': { 'match': {'driver': 'virtio-net'}, 'addresses': ['10.0.2.15/24'], 'gateway4': [10.0.2.2], 'set-name': 'interface0'}}} then net.apply_network_config_names(V2_CONFIG_NO_MAC) > + > + call = ['52:54:00:12:34:00', 'interface0', 'virtio_net', '0x15d8'] > + m_rename_interfaces.assert_called_with([call]) > + > + @mock.patch('cloudinit.net.device_devid') > + @mock.patch('cloudinit.net.device_driver') > + @mock.patch('cloudinit.net._rename_interfaces') > + def test_apply_v2_renames(self, m_rename_interfaces, m_device_driver, > + m_device_devid): > + m_device_driver.return_value = 'virtio_net' > + m_device_devid.return_value = '0x15d8' > + > + net.apply_network_config_names(yaml.load(self.V2_CONFIG)) > + > + call = ['52:54:00:12:34:00', 'interface0', 'virtio_net', '0x15d8'] > + m_rename_interfaces.assert_called_with([call]) > + > + @mock.patch('cloudinit.net._rename_interfaces') > + def test_apply_v2_renames_skips_without_setname(self, > m_rename_interfaces): > + net.apply_network_config_names(yaml.load(self.V2_CONFIG_NO_SETNAME)) > + m_rename_interfaces.assert_called_with([]) > + > + @mock.patch('cloudinit.net._rename_interfaces') > + def test_apply_v2_renames_skips_without_mac(self, m_rename_interfaces): > + net.apply_network_config_names(yaml.load(self.V2_CONFIG_NO_MAC)) > + m_rename_interfaces.assert_called_with([]) -- https://code.launchpad.net/~raharper/cloud-init/+git/cloud-init/+merge/336464 Your team cloud-init commiters is requested to review the proposed merge of ~raharper/cloud-init:fix/cloud-init-network-rename-with-v2 into cloud-init:master. _______________________________________________ Mailing list: https://launchpad.net/~cloud-init-dev Post to : cloud-init-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~cloud-init-dev More help : https://help.launchpad.net/ListHelp