Merge ~cgrabowski/maas:ensure_dns_is_reloaded_on_restart into maas:master
- Git
- lp:~cgrabowski/maas
- ensure_dns_is_reloaded_on_restart
- Merge into master
Proposed by
Christian Grabowski
Status: | Merged |
---|---|
Approved by: | Adam Collard |
Approved revision: | 9a1ab127cd05237e2610d5b761e9536573da44bb |
Merge reported by: | MAAS Lander |
Merged at revision: | not available |
Proposed branch: | ~cgrabowski/maas:ensure_dns_is_reloaded_on_restart |
Merge into: | maas:master |
Diff against target: |
306 lines (+125/-28) 5 files modified
src/maasserver/region_controller.py (+2/-2) src/maasserver/tests/test_region_controller.py (+20/-7) src/maasserver/triggers/system.py (+42/-17) src/maasserver/triggers/tests/test_init.py (+2/-0) src/maasserver/triggers/tests/test_system.py (+59/-2) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Adam Collard (community) | Approve | ||
MAAS Lander | Approve | ||
Review via email: mp+435228@code.launchpad.net |
Commit message
start region controller loop with conditions to reload DNS
reload DNS when a controller is modified
Description of the change
To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote : | # |
UNIT TESTS
-b ensure_
STATUS: SUCCESS
COMMIT: 9a1ab127cd05237
review:
Approve
Revision history for this message
Adam Collard (adam-collard) : | # |
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/region_controller.py b/src/maasserver/region_controller.py | |||
2 | index 69eae10..a7fa69c 100644 | |||
3 | --- a/src/maasserver/region_controller.py | |||
4 | +++ b/src/maasserver/region_controller.py | |||
5 | @@ -94,11 +94,11 @@ class RegionControllerService(Service): | |||
6 | 94 | self.processing = LoopingCall(self.process) | 94 | self.processing = LoopingCall(self.process) |
7 | 95 | self.processing.clock = self.clock | 95 | self.processing.clock = self.clock |
8 | 96 | self.processingDefer = None | 96 | self.processingDefer = None |
10 | 97 | self.needsDNSUpdate = False | 97 | self.needsDNSUpdate = True # reload DNS on start of region |
11 | 98 | self.needsProxyUpdate = False | 98 | self.needsProxyUpdate = False |
12 | 99 | self.needsRBACUpdate = False | 99 | self.needsRBACUpdate = False |
13 | 100 | self._dns_updates = [] | 100 | self._dns_updates = [] |
15 | 101 | self._dns_requires_full_reload = False | 101 | self._dns_requires_full_reload = True |
16 | 102 | self.postgresListener = postgresListener | 102 | self.postgresListener = postgresListener |
17 | 103 | self.dnsResolver = Resolver( | 103 | self.dnsResolver = Resolver( |
18 | 104 | resolv=None, | 104 | resolv=None, |
19 | diff --git a/src/maasserver/tests/test_region_controller.py b/src/maasserver/tests/test_region_controller.py | |||
20 | index 4f40354..4e97cdd 100644 | |||
21 | --- a/src/maasserver/tests/test_region_controller.py | |||
22 | +++ b/src/maasserver/tests/test_region_controller.py | |||
23 | @@ -53,7 +53,7 @@ class TestRegionControllerService(MAASServerTestCase): | |||
24 | 53 | MatchesStructure.byEquality( | 53 | MatchesStructure.byEquality( |
25 | 54 | clock=reactor, | 54 | clock=reactor, |
26 | 55 | processingDefer=None, | 55 | processingDefer=None, |
28 | 56 | needsDNSUpdate=False, | 56 | needsDNSUpdate=True, |
29 | 57 | postgresListener=sentinel.listener, | 57 | postgresListener=sentinel.listener, |
30 | 58 | ), | 58 | ), |
31 | 59 | ) | 59 | ) |
32 | @@ -157,6 +157,19 @@ class TestRegionControllerService(MAASServerTestCase): | |||
33 | 157 | 157 | ||
34 | 158 | @wait_for_reactor | 158 | @wait_for_reactor |
35 | 159 | @inlineCallbacks | 159 | @inlineCallbacks |
36 | 160 | def test_reload_dns_on_start(self): | ||
37 | 161 | service = self.make_service(sentinel.listener) | ||
38 | 162 | mock_dns_update_all_zones = self.patch( | ||
39 | 163 | region_controller, "dns_update_all_zones" | ||
40 | 164 | ) | ||
41 | 165 | service.startProcessing() | ||
42 | 166 | yield service.processingDefer | ||
43 | 167 | mock_dns_update_all_zones.assert_called_once() | ||
44 | 168 | self.assertFalse(service.needsDNSUpdate) | ||
45 | 169 | self.assertFalse(service._dns_requires_full_reload) | ||
46 | 170 | |||
47 | 171 | @wait_for_reactor | ||
48 | 172 | @inlineCallbacks | ||
49 | 160 | def test_process_doesnt_update_zones_when_nothing_to_process(self): | 173 | def test_process_doesnt_update_zones_when_nothing_to_process(self): |
50 | 161 | service = self.make_service(sentinel.listener) | 174 | service = self.make_service(sentinel.listener) |
51 | 162 | service.needsDNSUpdate = False | 175 | service.needsDNSUpdate = False |
52 | @@ -218,7 +231,7 @@ class TestRegionControllerService(MAASServerTestCase): | |||
53 | 218 | service.startProcessing() | 231 | service.startProcessing() |
54 | 219 | yield service.processingDefer | 232 | yield service.processingDefer |
55 | 220 | mock_dns_update_all_zones.assert_called_once_with( | 233 | mock_dns_update_all_zones.assert_called_once_with( |
57 | 221 | dynamic_updates=[], requires_reload=False | 234 | dynamic_updates=[], requires_reload=True |
58 | 222 | ) | 235 | ) |
59 | 223 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) | 236 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) |
60 | 224 | self.assertThat( | 237 | self.assertThat( |
61 | @@ -263,7 +276,7 @@ class TestRegionControllerService(MAASServerTestCase): | |||
62 | 263 | self.assertThat( | 276 | self.assertThat( |
63 | 264 | mock_dns_update_all_zones, | 277 | mock_dns_update_all_zones, |
64 | 265 | MockCallsMatch( | 278 | MockCallsMatch( |
66 | 266 | call(dynamic_updates=[], requires_reload=False), | 279 | call(dynamic_updates=[], requires_reload=True), |
67 | 267 | call(dynamic_updates=[], requires_reload=False), | 280 | call(dynamic_updates=[], requires_reload=False), |
68 | 268 | ), | 281 | ), |
69 | 269 | ) | 282 | ) |
70 | @@ -321,7 +334,7 @@ class TestRegionControllerService(MAASServerTestCase): | |||
71 | 321 | service.startProcessing() | 334 | service.startProcessing() |
72 | 322 | yield service.processingDefer | 335 | yield service.processingDefer |
73 | 323 | mock_dns_update_all_zones.assert_called_once_with( | 336 | mock_dns_update_all_zones.assert_called_once_with( |
75 | 324 | dynamic_updates=[], requires_reload=False | 337 | dynamic_updates=[], requires_reload=True |
76 | 325 | ) | 338 | ) |
77 | 326 | self.assertThat( | 339 | self.assertThat( |
78 | 327 | mock_err, MockCalledOnceWith(ANY, "Failed configuring DNS.") | 340 | mock_err, MockCalledOnceWith(ANY, "Failed configuring DNS.") |
79 | @@ -410,7 +423,7 @@ class TestRegionControllerService(MAASServerTestCase): | |||
80 | 410 | service.startProcessing() | 423 | service.startProcessing() |
81 | 411 | yield service.processingDefer | 424 | yield service.processingDefer |
82 | 412 | mock_dns_update_all_zones.assert_called_once_with( | 425 | mock_dns_update_all_zones.assert_called_once_with( |
84 | 413 | dynamic_updates=[], requires_reload=False | 426 | dynamic_updates=[], requires_reload=True |
85 | 414 | ) | 427 | ) |
86 | 415 | mock_proxy_update_config.assert_called_once_with(reload_proxy=True) | 428 | mock_proxy_update_config.assert_called_once_with(reload_proxy=True) |
87 | 416 | mock_rbacSync.assert_called_once() | 429 | mock_rbacSync.assert_called_once() |
88 | @@ -635,7 +648,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase): | |||
89 | 635 | service.startProcessing() | 648 | service.startProcessing() |
90 | 636 | yield service.processingDefer | 649 | yield service.processingDefer |
91 | 637 | mock_dns_update_all_zones.assert_called_once_with( | 650 | mock_dns_update_all_zones.assert_called_once_with( |
93 | 638 | dynamic_updates=[], requires_reload=False | 651 | dynamic_updates=[], requires_reload=True |
94 | 639 | ) | 652 | ) |
95 | 640 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) | 653 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) |
96 | 641 | self.assertThat( | 654 | self.assertThat( |
97 | @@ -681,7 +694,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase): | |||
98 | 681 | for publication in reversed(publications[1:]) | 694 | for publication in reversed(publications[1:]) |
99 | 682 | ) | 695 | ) |
100 | 683 | mock_dns_update_all_zones.assert_called_once_with( | 696 | mock_dns_update_all_zones.assert_called_once_with( |
102 | 684 | dynamic_updates=[], requires_reload=False | 697 | dynamic_updates=[], requires_reload=True |
103 | 685 | ) | 698 | ) |
104 | 686 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) | 699 | self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result)) |
105 | 687 | self.assertThat(mock_msg, MockCalledOnceWith(expected_msg)) | 700 | self.assertThat(mock_msg, MockCalledOnceWith(expected_msg)) |
106 | diff --git a/src/maasserver/triggers/system.py b/src/maasserver/triggers/system.py | |||
107 | index 3f7f328..8e5ba5a 100644 | |||
108 | --- a/src/maasserver/triggers/system.py | |||
109 | +++ b/src/maasserver/triggers/system.py | |||
110 | @@ -12,6 +12,7 @@ for. | |||
111 | 12 | 12 | ||
112 | 13 | from textwrap import dedent | 13 | from textwrap import dedent |
113 | 14 | 14 | ||
114 | 15 | from maasserver.enum import NODE_TYPE | ||
115 | 15 | from maasserver.models.dnspublication import zone_serial | 16 | from maasserver.models.dnspublication import zone_serial |
116 | 16 | from maasserver.triggers import register_procedure, register_trigger | 17 | from maasserver.triggers import register_procedure, register_trigger |
117 | 17 | from maasserver.utils.orm import transactional | 18 | from maasserver.utils.orm import transactional |
118 | @@ -2131,22 +2132,34 @@ dns_dynamic_update_static_ip_address_update = dedent( | |||
119 | 2131 | """ | 2132 | """ |
120 | 2132 | ) | 2133 | ) |
121 | 2133 | 2134 | ||
138 | 2134 | dns_dynamic_update_node_delete = dedent( | 2135 | |
139 | 2135 | """\ | 2136 | def render_dns_dynamic_update_node(op): |
140 | 2136 | CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_delete() | 2137 | return dedent( |
141 | 2137 | RETURNS trigger as $$ | 2138 | f"""\ |
142 | 2138 | DECLARE | 2139 | CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_{op}() |
143 | 2139 | hostname text; | 2140 | RETURNS trigger as $$ |
144 | 2140 | domain text; | 2141 | DECLARE |
145 | 2141 | address_ttl int; | 2142 | hostname text; |
146 | 2142 | BEGIN | 2143 | domain text; |
147 | 2143 | SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id; | 2144 | address_ttl int; |
148 | 2144 | PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A'); | 2145 | BEGIN |
149 | 2145 | RETURN NULL; | 2146 | IF ((TG_OP = 'INSERT' OR TG_OP = 'UPDATE') AND TG_LEVEL = 'ROW') THEN |
150 | 2146 | END; | 2147 | IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN |
151 | 2147 | $$ LANGUAGE plpgsql; | 2148 | PERFORM pg_notify('sys_dns_updates', 'RELOAD'); |
152 | 2148 | """ | 2149 | END IF; |
153 | 2149 | ) | 2150 | ELSE |
154 | 2151 | IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN | ||
155 | 2152 | PERFORM pg_notify('sys_dns_updates', 'RELOAD'); | ||
156 | 2153 | ELSE | ||
157 | 2154 | SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id; | ||
158 | 2155 | PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A'); | ||
159 | 2156 | END IF; | ||
160 | 2157 | END IF; | ||
161 | 2158 | RETURN NULL; | ||
162 | 2159 | END; | ||
163 | 2160 | $$ LANGUAGE plpgsql; | ||
164 | 2161 | """ | ||
165 | 2162 | ) | ||
166 | 2150 | 2163 | ||
167 | 2151 | 2164 | ||
168 | 2152 | dns_dynamic_update_interface_delete = dedent( | 2165 | dns_dynamic_update_interface_delete = dedent( |
169 | @@ -2543,7 +2556,19 @@ def register_system_triggers(): | |||
170 | 2543 | "sys_dns_updates_ip_update", | 2556 | "sys_dns_updates_ip_update", |
171 | 2544 | "update", | 2557 | "update", |
172 | 2545 | ) | 2558 | ) |
174 | 2546 | register_procedure(dns_dynamic_update_node_delete) | 2559 | register_procedure(render_dns_dynamic_update_node("insert")) |
175 | 2560 | register_trigger( | ||
176 | 2561 | "maasserver_node", | ||
177 | 2562 | "sys_dns_updates_maasserver_node_insert", | ||
178 | 2563 | "insert", | ||
179 | 2564 | ) | ||
180 | 2565 | register_procedure(render_dns_dynamic_update_node("update")) | ||
181 | 2566 | register_trigger( | ||
182 | 2567 | "maasserver_node", | ||
183 | 2568 | "sys_dns_updates_maasserver_node_update", | ||
184 | 2569 | "update", | ||
185 | 2570 | ) | ||
186 | 2571 | register_procedure(render_dns_dynamic_update_node("delete")) | ||
187 | 2547 | register_trigger( | 2572 | register_trigger( |
188 | 2548 | "maasserver_node", | 2573 | "maasserver_node", |
189 | 2549 | "sys_dns_updates_maasserver_node_delete", | 2574 | "sys_dns_updates_maasserver_node_delete", |
190 | diff --git a/src/maasserver/triggers/tests/test_init.py b/src/maasserver/triggers/tests/test_init.py | |||
191 | index 34395f1..73bfcde 100644 | |||
192 | --- a/src/maasserver/triggers/tests/test_init.py | |||
193 | +++ b/src/maasserver/triggers/tests/test_init.py | |||
194 | @@ -102,6 +102,8 @@ class TestTriggersUsed(MAASServerTestCase): | |||
195 | 102 | "node_sys_dhcp_node_update", | 102 | "node_sys_dhcp_node_update", |
196 | 103 | "node_sys_dns_node_delete", | 103 | "node_sys_dns_node_delete", |
197 | 104 | "node_sys_dns_node_update", | 104 | "node_sys_dns_node_update", |
198 | 105 | "node_sys_dns_updates_maasserver_node_insert", | ||
199 | 106 | "node_sys_dns_updates_maasserver_node_update", | ||
200 | 105 | "node_sys_dns_updates_maasserver_node_delete", | 107 | "node_sys_dns_updates_maasserver_node_delete", |
201 | 106 | "rbacsync_sys_rbac_sync", | 108 | "rbacsync_sys_rbac_sync", |
202 | 107 | "regionrackrpcconnection_sys_core_rpc_delete", | 109 | "regionrackrpcconnection_sys_core_rpc_delete", |
203 | diff --git a/src/maasserver/triggers/tests/test_system.py b/src/maasserver/triggers/tests/test_system.py | |||
204 | index 4337984..ce7398e 100644 | |||
205 | --- a/src/maasserver/triggers/tests/test_system.py | |||
206 | +++ b/src/maasserver/triggers/tests/test_system.py | |||
207 | @@ -7,7 +7,7 @@ from contextlib import closing | |||
208 | 7 | from django.db import connection | 7 | from django.db import connection |
209 | 8 | from twisted.internet.defer import inlineCallbacks | 8 | from twisted.internet.defer import inlineCallbacks |
210 | 9 | 9 | ||
212 | 10 | from maasserver.enum import NODE_STATUS | 10 | from maasserver.enum import NODE_STATUS, NODE_TYPE |
213 | 11 | from maasserver.models import Domain | 11 | from maasserver.models import Domain |
214 | 12 | from maasserver.models.dnspublication import zone_serial | 12 | from maasserver.models.dnspublication import zone_serial |
215 | 13 | from maasserver.testing.factory import factory | 13 | from maasserver.testing.factory import factory |
216 | @@ -386,11 +386,20 @@ class TestSysDNSUpdates( | |||
217 | 386 | subnet = yield deferToDatabase( | 386 | subnet = yield deferToDatabase( |
218 | 387 | self.create_subnet, params={"vlan": vlan} | 387 | self.create_subnet, params={"vlan": vlan} |
219 | 388 | ) | 388 | ) |
220 | 389 | rack_controller = yield deferToDatabase( | ||
221 | 390 | self.create_rack_controller, | ||
222 | 391 | params={"vlan": vlan, "subnet": subnet}, | ||
223 | 392 | ) | ||
224 | 389 | self.start_reading() | 393 | self.start_reading() |
225 | 390 | try: | 394 | try: |
226 | 391 | node = yield deferToDatabase( | 395 | node = yield deferToDatabase( |
227 | 392 | self.create_node_with_interface, | 396 | self.create_node_with_interface, |
229 | 393 | params={"subnet": subnet, "status": NODE_STATUS.DEPLOYED}, | 397 | params={ |
230 | 398 | "subnet": subnet, | ||
231 | 399 | "status": NODE_STATUS.DEPLOYED, | ||
232 | 400 | "node_type": NODE_TYPE.MACHINE, | ||
233 | 401 | "primary_rack": rack_controller, | ||
234 | 402 | }, | ||
235 | 394 | ) | 403 | ) |
236 | 395 | domain = yield deferToDatabase(Domain.objects.get_default_domain) | 404 | domain = yield deferToDatabase(Domain.objects.get_default_domain) |
237 | 396 | expected_iface = yield deferToDatabase( | 405 | expected_iface = yield deferToDatabase( |
238 | @@ -438,6 +447,10 @@ class TestSysDNSUpdates( | |||
239 | 438 | self.create_subnet, params={"vlan": vlan} | 447 | self.create_subnet, params={"vlan": vlan} |
240 | 439 | ) | 448 | ) |
241 | 440 | domain = yield deferToDatabase(self.create_domain) | 449 | domain = yield deferToDatabase(self.create_domain) |
242 | 450 | rack_controller = yield deferToDatabase( | ||
243 | 451 | self.create_rack_controller, | ||
244 | 452 | params={"vlan": vlan, "subnet": subnet}, | ||
245 | 453 | ) | ||
246 | 441 | self.start_reading() | 454 | self.start_reading() |
247 | 442 | try: | 455 | try: |
248 | 443 | node = yield deferToDatabase( | 456 | node = yield deferToDatabase( |
249 | @@ -446,6 +459,8 @@ class TestSysDNSUpdates( | |||
250 | 446 | "subnet": subnet, | 459 | "subnet": subnet, |
251 | 447 | "status": NODE_STATUS.DEPLOYED, | 460 | "status": NODE_STATUS.DEPLOYED, |
252 | 448 | "domain": domain, | 461 | "domain": domain, |
253 | 462 | "node_type": NODE_TYPE.MACHINE, | ||
254 | 463 | "primary_rack": rack_controller, | ||
255 | 449 | }, | 464 | }, |
256 | 450 | ) | 465 | ) |
257 | 451 | expected_iface = yield deferToDatabase( | 466 | expected_iface = yield deferToDatabase( |
258 | @@ -589,6 +604,48 @@ class TestSysDNSUpdates( | |||
259 | 589 | 604 | ||
260 | 590 | @wait_for_reactor | 605 | @wait_for_reactor |
261 | 591 | @inlineCallbacks | 606 | @inlineCallbacks |
262 | 607 | def test_dns_dynamic_update_controller_insert(self): | ||
263 | 608 | listener = self.make_listener_without_delay() | ||
264 | 609 | yield self.set_service(listener) | ||
265 | 610 | yield deferToDatabase( | ||
266 | 611 | self.register_trigger, | ||
267 | 612 | "maasserver_node", | ||
268 | 613 | "sys_dns_updates", | ||
269 | 614 | ops=("insert",), | ||
270 | 615 | ) | ||
271 | 616 | self.start_reading() | ||
272 | 617 | try: | ||
273 | 618 | yield deferToDatabase(self.create_rack_controller) | ||
274 | 619 | msg = yield self.get_notify("sys_dns_updates") | ||
275 | 620 | self.assertEqual(msg, "RELOAD") | ||
276 | 621 | finally: | ||
277 | 622 | self.stop_reading() | ||
278 | 623 | yield self.postgres_listener_service.stopService() | ||
279 | 624 | |||
280 | 625 | @wait_for_reactor | ||
281 | 626 | @inlineCallbacks | ||
282 | 627 | def test_dns_dynamic_update_controller_update(self): | ||
283 | 628 | listener = self.make_listener_without_delay() | ||
284 | 629 | yield self.set_service(listener) | ||
285 | 630 | yield deferToDatabase( | ||
286 | 631 | self.register_trigger, | ||
287 | 632 | "maasserver_node", | ||
288 | 633 | "sys_dns_updates", | ||
289 | 634 | ops=("update",), | ||
290 | 635 | ) | ||
291 | 636 | self.start_reading() | ||
292 | 637 | controller = yield deferToDatabase(self.create_rack_controller) | ||
293 | 638 | try: | ||
294 | 639 | controller.cpu_speed = 10 | ||
295 | 640 | yield deferToDatabase(controller.save) | ||
296 | 641 | msg = yield self.get_notify("sys_dns_updates") | ||
297 | 642 | self.assertEqual(msg, "RELOAD") | ||
298 | 643 | finally: | ||
299 | 644 | self.stop_reading() | ||
300 | 645 | yield self.postgres_listener_service.stopService() | ||
301 | 646 | |||
302 | 647 | @wait_for_reactor | ||
303 | 648 | @inlineCallbacks | ||
304 | 592 | def test_dns_dynamic_update_node_delete(self): | 649 | def test_dns_dynamic_update_node_delete(self): |
305 | 593 | listener = self.make_listener_without_delay() | 650 | listener = self.make_listener_without_delay() |
306 | 594 | yield self.set_service(listener) | 651 | yield self.set_service(listener) |
UNIT TESTS dns_is_ reloaded_ on_restart lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas
-b ensure_
STATUS: FAILED maas-ci. internal: 8080/job/ maas-tester/ 1692/consoleTex t 344c03c1d0fb0f3 0c27be1b05
LOG: http://
COMMIT: d300e33eabd401c