Merge ~mpontillo/maas:netplan--fix-deferred-issues into maas:master
- Git
- lp:~mpontillo/maas
- netplan--fix-deferred-issues
- Merge into 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) |
||||
Related bugs: |
|
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)
Description of the change
To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote : | # |
Looks like a "lander is slow" failure. Argh.
- b4493f6... by Mike Pontillo
-
Update comments.
Revision history for this message
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b netplan-
STATUS: SUCCESS
COMMIT: b4493f6a1f386ed
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
1 | diff --git a/src/maasserver/preseed_network.py b/src/maasserver/preseed_network.py |
2 | index 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.""" |
112 | diff --git a/src/maasserver/tests/test_preseed_network.py b/src/maasserver/tests/test_preseed_network.py |
113 | index 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 | ], |
UNIT TESTS -fix-deferred- issues lp:~mpontillo/maas/+git/maas into -b master lp:~maas-committers/maas
-b netplan-
STATUS: FAILED maas-ci- jenkins. internal: 8080/job/ maas/job/ branch- tester/ 4843/console 87d2a9f2a717a96 da40f085da
LOG: http://
COMMIT: de2ba602798944f