Skip to content

Commit f596fe4

Browse files
committed
enable_vlan_interfaces: support identifying interfaces by MAC
The enable_vlan_interfaces config option supports a comma-separated list of <interface>.<vlan> pairs. However, using this relies on knowledge of the interface name. When used via the ipa-enable-vlan-interfaces kernel command-line parameter, an interface name may be hard to predict. As an alternative to identifying interfaces by name, support identifying them by MAC. Change-Id: Ice822a8e7b8d82352b3b39f87d930bef3eb7b461 Signed-off-by: Jonathan Davies <jonathan.davies@nutanix.com>
1 parent c2c72ee commit f596fe4

File tree

4 files changed

+68
-6
lines changed

4 files changed

+68
-6
lines changed

ironic_python_agent/config.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@
318318
cfg.StrOpt('enable_vlan_interfaces',
319319
default=APARAMS.get('ipa-enable-vlan-interfaces', ''),
320320
help='Comma-separated list of VLAN interfaces to enable, '
321-
'in the format "interface.vlan". If only an '
321+
'in the format "interface.vlan". The "interface" can be '
322+
'an interface name or a MAC address (EUI-48 format, '
323+
'case-insensitive). If only an '
322324
'interface is provided, then IPA should attempt to '
323325
'bring up all VLANs on that interface detected '
324326
'via lldp. If "all" is set then IPA should attempt '

ironic_python_agent/netutils.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -420,11 +420,14 @@ def bring_up_vlan_interfaces(interfaces_list):
420420
if '.' in vlan_int:
421421
# interface and vlan are provided
422422
interface, vlan = vlan_int.split('.', 1)
423-
if any(x.name == interface for x in interfaces_list):
424-
name = _add_vlan_interface(interface, vlan,
425-
interfaces_list)
426-
if name:
427-
interfaces.append(name)
423+
for x in interfaces_list:
424+
if (x.name == interface
425+
or x.mac_address.lower() == interface.lower()):
426+
name = _add_vlan_interface(x.name, vlan,
427+
interfaces_list)
428+
if name:
429+
interfaces.append(name)
430+
break
428431
else:
429432
LOG.warning('Provided VLAN interface %s does not exist',
430433
interface)

ironic_python_agent/tests/unit/test_hardware.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6901,6 +6901,58 @@ def test_list_network_vlan_interfaces(self,
69016901
self.assertEqual('00:0c:29:8c:11:b1', interfaces[1].mac_address)
69026902
self.assertIsNone(interfaces[1].lldp)
69036903

6904+
def test_list_network_vlan_interfaces_mac(self,
6905+
mock_has_carrier,
6906+
mocked_execute,
6907+
mocked_open,
6908+
mocked_exists,
6909+
mocked_listdir,
6910+
mocked_net_if_addrs,
6911+
mockedget_managers,
6912+
mocked_lshw,
6913+
mocked_get_mac_addr):
6914+
CONF.set_override('enable_vlan_interfaces', '00:0c:29:8c:11:b1.100')
6915+
mocked_listdir.return_value = ['lo', 'eth0']
6916+
mocked_exists.side_effect = [False, False, True]
6917+
mocked_open.return_value.__enter__ = lambda s: s
6918+
mocked_open.return_value.__exit__ = mock.Mock()
6919+
read_mock = mocked_open.return_value.read
6920+
read_mock.side_effect = ['1']
6921+
mocked_net_if_addrs.return_value = {
6922+
'lo': [
6923+
FakeAddr(socket.AF_INET, '127.0.0.1'),
6924+
FakeAddr(socket.AF_INET6, '::1'),
6925+
FakeAddr(socket.AF_PACKET, '00:00:00:00:00:00')
6926+
],
6927+
'eth0': [
6928+
FakeAddr(socket.AF_INET, '192.168.1.2'),
6929+
FakeAddr(socket.AF_INET6, 'fd00::101'),
6930+
FakeAddr(socket.AF_PACKET, '00:0c:29:8c:11:b1')
6931+
],
6932+
'eth0.100': [
6933+
FakeAddr(socket.AF_INET, '192.168.2.2'),
6934+
FakeAddr(socket.AF_INET6, 'fd00::1000::101'),
6935+
FakeAddr(socket.AF_PACKET, '00:0c:29:8c:11:b1')
6936+
]
6937+
}
6938+
mocked_get_mac_addr.side_effect = lambda iface: {
6939+
'lo': '00:00:00:00:00:00',
6940+
'eth0': '00:0c:29:8c:11:b1',
6941+
'eth0.100': '00:0c:29:8c:11:b1',
6942+
}.get(iface)
6943+
mocked_execute.return_value = ('em0\n', '')
6944+
mock_has_carrier.return_value = True
6945+
interfaces = self.hardware.list_network_interfaces()
6946+
self.assertEqual(2, len(interfaces))
6947+
self.assertEqual('eth0', interfaces[0].name)
6948+
self.assertEqual('00:0c:29:8c:11:b1', interfaces[0].mac_address)
6949+
self.assertEqual('192.168.1.2', interfaces[0].ipv4_address)
6950+
self.assertEqual('fd00::101', interfaces[0].ipv6_address)
6951+
self.assertIsNone(interfaces[0].lldp)
6952+
self.assertEqual('eth0.100', interfaces[1].name)
6953+
self.assertEqual('00:0c:29:8c:11:b1', interfaces[1].mac_address)
6954+
self.assertIsNone(interfaces[1].lldp)
6955+
69046956
@mock.patch.object(netutils, 'get_lldp_info', autospec=True)
69056957
def test_list_network_vlan_interfaces_using_lldp(self,
69066958
mocked_lldp_info,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
features:
3+
- |
4+
Extend ``ipa-enable-vlan-interfaces`` kernel params field to support
5+
identifying an interface by its MAC address as an alternative to its name.

0 commit comments

Comments
 (0)