summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/net/__init__.py8
-rw-r--r--tests/unittests/test_net.py27
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