Merge ~mpontillo/maas:netplan--fix-deferred-issues into maas:master

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: b4493f6a1f386ed7ddec6892e1ac2d038bb9a1c4
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~mpontillo/maas:netplan--fix-deferred-issues
Merge into: maas:master
Diff against target: 349 lines (+91/-36)
2 files modified
src/maasserver/preseed_network.py (+45/-21)
src/maasserver/tests/test_preseed_network.py (+46/-15)
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
MAAS Lander Approve
Review via email: mp+361468@code.launchpad.net

Commit message

Fix Netplan (v2 YAML) rendering to be consistent with cloud-init.

 * Propagate global DNS configuration to per-interface context.
 * Define search paths on per-interface context.
 * Set MAC address on bonds and bridges. (LP: #1664698)

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b netplan--fix-deferred-issues lp:~mpontillo/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/4843/console
COMMIT: de2ba602798944f87d2a9f2a717a96da40f085da

review: Needs Fixing
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Looks like a "lander is slow" failure. Argh.

https://paste.ubuntu.com/p/BM2bYVyxdV/

b4493f6... by Mike Pontillo

Update comments.

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b netplan--fix-deferred-issues lp:~mpontillo/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: b4493f6a1f386ed7ddec6892e1ac2d038bb9a1c4

review: Approve
Revision history for this message
Lee Trager (ltrager) wrote :

LGTM but you may want to have someone else take another look.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/preseed_network.py b/src/maasserver/preseed_network.py
2index 1c448fb..61b3464 100644
3--- a/src/maasserver/preseed_network.py
4+++ b/src/maasserver/preseed_network.py
5@@ -261,7 +261,9 @@ class InterfaceConfiguration:
6 self.node_config.default_search_list)
7 if "nameservers" not in v2_config:
8 v2_config["nameservers"] = v2_nameservers
9- # XXX should also support search paths.
10+ v2_config["nameservers"]["search"] = (
11+ self.node_config.default_search_list
12+ )
13 if "addresses" not in v2_nameservers:
14 v2_nameservers["addresses"] = []
15 v2_nameservers["addresses"].extend(
16@@ -342,10 +344,7 @@ class InterfaceConfiguration:
17 bond_operation["subnets"] = addrs
18 else:
19 bond_operation.update({
20- # XXX mpontillo 2017-02-17: netplan does not yet support
21- # specifying the MAC that should be used for a bond.
22- # See launchpad bug #1664698.
23- # "macaddress": str(self.iface.mac_address),
24+ "macaddress": str(self.iface.mac_address),
25 "interfaces": [
26 parent.get_name()
27 for parent in self.iface.parents.order_by('name')
28@@ -375,10 +374,7 @@ class InterfaceConfiguration:
29 bridge_operation["subnets"] = addrs
30 elif version == 2:
31 bridge_operation.update({
32- # XXX mpontillo 2017-02-17: netplan does not yet support
33- # specifying the MAC that should be used for a bond.
34- # See launchpad bug #1664698.
35- # "macaddress": str(self.iface.mac_address),
36+ "macaddress": str(self.iface.mac_address),
37 "interfaces": [
38 parent.get_name()
39 for parent in self.iface.parents.order_by('name')
40@@ -513,12 +509,12 @@ class NodeNetworkConfiguration:
41 # that we at least get some address.
42 if not self.addr_family_present[6]:
43 self.addr_family_present[4] = True
44- default_dns_servers = self.node.get_default_dns_servers(
45+ self.default_dns_servers = self.node.get_default_dns_servers(
46 ipv4=self.addr_family_present[4], ipv6=self.addr_family_present[6],
47 default_region_ip=default_source_ip)
48 self.v1_config.append({
49 "type": "nameserver",
50- "address": default_dns_servers,
51+ "address": self.default_dns_servers,
52 "search": self.default_search_list,
53 })
54 if version == 1:
55@@ -541,18 +537,46 @@ class NodeNetworkConfiguration:
56 v2_config.update({"bonds": self.v2_bonds})
57 if len(self.v2_bridges) > 0:
58 v2_config.update({"bridges": self.v2_bridges})
59- # XXX mpontillo 2017-02-17: netplan has no concept of "default"
60- # DNS servers. Need to define how to convey this.
61- # See launchpad bug #1664806.
62- # if len(default_dns_servers) > 0 or len(search_list) > 0:
63- # nameservers = {}
64- # if len(search_list) > 0:
65- # nameservers.update({"search": search_list})
66- # if len(default_dns_servers) > 0:
67- # nameservers.update({"addresses": default_dns_servers})
68- # v2_config.update({"nameservers": nameservers})
69+ self.set_v2_default_dns()
70 self.config = network_config
71
72+ def set_v2_default_dns(self):
73+ """Define default nameservers on each interface.
74+
75+ Define nameservers consistent with how cloud-init does it.
76+ (See also bug #1664806.)
77+ """
78+ # See also:
79+ # https://git.launchpad.net/cloud-init/commit/?id=d29eeccd
80+ if (len(self.default_dns_servers) > 0 or
81+ len(self.default_search_list) > 0):
82+ v2_default_nameservers = {}
83+ if len(self.default_search_list) > 0:
84+ v2_default_nameservers.update({
85+ "search": self.default_search_list
86+ })
87+ if len(self.default_dns_servers) > 0:
88+ v2_default_nameservers.update({
89+ "addresses": self.default_dns_servers
90+ })
91+ sections = [
92+ self.v2_ethernets,
93+ self.v2_vlans,
94+ self.v2_bonds,
95+ self.v2_bridges
96+ ]
97+ for section in sections:
98+ for ifname, config in section.items():
99+ if 'nameservers' in config:
100+ # Skip interfaces that already have nameservers.
101+ continue
102+ if 'addresses' not in config:
103+ # Skip interfaces with no manual addresses.
104+ continue
105+ config.update({
106+ 'nameservers': v2_default_nameservers
107+ })
108+
109
110 def compose_curtin_network_config(node, version=1):
111 """Compose the network configuration for curtin."""
112diff --git a/src/maasserver/tests/test_preseed_network.py b/src/maasserver/tests/test_preseed_network.py
113index 56307bb..c6b68ba 100644
114--- a/src/maasserver/tests/test_preseed_network.py
115+++ b/src/maasserver/tests/test_preseed_network.py
116@@ -18,6 +18,7 @@ from maasserver.enum import (
117 IPADDRESS_FAMILY,
118 IPADDRESS_TYPE,
119 )
120+from maasserver.models import Domain
121 from maasserver.preseed_network import (
122 compose_curtin_network_config,
123 NodeNetworkConfiguration,
124@@ -512,7 +513,8 @@ class TestNetplan(MAASServerTestCase):
125 node=node, name='eth1', mac_address="02:01:02:03:04:05")
126 factory.make_Interface(
127 INTERFACE_TYPE.BOND,
128- node=node, name='bond0', parents=[eth0, eth1])
129+ node=node, name='bond0', parents=[eth0, eth1],
130+ mac_address=eth0.mac_address)
131 netplan = self._render_netplan_dict(node)
132 expected_netplan = {
133 'network': {
134@@ -532,7 +534,8 @@ class TestNetplan(MAASServerTestCase):
135 'bonds': {
136 'bond0': {
137 'interfaces': ['eth0', 'eth1'],
138- 'mtu': 1500
139+ 'mtu': 1500,
140+ 'macaddress': '00:01:02:03:04:05'
141 },
142 },
143 }
144@@ -547,7 +550,9 @@ class TestNetplan(MAASServerTestCase):
145 node=node, name='eth1', mac_address="02:01:02:03:04:05")
146 factory.make_Interface(
147 INTERFACE_TYPE.BOND,
148- node=node, name='bond0', parents=[eth0, eth1], params={
149+ node=node, name='bond0', parents=[eth0, eth1],
150+ mac_address="03:01:02:03:04:05",
151+ params={
152 "bond_mode": "active-backup",
153 "bond_lacp_rate": "fast",
154 "bond_xmit_hash_policy": "layer2",
155@@ -578,6 +583,7 @@ class TestNetplan(MAASServerTestCase):
156 "transmit-hash-policy": "layer2",
157 "gratuitous-arp": 3,
158 },
159+ 'macaddress': '03:01:02:03:04:05'
160 },
161 },
162 }
163@@ -592,7 +598,9 @@ class TestNetplan(MAASServerTestCase):
164 node=node, name='eth1', mac_address="02:01:02:03:04:05")
165 factory.make_Interface(
166 INTERFACE_TYPE.BOND,
167- node=node, name='bond0', parents=[eth0, eth1], params={
168+ node=node, name='bond0', parents=[eth0, eth1],
169+ mac_address="03:01:02:03:04:05",
170+ params={
171 "bond_mode": "802.3ad",
172 "bond_lacp_rate": "fast",
173 "bond_xmit_hash_policy": "layer2",
174@@ -623,6 +631,7 @@ class TestNetplan(MAASServerTestCase):
175 "lacp-rate": "fast",
176 "transmit-hash-policy": "layer2",
177 },
178+ 'macaddress': '03:01:02:03:04:05'
179 },
180 },
181 }
182@@ -635,7 +644,7 @@ class TestNetplan(MAASServerTestCase):
183 node=node, name='eth0', mac_address="00:01:02:03:04:05")
184 eth1 = factory.make_Interface(
185 node=node, name='eth1', mac_address="02:01:02:03:04:05")
186- factory.make_Interface(
187+ bond0 = factory.make_Interface(
188 INTERFACE_TYPE.BOND,
189 node=node, name='bond0', parents=[eth0, eth1], params={
190 "bond_mode": "active-backup",
191@@ -663,6 +672,7 @@ class TestNetplan(MAASServerTestCase):
192 'bond0': {
193 'interfaces': ['eth0', 'eth1'],
194 'mtu': 1500,
195+ 'macaddress': bond0.mac_address,
196 'parameters': {
197 "mode": "active-backup",
198 "transmit-hash-policy": "layer2",
199@@ -680,7 +690,7 @@ class TestNetplan(MAASServerTestCase):
200 node=node, name='eth0', mac_address="00:01:02:03:04:05")
201 eth1 = factory.make_Interface(
202 node=node, name='eth1', mac_address="02:01:02:03:04:05")
203- factory.make_Interface(
204+ br0 = factory.make_Interface(
205 INTERFACE_TYPE.BRIDGE,
206 node=node, name='br0', parents=[eth0, eth1])
207 netplan = self._render_netplan_dict(node)
208@@ -702,7 +712,8 @@ class TestNetplan(MAASServerTestCase):
209 'bridges': {
210 'br0': {
211 'interfaces': ['eth0', 'eth1'],
212- 'mtu': 1500
213+ 'mtu': 1500,
214+ 'macaddress': br0.mac_address
215 },
216 },
217 }
218@@ -715,7 +726,7 @@ class TestNetplan(MAASServerTestCase):
219 node=node, name='eth0', mac_address="00:01:02:03:04:05")
220 eth1 = factory.make_Interface(
221 node=node, name='eth1', mac_address="02:01:02:03:04:05")
222- factory.make_Interface(
223+ br0 = factory.make_Interface(
224 INTERFACE_TYPE.BRIDGE,
225 node=node, name='br0', parents=[eth0, eth1], params={
226 "bridge_stp": False,
227@@ -741,6 +752,7 @@ class TestNetplan(MAASServerTestCase):
228 'br0': {
229 'interfaces': ['eth0', 'eth1'],
230 'mtu': 1500,
231+ 'macaddress': br0.mac_address,
232 'parameters': {
233 'forward-delay': 15,
234 'stp': False,
235@@ -760,7 +772,7 @@ class TestNetplan(MAASServerTestCase):
236 bond0 = factory.make_Interface(
237 INTERFACE_TYPE.BOND,
238 node=node, name='bond0', parents=[eth0, eth1])
239- factory.make_Interface(
240+ br0 = factory.make_Interface(
241 INTERFACE_TYPE.BRIDGE,
242 node=node, name='br0', parents=[bond0])
243 netplan = self._render_netplan_dict(node)
244@@ -782,12 +794,14 @@ class TestNetplan(MAASServerTestCase):
245 'bonds': {
246 'bond0': {
247 'interfaces': ['eth0', 'eth1'],
248+ 'macaddress': bond0.mac_address,
249 'mtu': 1500
250 },
251 },
252 'bridges': {
253 'br0': {
254 'interfaces': ['bond0'],
255+ 'macaddress': br0.mac_address,
256 'mtu': 1500
257 },
258 },
259@@ -826,7 +840,9 @@ class TestNetplan(MAASServerTestCase):
260 # Make sure we know when and where the default DNS server will be used.
261 get_default_dns_servers_mock = self.patch(
262 node, 'get_default_dns_servers')
263- get_default_dns_servers_mock.return_value = ['127.0.0.2']
264+ nameserver_addresses = ['127.0.0.2']
265+ get_default_dns_servers_mock.return_value = nameserver_addresses
266+ domain = Domain.objects.first()
267 netplan = self._render_netplan_dict(node)
268 expected_netplan = {
269 'network': {
270@@ -843,6 +859,10 @@ class TestNetplan(MAASServerTestCase):
271 'via': '10.0.0.3',
272 'metric': 42,
273 }],
274+ 'nameservers': {
275+ 'addresses': nameserver_addresses,
276+ 'search': [domain.name]
277+ },
278 },
279 'eth1': {
280 'match': {'macaddress': '02:01:02:03:04:05'},
281@@ -854,6 +874,10 @@ class TestNetplan(MAASServerTestCase):
282 'via': '10.0.1.3',
283 'metric': 43,
284 }],
285+ 'nameservers': {
286+ 'addresses': nameserver_addresses,
287+ 'search': [domain.name]
288+ },
289 },
290 },
291 },
292@@ -932,6 +956,11 @@ class TestNetplan(MAASServerTestCase):
293 get_default_dns_servers_mock = self.patch(
294 node, 'get_default_dns_servers')
295 get_default_dns_servers_mock.return_value = ['127.0.0.2']
296+ domain = Domain.objects.first()
297+ domain.name = "ubuntu.com"
298+ domain.save()
299+ domain2 = factory.make_Domain()
300+ expected_search_list = [domain.name, domain2.name]
301 netplan = self._render_netplan_dict(node)
302 expected_netplan = {
303 'network': {
304@@ -940,7 +969,8 @@ class TestNetplan(MAASServerTestCase):
305 'eth0': {
306 'gateway': '10.0.0.1',
307 'nameservers': {
308- 'addresses': ['10.0.0.2']
309+ 'addresses': ['10.0.0.2'],
310+ 'search': expected_search_list
311 },
312 'match': {'macaddress': '00:01:02:03:04:05'},
313 'mtu': 1500,
314@@ -950,7 +980,8 @@ class TestNetplan(MAASServerTestCase):
315 'eth1': {
316 'match': {'macaddress': '02:01:02:03:04:05'},
317 'nameservers': {
318- 'addresses': ['10.0.1.2']
319+ 'addresses': ['10.0.1.2'],
320+ 'search': expected_search_list
321 },
322 'mtu': 1500,
323 'set-name': 'eth1',
324@@ -973,7 +1004,7 @@ class TestNetplan(MAASServerTestCase):
325 'subnets': [{
326 'address': '10.0.0.4/24',
327 'dns_nameservers': ['10.0.0.2'],
328- 'dns_search': ['maas'],
329+ 'dns_search': expected_search_list,
330 'gateway': '10.0.0.1',
331 'type': 'static',
332 }],
333@@ -987,14 +1018,14 @@ class TestNetplan(MAASServerTestCase):
334 'subnets': [{
335 'address': '10.0.1.4/24',
336 'dns_nameservers': ['10.0.1.2'],
337- 'dns_search': ['maas'],
338+ 'dns_search': expected_search_list,
339 'type': 'static',
340 }],
341 'type': 'physical'
342 },
343 {
344 'address': ['127.0.0.2'],
345- 'search': ['maas'],
346+ 'search': expected_search_list,
347 'type': 'nameserver'
348 }
349 ],

Subscribers

People subscribed via source and target branches