Merge ~bjornt/maas:update-node-interfaces-missing into maas:master

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 5412d70d94f83a08fa9dab203857aaa56204d236
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:update-node-interfaces-missing
Merge into: maas:master
Diff against target: 84 lines (+57/-1)
2 files modified
src/metadataserver/builtin_scripts/network.py (+6/-1)
src/metadataserver/builtin_scripts/tests/test_network.py (+51/-0)
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
MAAS Lander unittests Pending
Review via email: mp+402217@code.launchpad.net

Commit message

update_node_interfaces() failed if some interface parents didn't exist.

This happens if there are veth interfaces in bridges, since LXD will
include that in the bridge information, but it won't create network
entries for them.

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

+1

minor nit inline

review: Approve
5412d70... by Björn Tillenius

Use different variable in list comprehension.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/metadataserver/builtin_scripts/network.py b/src/metadataserver/builtin_scripts/network.py
2index e51b3c5..44d8691 100644
3--- a/src/metadataserver/builtin_scripts/network.py
4+++ b/src/metadataserver/builtin_scripts/network.py
5@@ -41,7 +41,12 @@ def get_interface_dependencies(data):
6 parents = [network["vlan"]["lower_device"]]
7 else:
8 parents = []
9- dependencies[name].extend(parents)
10+ # Only add devices that are defined in the data. Some virtual
11+ # interfaces might be defined as a parent, but they are not a
12+ # network, so we don't have any information about them.
13+ dependencies[name].extend(
14+ iface for iface in parents if iface in data["networks"]
15+ )
16 return dependencies
17
18
19diff --git a/src/metadataserver/builtin_scripts/tests/test_network.py b/src/metadataserver/builtin_scripts/tests/test_network.py
20index 32cb095..4b6d0b4 100644
21--- a/src/metadataserver/builtin_scripts/tests/test_network.py
22+++ b/src/metadataserver/builtin_scripts/tests/test_network.py
23@@ -1454,6 +1454,23 @@ class TestUpdateInterfaces(MAASServerTestCase, UpdateInterfacesMixin):
24 ["eth0", "eth1"],
25 )
26
27+ def test_bridge_with_missing_parents(self):
28+ controller = self.create_empty_controller()
29+ data = FakeCommissioningData()
30+ data.create_bridge_network("br0", parents=[])
31+ data.networks["br0"].bridge.upper_devices = ["tap0", "veth1"]
32+ self.update_interfaces(controller, data)
33+
34+ self.assertEqual(1, controller.interface_set.count())
35+ bridge_interface = BridgeInterface.objects.get(
36+ node=controller,
37+ name="br0",
38+ )
39+ self.assertEqual(
40+ sorted(parent.name for parent in bridge_interface.parents.all()),
41+ [],
42+ )
43+
44 def test_bridge_with_existing_parents(self):
45 controller = self.create_empty_controller()
46 fabric = factory.make_Fabric()
47@@ -2788,3 +2805,37 @@ class TestGetInterfaceDependencies(MAASTestCase):
48 },
49 dependencies,
50 )
51+
52+ def test_ignores_missing_parents(self):
53+ data = FakeCommissioningData()
54+ data.create_physical_network("eth0")
55+ data.create_physical_network("eth1")
56+ data.create_physical_network("eth2")
57+ data.create_physical_network("eth3")
58+ data.create_bridge_network("br0", parents=[data.networks["eth0"]])
59+ data.create_bond_network(
60+ "bond0", parents=[data.networks["eth1"], data.networks["eth2"]]
61+ )
62+ data.networks["bond0"].bond.lower_devices.append("missing1")
63+ data.create_vlan_network(
64+ "bond0.10", vid=10, parent=data.networks["bond0"]
65+ )
66+ data.networks["bond0.10"].vlan.lower_device = "missing2"
67+ data.create_bridge_network(
68+ "br1", parents=[data.networks["bond0.10"], data.networks["eth3"]]
69+ )
70+ data.networks["br1"].bridge.upper_devices.append("missing3")
71+ dependencies = get_interface_dependencies(data.render())
72+ self.assertEqual(
73+ {
74+ "eth0": [],
75+ "eth1": [],
76+ "eth2": [],
77+ "eth3": [],
78+ "br0": ["eth0"],
79+ "bond0": ["eth1", "eth2"],
80+ "bond0.10": [],
81+ "br1": ["bond0.10", "eth3"],
82+ },
83+ dependencies,
84+ )

Subscribers

People subscribed via source and target branches