diff options
author | Scott Moser <smoser@brickies.net> | 2017-07-19 09:28:52 -0400 |
---|---|---|
committer | Scott Moser <smoser@brickies.net> | 2017-07-19 09:51:55 -0400 |
commit | c0060fe4892197179a5cfbfd3239cf3b6c3e5029 (patch) | |
tree | cd1ae5e0f2f4cd889d9565f1f450e9a5673aa51f | |
parent | 865e941f3f88c7daeafbf1eab856e02ce2b6a5f7 (diff) | |
download | vyos-cloud-init-c0060fe4892197179a5cfbfd3239cf3b6c3e5029.tar.gz vyos-cloud-init-c0060fe4892197179a5cfbfd3239cf3b6c3e5029.zip |
net: fix renaming of nics to support mac addresses written in upper case.
The network device renaming code previously required the case of
the mac address input to match that of the data read from the system.
For example, if user provided network config with mac address
in upper case, then cloud-init would not rename the device correctly
as /sys/class/net/address stores lower case values.
The fix here is to always compare lower case mac addresses.
LP: #1705147
-rw-r--r-- | cloudinit/net/__init__.py | 8 | ||||
-rw-r--r-- | tests/unittests/test_net.py | 27 |
2 files changed, 33 insertions, 2 deletions
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py index cba991a5..d1740e56 100644 --- a/cloudinit/net/__init__.py +++ b/cloudinit/net/__init__.py @@ -302,7 +302,7 @@ def _get_current_rename_info(check_downable=True): device has only automatically assigned ip addrs. 'device_id': Device id value (if it has one) 'driver': Device driver (if it has one) - 'mac': mac address + 'mac': mac address (in lower case) 'name': name 'up': boolean: is_up(name) }} @@ -313,7 +313,7 @@ def _get_current_rename_info(check_downable=True): 'downable': None, 'device_id': device_id, 'driver': driver, - 'mac': mac, + 'mac': mac.lower(), 'name': name, 'up': is_up(name), } @@ -348,6 +348,8 @@ def _rename_interfaces(renames, strict_present=True, strict_busy=True, cur_info = {} for name, data in current_info.items(): cur = data.copy() + if cur.get('mac'): + cur['mac'] = cur['mac'].lower() cur['name'] = name cur_info[name] = cur @@ -399,6 +401,8 @@ def _rename_interfaces(renames, strict_present=True, strict_busy=True, return None for mac, new_name, driver, device_id in renames: + if mac: + mac = mac.lower() cur_ops = [] cur = find_entry(mac, driver, device_id) if not cur: diff --git a/tests/unittests/test_net.py b/tests/unittests/test_net.py index 71c9c457..76721bab 100644 --- a/tests/unittests/test_net.py +++ b/tests/unittests/test_net.py @@ -2176,5 +2176,32 @@ class TestRenameInterfaces(CiTestCase): capture=True), ]) + @mock.patch('cloudinit.util.subp') + def test_rename_macs_case_insensitive(self, mock_subp): + """_rename_interfaces must support upper or lower case macs.""" + renames = [ + ('aa:aa:aa:aa:aa:aa', 'en0', None, None), + ('BB:BB:BB:BB:BB:BB', 'en1', None, None), + ('cc:cc:cc:cc:cc:cc', 'en2', None, None), + ('DD:DD:DD:DD:DD:DD', 'en3', None, None), + ] + current_info = { + 'eth0': {'downable': True, 'mac': 'AA:AA:AA:AA:AA:AA', + 'name': 'eth0', 'up': False}, + 'eth1': {'downable': True, 'mac': 'bb:bb:bb:bb:bb:bb', + 'name': 'eth1', 'up': False}, + 'eth2': {'downable': True, 'mac': 'cc:cc:cc:cc:cc:cc', + 'name': 'eth2', 'up': False}, + 'eth3': {'downable': True, 'mac': 'DD:DD:DD:DD:DD:DD', + 'name': 'eth3', 'up': False}, + } + net._rename_interfaces(renames, current_info=current_info) + + expected = [ + mock.call(['ip', 'link', 'set', 'eth%d' % i, 'name', 'en%d' % i], + capture=True) + for i in range(len(renames))] + mock_subp.assert_has_calls(expected) + # vi: ts=4 expandtab |