Merge ~cgrabowski/maas:ensure_dns_is_reloaded_on_restart into maas: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)
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

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

UNIT TESTS
-b ensure_dns_is_reloaded_on_restart lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1692/consoleText
COMMIT: d300e33eabd401c344c03c1d0fb0f30c27be1b05

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

UNIT TESTS
-b ensure_dns_is_reloaded_on_restart lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 9a1ab127cd05237e2610d5b761e9536573da44bb

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
diff --git a/src/maasserver/region_controller.py b/src/maasserver/region_controller.py
index 69eae10..a7fa69c 100644
--- a/src/maasserver/region_controller.py
+++ b/src/maasserver/region_controller.py
@@ -94,11 +94,11 @@ class RegionControllerService(Service):
94 self.processing = LoopingCall(self.process)94 self.processing = LoopingCall(self.process)
95 self.processing.clock = self.clock95 self.processing.clock = self.clock
96 self.processingDefer = None96 self.processingDefer = None
97 self.needsDNSUpdate = False97 self.needsDNSUpdate = True # reload DNS on start of region
98 self.needsProxyUpdate = False98 self.needsProxyUpdate = False
99 self.needsRBACUpdate = False99 self.needsRBACUpdate = False
100 self._dns_updates = []100 self._dns_updates = []
101 self._dns_requires_full_reload = False101 self._dns_requires_full_reload = True
102 self.postgresListener = postgresListener102 self.postgresListener = postgresListener
103 self.dnsResolver = Resolver(103 self.dnsResolver = Resolver(
104 resolv=None,104 resolv=None,
diff --git a/src/maasserver/tests/test_region_controller.py b/src/maasserver/tests/test_region_controller.py
index 4f40354..4e97cdd 100644
--- a/src/maasserver/tests/test_region_controller.py
+++ b/src/maasserver/tests/test_region_controller.py
@@ -53,7 +53,7 @@ class TestRegionControllerService(MAASServerTestCase):
53 MatchesStructure.byEquality(53 MatchesStructure.byEquality(
54 clock=reactor,54 clock=reactor,
55 processingDefer=None,55 processingDefer=None,
56 needsDNSUpdate=False,56 needsDNSUpdate=True,
57 postgresListener=sentinel.listener,57 postgresListener=sentinel.listener,
58 ),58 ),
59 )59 )
@@ -157,6 +157,19 @@ class TestRegionControllerService(MAASServerTestCase):
157157
158 @wait_for_reactor158 @wait_for_reactor
159 @inlineCallbacks159 @inlineCallbacks
160 def test_reload_dns_on_start(self):
161 service = self.make_service(sentinel.listener)
162 mock_dns_update_all_zones = self.patch(
163 region_controller, "dns_update_all_zones"
164 )
165 service.startProcessing()
166 yield service.processingDefer
167 mock_dns_update_all_zones.assert_called_once()
168 self.assertFalse(service.needsDNSUpdate)
169 self.assertFalse(service._dns_requires_full_reload)
170
171 @wait_for_reactor
172 @inlineCallbacks
160 def test_process_doesnt_update_zones_when_nothing_to_process(self):173 def test_process_doesnt_update_zones_when_nothing_to_process(self):
161 service = self.make_service(sentinel.listener)174 service = self.make_service(sentinel.listener)
162 service.needsDNSUpdate = False175 service.needsDNSUpdate = False
@@ -218,7 +231,7 @@ class TestRegionControllerService(MAASServerTestCase):
218 service.startProcessing()231 service.startProcessing()
219 yield service.processingDefer232 yield service.processingDefer
220 mock_dns_update_all_zones.assert_called_once_with(233 mock_dns_update_all_zones.assert_called_once_with(
221 dynamic_updates=[], requires_reload=False234 dynamic_updates=[], requires_reload=True
222 )235 )
223 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))236 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
224 self.assertThat(237 self.assertThat(
@@ -263,7 +276,7 @@ class TestRegionControllerService(MAASServerTestCase):
263 self.assertThat(276 self.assertThat(
264 mock_dns_update_all_zones,277 mock_dns_update_all_zones,
265 MockCallsMatch(278 MockCallsMatch(
266 call(dynamic_updates=[], requires_reload=False),279 call(dynamic_updates=[], requires_reload=True),
267 call(dynamic_updates=[], requires_reload=False),280 call(dynamic_updates=[], requires_reload=False),
268 ),281 ),
269 )282 )
@@ -321,7 +334,7 @@ class TestRegionControllerService(MAASServerTestCase):
321 service.startProcessing()334 service.startProcessing()
322 yield service.processingDefer335 yield service.processingDefer
323 mock_dns_update_all_zones.assert_called_once_with(336 mock_dns_update_all_zones.assert_called_once_with(
324 dynamic_updates=[], requires_reload=False337 dynamic_updates=[], requires_reload=True
325 )338 )
326 self.assertThat(339 self.assertThat(
327 mock_err, MockCalledOnceWith(ANY, "Failed configuring DNS.")340 mock_err, MockCalledOnceWith(ANY, "Failed configuring DNS.")
@@ -410,7 +423,7 @@ class TestRegionControllerService(MAASServerTestCase):
410 service.startProcessing()423 service.startProcessing()
411 yield service.processingDefer424 yield service.processingDefer
412 mock_dns_update_all_zones.assert_called_once_with(425 mock_dns_update_all_zones.assert_called_once_with(
413 dynamic_updates=[], requires_reload=False426 dynamic_updates=[], requires_reload=True
414 )427 )
415 mock_proxy_update_config.assert_called_once_with(reload_proxy=True)428 mock_proxy_update_config.assert_called_once_with(reload_proxy=True)
416 mock_rbacSync.assert_called_once()429 mock_rbacSync.assert_called_once()
@@ -635,7 +648,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase):
635 service.startProcessing()648 service.startProcessing()
636 yield service.processingDefer649 yield service.processingDefer
637 mock_dns_update_all_zones.assert_called_once_with(650 mock_dns_update_all_zones.assert_called_once_with(
638 dynamic_updates=[], requires_reload=False651 dynamic_updates=[], requires_reload=True
639 )652 )
640 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))653 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
641 self.assertThat(654 self.assertThat(
@@ -681,7 +694,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase):
681 for publication in reversed(publications[1:])694 for publication in reversed(publications[1:])
682 )695 )
683 mock_dns_update_all_zones.assert_called_once_with(696 mock_dns_update_all_zones.assert_called_once_with(
684 dynamic_updates=[], requires_reload=False697 dynamic_updates=[], requires_reload=True
685 )698 )
686 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))699 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
687 self.assertThat(mock_msg, MockCalledOnceWith(expected_msg))700 self.assertThat(mock_msg, MockCalledOnceWith(expected_msg))
diff --git a/src/maasserver/triggers/system.py b/src/maasserver/triggers/system.py
index 3f7f328..8e5ba5a 100644
--- a/src/maasserver/triggers/system.py
+++ b/src/maasserver/triggers/system.py
@@ -12,6 +12,7 @@ for.
1212
13from textwrap import dedent13from textwrap import dedent
1414
15from maasserver.enum import NODE_TYPE
15from maasserver.models.dnspublication import zone_serial16from maasserver.models.dnspublication import zone_serial
16from maasserver.triggers import register_procedure, register_trigger17from maasserver.triggers import register_procedure, register_trigger
17from maasserver.utils.orm import transactional18from maasserver.utils.orm import transactional
@@ -2131,22 +2132,34 @@ dns_dynamic_update_static_ip_address_update = dedent(
2131 """2132 """
2132)2133)
21332134
2134dns_dynamic_update_node_delete = dedent(2135
2135 """\2136def render_dns_dynamic_update_node(op):
2136 CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_delete()2137 return dedent(
2137 RETURNS trigger as $$2138 f"""\
2138 DECLARE2139 CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_{op}()
2139 hostname text;2140 RETURNS trigger as $$
2140 domain text;2141 DECLARE
2141 address_ttl int;2142 hostname text;
2142 BEGIN2143 domain text;
2143 SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id;2144 address_ttl int;
2144 PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A');2145 BEGIN
2145 RETURN NULL;2146 IF ((TG_OP = 'INSERT' OR TG_OP = 'UPDATE') AND TG_LEVEL = 'ROW') THEN
2146 END;2147 IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN
2147 $$ LANGUAGE plpgsql;2148 PERFORM pg_notify('sys_dns_updates', 'RELOAD');
2148 """2149 END IF;
2149)2150 ELSE
2151 IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN
2152 PERFORM pg_notify('sys_dns_updates', 'RELOAD');
2153 ELSE
2154 SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id;
2155 PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A');
2156 END IF;
2157 END IF;
2158 RETURN NULL;
2159 END;
2160 $$ LANGUAGE plpgsql;
2161 """
2162 )
21502163
21512164
2152dns_dynamic_update_interface_delete = dedent(2165dns_dynamic_update_interface_delete = dedent(
@@ -2543,7 +2556,19 @@ def register_system_triggers():
2543 "sys_dns_updates_ip_update",2556 "sys_dns_updates_ip_update",
2544 "update",2557 "update",
2545 )2558 )
2546 register_procedure(dns_dynamic_update_node_delete)2559 register_procedure(render_dns_dynamic_update_node("insert"))
2560 register_trigger(
2561 "maasserver_node",
2562 "sys_dns_updates_maasserver_node_insert",
2563 "insert",
2564 )
2565 register_procedure(render_dns_dynamic_update_node("update"))
2566 register_trigger(
2567 "maasserver_node",
2568 "sys_dns_updates_maasserver_node_update",
2569 "update",
2570 )
2571 register_procedure(render_dns_dynamic_update_node("delete"))
2547 register_trigger(2572 register_trigger(
2548 "maasserver_node",2573 "maasserver_node",
2549 "sys_dns_updates_maasserver_node_delete",2574 "sys_dns_updates_maasserver_node_delete",
diff --git a/src/maasserver/triggers/tests/test_init.py b/src/maasserver/triggers/tests/test_init.py
index 34395f1..73bfcde 100644
--- a/src/maasserver/triggers/tests/test_init.py
+++ b/src/maasserver/triggers/tests/test_init.py
@@ -102,6 +102,8 @@ class TestTriggersUsed(MAASServerTestCase):
102 "node_sys_dhcp_node_update",102 "node_sys_dhcp_node_update",
103 "node_sys_dns_node_delete",103 "node_sys_dns_node_delete",
104 "node_sys_dns_node_update",104 "node_sys_dns_node_update",
105 "node_sys_dns_updates_maasserver_node_insert",
106 "node_sys_dns_updates_maasserver_node_update",
105 "node_sys_dns_updates_maasserver_node_delete",107 "node_sys_dns_updates_maasserver_node_delete",
106 "rbacsync_sys_rbac_sync",108 "rbacsync_sys_rbac_sync",
107 "regionrackrpcconnection_sys_core_rpc_delete",109 "regionrackrpcconnection_sys_core_rpc_delete",
diff --git a/src/maasserver/triggers/tests/test_system.py b/src/maasserver/triggers/tests/test_system.py
index 4337984..ce7398e 100644
--- a/src/maasserver/triggers/tests/test_system.py
+++ b/src/maasserver/triggers/tests/test_system.py
@@ -7,7 +7,7 @@ from contextlib import closing
7from django.db import connection7from django.db import connection
8from twisted.internet.defer import inlineCallbacks8from twisted.internet.defer import inlineCallbacks
99
10from maasserver.enum import NODE_STATUS10from maasserver.enum import NODE_STATUS, NODE_TYPE
11from maasserver.models import Domain11from maasserver.models import Domain
12from maasserver.models.dnspublication import zone_serial12from maasserver.models.dnspublication import zone_serial
13from maasserver.testing.factory import factory13from maasserver.testing.factory import factory
@@ -386,11 +386,20 @@ class TestSysDNSUpdates(
386 subnet = yield deferToDatabase(386 subnet = yield deferToDatabase(
387 self.create_subnet, params={"vlan": vlan}387 self.create_subnet, params={"vlan": vlan}
388 )388 )
389 rack_controller = yield deferToDatabase(
390 self.create_rack_controller,
391 params={"vlan": vlan, "subnet": subnet},
392 )
389 self.start_reading()393 self.start_reading()
390 try:394 try:
391 node = yield deferToDatabase(395 node = yield deferToDatabase(
392 self.create_node_with_interface,396 self.create_node_with_interface,
393 params={"subnet": subnet, "status": NODE_STATUS.DEPLOYED},397 params={
398 "subnet": subnet,
399 "status": NODE_STATUS.DEPLOYED,
400 "node_type": NODE_TYPE.MACHINE,
401 "primary_rack": rack_controller,
402 },
394 )403 )
395 domain = yield deferToDatabase(Domain.objects.get_default_domain)404 domain = yield deferToDatabase(Domain.objects.get_default_domain)
396 expected_iface = yield deferToDatabase(405 expected_iface = yield deferToDatabase(
@@ -438,6 +447,10 @@ class TestSysDNSUpdates(
438 self.create_subnet, params={"vlan": vlan}447 self.create_subnet, params={"vlan": vlan}
439 )448 )
440 domain = yield deferToDatabase(self.create_domain)449 domain = yield deferToDatabase(self.create_domain)
450 rack_controller = yield deferToDatabase(
451 self.create_rack_controller,
452 params={"vlan": vlan, "subnet": subnet},
453 )
441 self.start_reading()454 self.start_reading()
442 try:455 try:
443 node = yield deferToDatabase(456 node = yield deferToDatabase(
@@ -446,6 +459,8 @@ class TestSysDNSUpdates(
446 "subnet": subnet,459 "subnet": subnet,
447 "status": NODE_STATUS.DEPLOYED,460 "status": NODE_STATUS.DEPLOYED,
448 "domain": domain,461 "domain": domain,
462 "node_type": NODE_TYPE.MACHINE,
463 "primary_rack": rack_controller,
449 },464 },
450 )465 )
451 expected_iface = yield deferToDatabase(466 expected_iface = yield deferToDatabase(
@@ -589,6 +604,48 @@ class TestSysDNSUpdates(
589604
590 @wait_for_reactor605 @wait_for_reactor
591 @inlineCallbacks606 @inlineCallbacks
607 def test_dns_dynamic_update_controller_insert(self):
608 listener = self.make_listener_without_delay()
609 yield self.set_service(listener)
610 yield deferToDatabase(
611 self.register_trigger,
612 "maasserver_node",
613 "sys_dns_updates",
614 ops=("insert",),
615 )
616 self.start_reading()
617 try:
618 yield deferToDatabase(self.create_rack_controller)
619 msg = yield self.get_notify("sys_dns_updates")
620 self.assertEqual(msg, "RELOAD")
621 finally:
622 self.stop_reading()
623 yield self.postgres_listener_service.stopService()
624
625 @wait_for_reactor
626 @inlineCallbacks
627 def test_dns_dynamic_update_controller_update(self):
628 listener = self.make_listener_without_delay()
629 yield self.set_service(listener)
630 yield deferToDatabase(
631 self.register_trigger,
632 "maasserver_node",
633 "sys_dns_updates",
634 ops=("update",),
635 )
636 self.start_reading()
637 controller = yield deferToDatabase(self.create_rack_controller)
638 try:
639 controller.cpu_speed = 10
640 yield deferToDatabase(controller.save)
641 msg = yield self.get_notify("sys_dns_updates")
642 self.assertEqual(msg, "RELOAD")
643 finally:
644 self.stop_reading()
645 yield self.postgres_listener_service.stopService()
646
647 @wait_for_reactor
648 @inlineCallbacks
592 def test_dns_dynamic_update_node_delete(self):649 def test_dns_dynamic_update_node_delete(self):
593 listener = self.make_listener_without_delay()650 listener = self.make_listener_without_delay()
594 yield self.set_service(listener)651 yield self.set_service(listener)

Subscribers

People subscribed via source and target branches