diff options
-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 |