Merge lp:~mpontillo/maas/subnet-dns-override-maas-dns-for-default-gw--bug-1576116--2.0 into lp:maas/2.0
Proposed by
Mike Pontillo
Status: | Merged |
---|---|
Approved by: | Mike Pontillo |
Approved revision: | no longer in the source branch. |
Merged at revision: | 5162 |
Proposed branch: | lp:~mpontillo/maas/subnet-dns-override-maas-dns-for-default-gw--bug-1576116--2.0 |
Merge into: | lp:maas/2.0 |
Diff against target: |
366 lines (+225/-17) 5 files modified
docs/changelog.rst (+5/-0) src/maasserver/models/node.py (+60/-5) src/maasserver/models/tests/test_node.py (+155/-0) src/maasserver/preseed_network.py (+3/-6) src/maasserver/tests/test_preseed_network.py (+2/-6) |
To merge this branch: | bzr merge lp:~mpontillo/maas/subnet-dns-override-maas-dns-for-default-gw--bug-1576116--2.0 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Mike Pontillo (community) | Approve | ||
Review via email: mp+300148@code.launchpad.net |
Commit message
Merge revision 5178 from trunk.
When deploying a node, override the MAAS DNS server with the DNS servers specified on the subnet for the default gateway, when specifying DNS servers for the loopback interface.
Description of the change
To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote : | # |
There are additional revisions which have not been approved in review. Please seek review and approval of these new revisions.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'docs/changelog.rst' | |||
2 | --- docs/changelog.rst 2016-07-14 23:49:58 +0000 | |||
3 | +++ docs/changelog.rst 2016-07-15 02:30:37 +0000 | |||
4 | @@ -15,6 +15,8 @@ | |||
5 | 15 | 15 | ||
6 | 16 | LP: #1603147 Commissioning dropdown is grey and checkmarks are missing. | 16 | LP: #1603147 Commissioning dropdown is grey and checkmarks are missing. |
7 | 17 | 17 | ||
8 | 18 | LP: #1576116 MAAS adds regions controller as DNS resolver | ||
9 | 19 | |||
10 | 18 | 20 | ||
11 | 19 | 2.0.0 (rc2) | 21 | 2.0.0 (rc2) |
12 | 20 | =========== | 22 | =========== |
13 | @@ -61,6 +63,9 @@ | |||
14 | 61 | 63 | ||
15 | 62 | LP: #1596046 [2.0] maas 2.0 pxeboot fails on PowerNV | 64 | LP: #1596046 [2.0] maas 2.0 pxeboot fails on PowerNV |
16 | 63 | 65 | ||
17 | 66 | LP: #1600267 [1.9,2.0,UX] Can't add aliases when parent interface is set to 'DCHP' | ||
18 | 67 | |||
19 | 68 | LP: #1598937 [2.0 rc1] Following fresh install maas command fails - PermissionError: [Errno 13] Permission denied: '/home/ubuntu/.maascli.db' | ||
20 | 64 | 69 | ||
21 | 65 | 2.0.0 (beta8) | 70 | 2.0.0 (beta8) |
22 | 66 | ============= | 71 | ============= |
23 | 67 | 72 | ||
24 | === modified file 'src/maasserver/models/node.py' | |||
25 | --- src/maasserver/models/node.py 2016-06-17 21:26:46 +0000 | |||
26 | +++ src/maasserver/models/node.py 2016-07-15 02:30:37 +0000 | |||
27 | @@ -209,8 +209,23 @@ | |||
28 | 209 | 209 | ||
29 | 210 | # Return type from `get_effective_power_info`. | 210 | # Return type from `get_effective_power_info`. |
30 | 211 | PowerInfo = namedtuple("PowerInfo", ( | 211 | PowerInfo = namedtuple("PowerInfo", ( |
33 | 212 | "can_be_started", "can_be_stopped", "can_be_queried", "power_type", | 212 | "can_be_started", |
34 | 213 | "power_parameters")) | 213 | "can_be_stopped", |
35 | 214 | "can_be_queried", | ||
36 | 215 | "power_type", | ||
37 | 216 | "power_parameters", | ||
38 | 217 | )) | ||
39 | 218 | |||
40 | 219 | DefaultGateways = namedtuple("DefaultGateways", ( | ||
41 | 220 | "ipv4", | ||
42 | 221 | "ipv6", | ||
43 | 222 | )) | ||
44 | 223 | |||
45 | 224 | GatewayDefinition = namedtuple("GatewayDefinition", ( | ||
46 | 225 | "interface_id", | ||
47 | 226 | "subnet_id", | ||
48 | 227 | "gateway_ip", | ||
49 | 228 | )) | ||
50 | 214 | 229 | ||
51 | 215 | # The sequence from which the decimal form of node system IDs should be | 230 | # The sequence from which the decimal form of node system IDs should be |
52 | 216 | # pulled. At the time of writing this should match the definition in migration | 231 | # pulled. At the time of writing this should match the definition in migration |
53 | @@ -2568,7 +2583,7 @@ | |||
54 | 2568 | interface.id | 2583 | interface.id |
55 | 2569 | """, (self.id,)) | 2584 | """, (self.id,)) |
56 | 2570 | return [ | 2585 | return [ |
58 | 2571 | (found[0], found[1], found[2]) | 2586 | GatewayDefinition._make((found[0], found[1], found[2])) |
59 | 2572 | for found in cursor.fetchall() | 2587 | for found in cursor.fetchall() |
60 | 2573 | ] | 2588 | ] |
61 | 2574 | 2589 | ||
62 | @@ -2620,7 +2635,7 @@ | |||
63 | 2620 | 2635 | ||
64 | 2621 | # Early out if we already have both gateways. | 2636 | # Early out if we already have both gateways. |
65 | 2622 | if gateway_ipv4 and gateway_ipv6: | 2637 | if gateway_ipv4 and gateway_ipv6: |
67 | 2623 | return (gateway_ipv4, gateway_ipv6) | 2638 | return DefaultGateways._make((gateway_ipv4, gateway_ipv6)) |
68 | 2624 | 2639 | ||
69 | 2625 | # Get the best guesses for the missing IP families. | 2640 | # Get the best guesses for the missing IP families. |
70 | 2626 | found_gateways = self.get_best_guess_for_default_gateways() | 2641 | found_gateways = self.get_best_guess_for_default_gateways() |
71 | @@ -2630,7 +2645,47 @@ | |||
72 | 2630 | if not gateway_ipv6: | 2645 | if not gateway_ipv6: |
73 | 2631 | gateway_ipv6 = self._get_gateway_tuple_by_family( | 2646 | gateway_ipv6 = self._get_gateway_tuple_by_family( |
74 | 2632 | found_gateways, IPADDRESS_FAMILY.IPv6) | 2647 | found_gateways, IPADDRESS_FAMILY.IPv6) |
76 | 2633 | return (gateway_ipv4, gateway_ipv6) | 2648 | return DefaultGateways._make((gateway_ipv4, gateway_ipv6)) |
77 | 2649 | |||
78 | 2650 | def get_default_dns_servers(self): | ||
79 | 2651 | """Return the default DNS servers for this node.""" | ||
80 | 2652 | # Circular imports. | ||
81 | 2653 | from maasserver.dns.zonegenerator import get_dns_server_address | ||
82 | 2654 | |||
83 | 2655 | gateways = self.get_default_gateways() | ||
84 | 2656 | |||
85 | 2657 | # Try first to use DNS servers from default gateway subnets. | ||
86 | 2658 | if gateways.ipv4 is not None: | ||
87 | 2659 | subnet = Subnet.objects.get(id=gateways.ipv4.subnet_id) | ||
88 | 2660 | if subnet.dns_servers is not None and len(subnet.dns_servers) > 0: | ||
89 | 2661 | # An IPv4 subnet is hosting the default gateway and has DNS | ||
90 | 2662 | # servers defined. IPv4 DNS servers take first-priority. | ||
91 | 2663 | return subnet.dns_servers | ||
92 | 2664 | if gateways.ipv6 is not None: | ||
93 | 2665 | subnet = Subnet.objects.get(id=gateways.ipv6.subnet_id) | ||
94 | 2666 | if subnet.dns_servers is not None and len(subnet.dns_servers) > 0: | ||
95 | 2667 | # An IPv6 subnet is hosting the default gateway and has DNS | ||
96 | 2668 | # servers defined. IPv6 DNS servers take second-priority. | ||
97 | 2669 | return subnet.dns_servers | ||
98 | 2670 | |||
99 | 2671 | # No default gateway subnet has specific DNS servers defined, so | ||
100 | 2672 | # use MAAS for the default DNS server. | ||
101 | 2673 | if gateways.ipv4 is None and gateways.ipv6 is None: | ||
102 | 2674 | # If there are no default gateways, the default is the MAAS | ||
103 | 2675 | # region IP address. | ||
104 | 2676 | maas_dns_server = get_dns_server_address( | ||
105 | 2677 | rack_controller=self.get_boot_rack_controller()) | ||
106 | 2678 | else: | ||
107 | 2679 | # Choose an address consistent with the primary address-family | ||
108 | 2680 | # in use, as indicated by the presence (or not) of a gateway. | ||
109 | 2681 | # Note that this path is only taken if the MAAS URL is set to | ||
110 | 2682 | # a hostname, and the hostname resolves to both an IPv4 and an | ||
111 | 2683 | # IPv6 address. | ||
112 | 2684 | maas_dns_server = get_dns_server_address( | ||
113 | 2685 | rack_controller=self.get_boot_rack_controller(), | ||
114 | 2686 | ipv4=(gateways.ipv4 is not None), | ||
115 | 2687 | ipv6=(gateways.ipv6 is not None)) | ||
116 | 2688 | return [maas_dns_server] | ||
117 | 2634 | 2689 | ||
118 | 2635 | def get_boot_purpose(self): | 2690 | def get_boot_purpose(self): |
119 | 2636 | """ | 2691 | """ |
120 | 2637 | 2692 | ||
121 | === modified file 'src/maasserver/models/tests/test_node.py' | |||
122 | --- src/maasserver/models/tests/test_node.py 2016-06-28 07:12:49 +0000 | |||
123 | +++ src/maasserver/models/tests/test_node.py 2016-07-15 02:30:37 +0000 | |||
124 | @@ -37,6 +37,7 @@ | |||
125 | 37 | from maasserver.enum import ( | 37 | from maasserver.enum import ( |
126 | 38 | FILESYSTEM_GROUP_TYPE, | 38 | FILESYSTEM_GROUP_TYPE, |
127 | 39 | FILESYSTEM_TYPE, | 39 | FILESYSTEM_TYPE, |
128 | 40 | INTERFACE_LINK_TYPE, | ||
129 | 40 | INTERFACE_TYPE, | 41 | INTERFACE_TYPE, |
130 | 41 | IPADDRESS_TYPE, | 42 | IPADDRESS_TYPE, |
131 | 42 | NODE_PERMISSION, | 43 | NODE_PERMISSION, |
132 | @@ -93,6 +94,7 @@ | |||
133 | 93 | NODE_TRANSITIONS, | 94 | NODE_TRANSITIONS, |
134 | 94 | ) | 95 | ) |
135 | 95 | from maasserver.rpc.testing.fixtures import MockLiveRegionToClusterRPCFixture | 96 | from maasserver.rpc.testing.fixtures import MockLiveRegionToClusterRPCFixture |
136 | 97 | import maasserver.server_address as server_address_module | ||
137 | 96 | from maasserver.storage_layouts import ( | 98 | from maasserver.storage_layouts import ( |
138 | 97 | StorageLayoutError, | 99 | StorageLayoutError, |
139 | 98 | StorageLayoutMissingBootDiskError, | 100 | StorageLayoutMissingBootDiskError, |
140 | @@ -134,6 +136,7 @@ | |||
141 | 134 | commissioning, | 136 | commissioning, |
142 | 135 | disk_erasing, | 137 | disk_erasing, |
143 | 136 | ) | 138 | ) |
144 | 139 | from netaddr import IPAddress | ||
145 | 137 | from provisioningserver.events import ( | 140 | from provisioningserver.events import ( |
146 | 138 | EVENT_DETAILS, | 141 | EVENT_DETAILS, |
147 | 139 | EVENT_TYPES, | 142 | EVENT_TYPES, |
148 | @@ -4101,6 +4104,158 @@ | |||
149 | 4101 | ), node.get_default_gateways()) | 4104 | ), node.get_default_gateways()) |
150 | 4102 | 4105 | ||
151 | 4103 | 4106 | ||
152 | 4107 | class TestGetDefaultDNSServers(MAASServerTestCase): | ||
153 | 4108 | """Tests for `Node.get_default_dns_servers`.""" | ||
154 | 4109 | |||
155 | 4110 | def make_Node_with_RackController( | ||
156 | 4111 | self, ipv4=True, ipv6=True, ipv4_gateway=True, ipv6_gateway=True, | ||
157 | 4112 | ipv4_subnet_dns=None, ipv6_subnet_dns=None): | ||
158 | 4113 | ipv4_subnet_dns = [] if ipv4_subnet_dns is None else ipv4_subnet_dns | ||
159 | 4114 | ipv6_subnet_dns = [] if ipv6_subnet_dns is None else ipv6_subnet_dns | ||
160 | 4115 | rack_v4 = None | ||
161 | 4116 | rack_v6 = None | ||
162 | 4117 | fabric = factory.make_Fabric() | ||
163 | 4118 | vlan = fabric.get_default_vlan() | ||
164 | 4119 | if ipv4: | ||
165 | 4120 | gateway_ip = None if ipv4_gateway else "" | ||
166 | 4121 | v4_subnet = factory.make_Subnet( | ||
167 | 4122 | version=4, vlan=vlan, dns_servers=ipv4_subnet_dns, | ||
168 | 4123 | gateway_ip=gateway_ip) | ||
169 | 4124 | if ipv6: | ||
170 | 4125 | gateway_ip = None if ipv6_gateway else "" | ||
171 | 4126 | v6_subnet = factory.make_Subnet( | ||
172 | 4127 | version=6, vlan=vlan, dns_servers=ipv6_subnet_dns, | ||
173 | 4128 | gateway_ip=gateway_ip) | ||
174 | 4129 | rack = factory.make_RegionRackController() | ||
175 | 4130 | vlan.primary_rack = rack | ||
176 | 4131 | vlan.dhcp_on = True | ||
177 | 4132 | vlan.save() | ||
178 | 4133 | # In order to determine the correct IP address per-address-family, | ||
179 | 4134 | # a name lookup is performed on the hostname part of the URL. | ||
180 | 4135 | # We need to mock that so we can return whatever IP addresses it | ||
181 | 4136 | # resolves to. | ||
182 | 4137 | rack.url = "http://region:5240/MAAS/" | ||
183 | 4138 | if ipv4: | ||
184 | 4139 | rack_v4 = factory.pick_ip_in_Subnet(v4_subnet) | ||
185 | 4140 | if ipv6: | ||
186 | 4141 | rack_v6 = factory.pick_ip_in_Subnet(v6_subnet) | ||
187 | 4142 | |||
188 | 4143 | def get_address(hostname, ip_version=4): | ||
189 | 4144 | """Mock function to return the IP address of the rack based on the | ||
190 | 4145 | given address family. | ||
191 | 4146 | """ | ||
192 | 4147 | if ip_version == 4: | ||
193 | 4148 | return {IPAddress(rack_v4)} if rack_v4 else set() | ||
194 | 4149 | elif ip_version == 6: | ||
195 | 4150 | return {IPAddress(rack_v6)} if rack_v6 else set() | ||
196 | 4151 | |||
197 | 4152 | resolve_hostname = self.patch( | ||
198 | 4153 | server_address_module, 'resolve_hostname') | ||
199 | 4154 | resolve_hostname.side_effect = get_address | ||
200 | 4155 | rack.interface_set.all().delete() | ||
201 | 4156 | rackif = factory.make_Interface(vlan=vlan, node=rack) | ||
202 | 4157 | if ipv4: | ||
203 | 4158 | rackif.link_subnet(INTERFACE_LINK_TYPE.STATIC, v4_subnet, rack_v4) | ||
204 | 4159 | if ipv6: | ||
205 | 4160 | rackif.link_subnet(INTERFACE_LINK_TYPE.STATIC, v6_subnet, rack_v6) | ||
206 | 4161 | rack.boot_interface = rackif | ||
207 | 4162 | rack.save() | ||
208 | 4163 | node = factory.make_Node(status=NODE_STATUS.READY, disable_ipv4=False) | ||
209 | 4164 | nodeif = factory.make_Interface(vlan=vlan, node=node) | ||
210 | 4165 | if ipv4: | ||
211 | 4166 | nodeif.link_subnet(INTERFACE_LINK_TYPE.AUTO, v4_subnet) | ||
212 | 4167 | if ipv6: | ||
213 | 4168 | nodeif.link_subnet(INTERFACE_LINK_TYPE.AUTO, v6_subnet) | ||
214 | 4169 | node.boot_interface = nodeif | ||
215 | 4170 | node.save() | ||
216 | 4171 | return rack_v4, rack_v6, node | ||
217 | 4172 | |||
218 | 4173 | def test__uses_rack_ipv4_if_ipv4_only_with_no_gateway(self): | ||
219 | 4174 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
220 | 4175 | ipv4=True, ipv4_gateway=False, ipv6=False, ipv6_gateway=False) | ||
221 | 4176 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v4])) | ||
222 | 4177 | |||
223 | 4178 | def test__uses_rack_ipv4_if_ipv4_only_with_no_gateway_v4_dns(self): | ||
224 | 4179 | ipv4_subnet_dns = factory.make_ip_address(ipv6=False) | ||
225 | 4180 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
226 | 4181 | ipv4=True, ipv4_gateway=False, ipv6=False, ipv6_gateway=False, | ||
227 | 4182 | ipv4_subnet_dns=[ipv4_subnet_dns]) | ||
228 | 4183 | self.assertThat( | ||
229 | 4184 | node.get_default_dns_servers(), Equals([rack_v4])) | ||
230 | 4185 | |||
231 | 4186 | def test__uses_rack_ipv6_if_ipv6_only_with_no_gateway_v6_dns(self): | ||
232 | 4187 | ipv6_subnet_dns = factory.make_ip_address(ipv6=True) | ||
233 | 4188 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
234 | 4189 | ipv4=False, ipv4_gateway=False, ipv6=True, ipv6_gateway=False, | ||
235 | 4190 | ipv6_subnet_dns=[ipv6_subnet_dns]) | ||
236 | 4191 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v6])) | ||
237 | 4192 | |||
238 | 4193 | def test__uses_rack_ipv4_if_dual_stack_with_no_gateway(self): | ||
239 | 4194 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
240 | 4195 | ipv4=True, ipv4_gateway=False, ipv6=True, ipv6_gateway=False) | ||
241 | 4196 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v4])) | ||
242 | 4197 | |||
243 | 4198 | def test__uses_rack_ipv4_if_dual_stack_with_ipv4_gateway(self): | ||
244 | 4199 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
245 | 4200 | ipv4=True, ipv4_gateway=True, ipv6=True, ipv6_gateway=False) | ||
246 | 4201 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v4])) | ||
247 | 4202 | |||
248 | 4203 | def test__uses_subnet_ipv4_if_dual_stack_with_ipv4_gateway_with_dns(self): | ||
249 | 4204 | ipv4_subnet_dns = factory.make_ip_address(ipv6=False) | ||
250 | 4205 | ipv6_subnet_dns = factory.make_ip_address(ipv6=True) | ||
251 | 4206 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
252 | 4207 | ipv4=True, ipv4_gateway=True, ipv6=True, ipv6_gateway=False, | ||
253 | 4208 | ipv4_subnet_dns=[ipv4_subnet_dns], | ||
254 | 4209 | ipv6_subnet_dns=[ipv6_subnet_dns]) | ||
255 | 4210 | self.assertThat( | ||
256 | 4211 | node.get_default_dns_servers(), Equals([ipv4_subnet_dns])) | ||
257 | 4212 | |||
258 | 4213 | def test__uses_rack_ipv6_if_dual_stack_with_ipv6_gateway(self): | ||
259 | 4214 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
260 | 4215 | ipv4=True, ipv4_gateway=False, ipv6=True, ipv6_gateway=True) | ||
261 | 4216 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v6])) | ||
262 | 4217 | |||
263 | 4218 | def test__uses_subnet_ipv6_if_dual_stack_with_ipv6_gateway(self): | ||
264 | 4219 | ipv4_subnet_dns = factory.make_ip_address(ipv6=False) | ||
265 | 4220 | ipv6_subnet_dns = factory.make_ip_address(ipv6=True) | ||
266 | 4221 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
267 | 4222 | ipv4=True, ipv4_gateway=False, ipv6=True, ipv6_gateway=True, | ||
268 | 4223 | ipv4_subnet_dns=[ipv4_subnet_dns], | ||
269 | 4224 | ipv6_subnet_dns=[ipv6_subnet_dns]) | ||
270 | 4225 | self.assertThat( | ||
271 | 4226 | node.get_default_dns_servers(), Equals([ipv6_subnet_dns])) | ||
272 | 4227 | |||
273 | 4228 | def test__uses_rack_ipv4_if_ipv4_with_ipv4_gateway(self): | ||
274 | 4229 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
275 | 4230 | ipv4=True, ipv4_gateway=True, ipv6=False, ipv6_gateway=False) | ||
276 | 4231 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v4])) | ||
277 | 4232 | |||
278 | 4233 | def test__uses_subnet_ipv4_if_ipv4_stack_with_ipv4_gateway_and_dns(self): | ||
279 | 4234 | ipv4_subnet_dns = factory.make_ip_address(ipv6=False) | ||
280 | 4235 | ipv6_subnet_dns = factory.make_ip_address(ipv6=True) | ||
281 | 4236 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
282 | 4237 | ipv4=True, ipv4_gateway=True, ipv6=False, ipv6_gateway=False, | ||
283 | 4238 | ipv4_subnet_dns=[ipv4_subnet_dns], | ||
284 | 4239 | ipv6_subnet_dns=[ipv6_subnet_dns]) | ||
285 | 4240 | self.assertThat( | ||
286 | 4241 | node.get_default_dns_servers(), Equals([ipv4_subnet_dns])) | ||
287 | 4242 | |||
288 | 4243 | def test__uses_rack_ipv6_if_ipv6_with_ipv6_gateway(self): | ||
289 | 4244 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
290 | 4245 | ipv4=False, ipv4_gateway=False, ipv6=True, ipv6_gateway=True) | ||
291 | 4246 | self.assertThat(node.get_default_dns_servers(), Equals([rack_v6])) | ||
292 | 4247 | |||
293 | 4248 | def test__uses_subnet_ipv6_if_ipv6_with_ipv6_gateway_and_dns(self): | ||
294 | 4249 | ipv4_subnet_dns = factory.make_ip_address(ipv6=False) | ||
295 | 4250 | ipv6_subnet_dns = factory.make_ip_address(ipv6=True) | ||
296 | 4251 | rack_v4, rack_v6, node = self.make_Node_with_RackController( | ||
297 | 4252 | ipv4=False, ipv4_gateway=False, ipv6=True, ipv6_gateway=True, | ||
298 | 4253 | ipv4_subnet_dns=[ipv4_subnet_dns], | ||
299 | 4254 | ipv6_subnet_dns=[ipv6_subnet_dns]) | ||
300 | 4255 | self.assertThat( | ||
301 | 4256 | node.get_default_dns_servers(), Equals([ipv6_subnet_dns])) | ||
302 | 4257 | |||
303 | 4258 | |||
304 | 4104 | class TestNode_Start(MAASServerTestCase): | 4259 | class TestNode_Start(MAASServerTestCase): |
305 | 4105 | """Tests for Node.start().""" | 4260 | """Tests for Node.start().""" |
306 | 4106 | 4261 | ||
307 | 4107 | 4262 | ||
308 | === modified file 'src/maasserver/preseed_network.py' | |||
309 | --- src/maasserver/preseed_network.py 2016-03-28 13:54:47 +0000 | |||
310 | +++ src/maasserver/preseed_network.py 2016-07-15 02:30:37 +0000 | |||
311 | @@ -6,10 +6,7 @@ | |||
312 | 6 | __all__ = [ | 6 | __all__ = [ |
313 | 7 | ] | 7 | ] |
314 | 8 | 8 | ||
319 | 9 | from maasserver.dns.zonegenerator import ( | 9 | from maasserver.dns.zonegenerator import get_dns_search_paths |
316 | 10 | get_dns_search_paths, | ||
317 | 11 | get_dns_server_address, | ||
318 | 12 | ) | ||
320 | 13 | from maasserver.enum import ( | 10 | from maasserver.enum import ( |
321 | 14 | INTERFACE_TYPE, | 11 | INTERFACE_TYPE, |
322 | 15 | IPADDRESS_FAMILY, | 12 | IPADDRESS_FAMILY, |
323 | @@ -24,6 +21,7 @@ | |||
324 | 24 | def __init__(self, node): | 21 | def __init__(self, node): |
325 | 25 | self.node = node | 22 | self.node = node |
326 | 26 | self.gateways = node.get_default_gateways() | 23 | self.gateways = node.get_default_gateways() |
327 | 24 | self.dns_servers = node.get_default_dns_servers() | ||
328 | 27 | self.gateway_ipv4_set = False | 25 | self.gateway_ipv4_set = False |
329 | 28 | self.gateway_ipv6_set = False | 26 | self.gateway_ipv6_set = False |
330 | 29 | self.operations = { | 27 | self.operations = { |
331 | @@ -51,8 +49,7 @@ | |||
332 | 51 | 49 | ||
333 | 52 | self.network_config.append({ | 50 | self.network_config.append({ |
334 | 53 | "type": "nameserver", | 51 | "type": "nameserver", |
337 | 54 | "address": get_dns_server_address( | 52 | "address": self.dns_servers, |
336 | 55 | rack_controller=self.node.get_boot_rack_controller()), | ||
338 | 56 | "search": sorted(get_dns_search_paths()), | 53 | "search": sorted(get_dns_search_paths()), |
339 | 57 | }) | 54 | }) |
340 | 58 | 55 | ||
341 | 59 | 56 | ||
342 | === modified file 'src/maasserver/tests/test_preseed_network.py' | |||
343 | --- src/maasserver/tests/test_preseed_network.py 2016-04-15 23:38:27 +0000 | |||
344 | +++ src/maasserver/tests/test_preseed_network.py 2016-07-15 02:30:37 +0000 | |||
345 | @@ -8,10 +8,7 @@ | |||
346 | 8 | import random | 8 | import random |
347 | 9 | from textwrap import dedent | 9 | from textwrap import dedent |
348 | 10 | 10 | ||
353 | 11 | from maasserver.dns.zonegenerator import ( | 11 | from maasserver.dns.zonegenerator import get_dns_search_paths |
350 | 12 | get_dns_search_paths, | ||
351 | 13 | get_dns_server_address, | ||
352 | 14 | ) | ||
354 | 15 | from maasserver.enum import ( | 12 | from maasserver.enum import ( |
355 | 16 | INTERFACE_TYPE, | 13 | INTERFACE_TYPE, |
356 | 17 | IPADDRESS_FAMILY, | 14 | IPADDRESS_FAMILY, |
357 | @@ -203,8 +200,7 @@ | |||
358 | 203 | 200 | ||
359 | 204 | def collectDNSConfig(self, node): | 201 | def collectDNSConfig(self, node): |
360 | 205 | config = "- type: nameserver\n address: %s\n search:\n" % ( | 202 | config = "- type: nameserver\n address: %s\n search:\n" % ( |
363 | 206 | get_dns_server_address( | 203 | repr(node.get_default_dns_servers())) |
362 | 207 | rack_controller=node.get_boot_primary_rack_controller())) | ||
364 | 208 | dns_searches = sorted(get_dns_search_paths()) | 204 | dns_searches = sorted(get_dns_search_paths()) |
365 | 209 | for dns_name in dns_searches: | 205 | for dns_name in dns_searches: |
366 | 210 | config += " - %s\n" % dns_name | 206 | config += " - %s\n" % dns_name |
Self-approved backport.