From ead017e1969b70fddabe7390f2727eb0dc34e620 Mon Sep 17 00:00:00 2001 From: Mark Goddard Date: Tue, 29 Jun 2021 16:58:42 +0100 Subject: [PATCH] Ubuntu: Fix networkd config for multiple VLANs without MTU TypeError: '>' not supported between instances of 'NoneType' and 'NoneType' Story: 2009013 Task: 42729 Change-Id: I8e25fdc459102ca6e13bd3d38191554ba32c1f48 --- kayobe/plugins/filter/networkd.py | 3 +- .../unit/plugins/filter/test_networkd.py | 38 +++++++++++++++++++ .../fix-networkd-vlans-8d5d85da4d2e50ae.yaml | 6 +++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-networkd-vlans-8d5d85da4d2e50ae.yaml diff --git a/kayobe/plugins/filter/networkd.py b/kayobe/plugins/filter/networkd.py index dac05b303..46750de20 100644 --- a/kayobe/plugins/filter/networkd.py +++ b/kayobe/plugins/filter/networkd.py @@ -626,7 +626,8 @@ def networkd_networks(context, names, inventory_hostname=None): set(bond_member_to_bond)) for device in implied_vlan_parents: vlan_interfaces = interface_to_vlans[device] - mtu = max([vlan["mtu"] for vlan in vlan_interfaces]) + vlan_mtus = [vlan["mtu"] for vlan in vlan_interfaces if vlan["mtu"]] + mtu = max(vlan_mtus) if vlan_mtus else None net = _vlan_parent_network(device, mtu, [vlan["device"] for vlan in vlan_interfaces]) diff --git a/kayobe/tests/unit/plugins/filter/test_networkd.py b/kayobe/tests/unit/plugins/filter/test_networkd.py index 12d2c3d61..c48486b40 100644 --- a/kayobe/tests/unit/plugins/filter/test_networkd.py +++ b/kayobe/tests/unit/plugins/filter/test_networkd.py @@ -420,6 +420,44 @@ class TestNetworkdNetworks(BaseNetworkdTest): } self.assertEqual(expected, nets) + def test_vlan_multiple(self): + # Test the case with multiple VLANs on an implied parent without MTUs. + # https://storyboard.openstack.org/#!/story/2009013 + self._update_context({ + "net5_interface": "eth0.3", + "net5_vlan": 3}) + nets = networkd.networkd_networks(self.context, ["net2", "net5"]) + expected = { + "50-kayobe-eth0": [ + { + "Match": [ + {"Name": "eth0"} + ], + }, + { + "Network": [ + {"VLAN": "eth0.2"}, + {"VLAN": "eth0.3"}, + ] + }, + ], + "50-kayobe-eth0.2": [ + { + "Match": [ + {"Name": "eth0.2"} + ] + }, + ], + "50-kayobe-eth0.3": [ + { + "Match": [ + {"Name": "eth0.3"} + ] + }, + ] + } + self.assertEqual(expected, nets) + def test_vlan_with_parent(self): nets = networkd.networkd_networks(self.context, ["net1", "net2"]) expected = { diff --git a/releasenotes/notes/fix-networkd-vlans-8d5d85da4d2e50ae.yaml b/releasenotes/notes/fix-networkd-vlans-8d5d85da4d2e50ae.yaml new file mode 100644 index 000000000..b17115e07 --- /dev/null +++ b/releasenotes/notes/fix-networkd-vlans-8d5d85da4d2e50ae.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixes an issue with systemd-networkd configuration on Ubuntu with multiple + VLAN interfaces. See `story 2009013 + `__ for details.