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
1diff --git a/src/maasserver/region_controller.py b/src/maasserver/region_controller.py
2index 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 self.processing = LoopingCall(self.process)
7 self.processing.clock = self.clock
8 self.processingDefer = None
9- self.needsDNSUpdate = False
10+ self.needsDNSUpdate = True # reload DNS on start of region
11 self.needsProxyUpdate = False
12 self.needsRBACUpdate = False
13 self._dns_updates = []
14- self._dns_requires_full_reload = False
15+ self._dns_requires_full_reload = True
16 self.postgresListener = postgresListener
17 self.dnsResolver = Resolver(
18 resolv=None,
19diff --git a/src/maasserver/tests/test_region_controller.py b/src/maasserver/tests/test_region_controller.py
20index 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 MatchesStructure.byEquality(
25 clock=reactor,
26 processingDefer=None,
27- needsDNSUpdate=False,
28+ needsDNSUpdate=True,
29 postgresListener=sentinel.listener,
30 ),
31 )
32@@ -157,6 +157,19 @@ class TestRegionControllerService(MAASServerTestCase):
33
34 @wait_for_reactor
35 @inlineCallbacks
36+ def test_reload_dns_on_start(self):
37+ service = self.make_service(sentinel.listener)
38+ mock_dns_update_all_zones = self.patch(
39+ region_controller, "dns_update_all_zones"
40+ )
41+ service.startProcessing()
42+ yield service.processingDefer
43+ mock_dns_update_all_zones.assert_called_once()
44+ self.assertFalse(service.needsDNSUpdate)
45+ self.assertFalse(service._dns_requires_full_reload)
46+
47+ @wait_for_reactor
48+ @inlineCallbacks
49 def test_process_doesnt_update_zones_when_nothing_to_process(self):
50 service = self.make_service(sentinel.listener)
51 service.needsDNSUpdate = False
52@@ -218,7 +231,7 @@ class TestRegionControllerService(MAASServerTestCase):
53 service.startProcessing()
54 yield service.processingDefer
55 mock_dns_update_all_zones.assert_called_once_with(
56- dynamic_updates=[], requires_reload=False
57+ dynamic_updates=[], requires_reload=True
58 )
59 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
60 self.assertThat(
61@@ -263,7 +276,7 @@ class TestRegionControllerService(MAASServerTestCase):
62 self.assertThat(
63 mock_dns_update_all_zones,
64 MockCallsMatch(
65- call(dynamic_updates=[], requires_reload=False),
66+ call(dynamic_updates=[], requires_reload=True),
67 call(dynamic_updates=[], requires_reload=False),
68 ),
69 )
70@@ -321,7 +334,7 @@ class TestRegionControllerService(MAASServerTestCase):
71 service.startProcessing()
72 yield service.processingDefer
73 mock_dns_update_all_zones.assert_called_once_with(
74- dynamic_updates=[], requires_reload=False
75+ dynamic_updates=[], requires_reload=True
76 )
77 self.assertThat(
78 mock_err, MockCalledOnceWith(ANY, "Failed configuring DNS.")
79@@ -410,7 +423,7 @@ class TestRegionControllerService(MAASServerTestCase):
80 service.startProcessing()
81 yield service.processingDefer
82 mock_dns_update_all_zones.assert_called_once_with(
83- dynamic_updates=[], requires_reload=False
84+ dynamic_updates=[], requires_reload=True
85 )
86 mock_proxy_update_config.assert_called_once_with(reload_proxy=True)
87 mock_rbacSync.assert_called_once()
88@@ -635,7 +648,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase):
89 service.startProcessing()
90 yield service.processingDefer
91 mock_dns_update_all_zones.assert_called_once_with(
92- dynamic_updates=[], requires_reload=False
93+ dynamic_updates=[], requires_reload=True
94 )
95 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
96 self.assertThat(
97@@ -681,7 +694,7 @@ class TestRegionControllerServiceTransactional(MAASTransactionServerTestCase):
98 for publication in reversed(publications[1:])
99 )
100 mock_dns_update_all_zones.assert_called_once_with(
101- dynamic_updates=[], requires_reload=False
102+ dynamic_updates=[], requires_reload=True
103 )
104 self.assertThat(mock_check_serial, MockCalledOnceWith(dns_result))
105 self.assertThat(mock_msg, MockCalledOnceWith(expected_msg))
106diff --git a/src/maasserver/triggers/system.py b/src/maasserver/triggers/system.py
107index 3f7f328..8e5ba5a 100644
108--- a/src/maasserver/triggers/system.py
109+++ b/src/maasserver/triggers/system.py
110@@ -12,6 +12,7 @@ for.
111
112 from textwrap import dedent
113
114+from maasserver.enum import NODE_TYPE
115 from maasserver.models.dnspublication import zone_serial
116 from maasserver.triggers import register_procedure, register_trigger
117 from maasserver.utils.orm import transactional
118@@ -2131,22 +2132,34 @@ dns_dynamic_update_static_ip_address_update = dedent(
119 """
120 )
121
122-dns_dynamic_update_node_delete = dedent(
123- """\
124- CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_delete()
125- RETURNS trigger as $$
126- DECLARE
127- hostname text;
128- domain text;
129- address_ttl int;
130- BEGIN
131- SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id;
132- PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A');
133- RETURN NULL;
134- END;
135- $$ LANGUAGE plpgsql;
136- """
137-)
138+
139+def render_dns_dynamic_update_node(op):
140+ return dedent(
141+ f"""\
142+ CREATE OR REPLACE FUNCTION sys_dns_updates_maasserver_node_{op}()
143+ RETURNS trigger as $$
144+ DECLARE
145+ hostname text;
146+ domain text;
147+ address_ttl int;
148+ BEGIN
149+ IF ((TG_OP = 'INSERT' OR TG_OP = 'UPDATE') AND TG_LEVEL = 'ROW') THEN
150+ IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN
151+ PERFORM pg_notify('sys_dns_updates', 'RELOAD');
152+ END IF;
153+ ELSE
154+ IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN
155+ PERFORM pg_notify('sys_dns_updates', 'RELOAD');
156+ ELSE
157+ SELECT name, COALESCE(ttl, 0) INTO domain, address_ttl FROM maasserver_domain WHERE id=OLD.domain_id;
158+ PERFORM pg_notify('sys_dns_updates', 'DELETE ' || domain || ' ' || OLD.hostname || ' A');
159+ END IF;
160+ END IF;
161+ RETURN NULL;
162+ END;
163+ $$ LANGUAGE plpgsql;
164+ """
165+ )
166
167
168 dns_dynamic_update_interface_delete = dedent(
169@@ -2543,7 +2556,19 @@ def register_system_triggers():
170 "sys_dns_updates_ip_update",
171 "update",
172 )
173- register_procedure(dns_dynamic_update_node_delete)
174+ register_procedure(render_dns_dynamic_update_node("insert"))
175+ register_trigger(
176+ "maasserver_node",
177+ "sys_dns_updates_maasserver_node_insert",
178+ "insert",
179+ )
180+ register_procedure(render_dns_dynamic_update_node("update"))
181+ register_trigger(
182+ "maasserver_node",
183+ "sys_dns_updates_maasserver_node_update",
184+ "update",
185+ )
186+ register_procedure(render_dns_dynamic_update_node("delete"))
187 register_trigger(
188 "maasserver_node",
189 "sys_dns_updates_maasserver_node_delete",
190diff --git a/src/maasserver/triggers/tests/test_init.py b/src/maasserver/triggers/tests/test_init.py
191index 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 "node_sys_dhcp_node_update",
196 "node_sys_dns_node_delete",
197 "node_sys_dns_node_update",
198+ "node_sys_dns_updates_maasserver_node_insert",
199+ "node_sys_dns_updates_maasserver_node_update",
200 "node_sys_dns_updates_maasserver_node_delete",
201 "rbacsync_sys_rbac_sync",
202 "regionrackrpcconnection_sys_core_rpc_delete",
203diff --git a/src/maasserver/triggers/tests/test_system.py b/src/maasserver/triggers/tests/test_system.py
204index 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 from django.db import connection
209 from twisted.internet.defer import inlineCallbacks
210
211-from maasserver.enum import NODE_STATUS
212+from maasserver.enum import NODE_STATUS, NODE_TYPE
213 from maasserver.models import Domain
214 from maasserver.models.dnspublication import zone_serial
215 from maasserver.testing.factory import factory
216@@ -386,11 +386,20 @@ class TestSysDNSUpdates(
217 subnet = yield deferToDatabase(
218 self.create_subnet, params={"vlan": vlan}
219 )
220+ rack_controller = yield deferToDatabase(
221+ self.create_rack_controller,
222+ params={"vlan": vlan, "subnet": subnet},
223+ )
224 self.start_reading()
225 try:
226 node = yield deferToDatabase(
227 self.create_node_with_interface,
228- params={"subnet": subnet, "status": NODE_STATUS.DEPLOYED},
229+ params={
230+ "subnet": subnet,
231+ "status": NODE_STATUS.DEPLOYED,
232+ "node_type": NODE_TYPE.MACHINE,
233+ "primary_rack": rack_controller,
234+ },
235 )
236 domain = yield deferToDatabase(Domain.objects.get_default_domain)
237 expected_iface = yield deferToDatabase(
238@@ -438,6 +447,10 @@ class TestSysDNSUpdates(
239 self.create_subnet, params={"vlan": vlan}
240 )
241 domain = yield deferToDatabase(self.create_domain)
242+ rack_controller = yield deferToDatabase(
243+ self.create_rack_controller,
244+ params={"vlan": vlan, "subnet": subnet},
245+ )
246 self.start_reading()
247 try:
248 node = yield deferToDatabase(
249@@ -446,6 +459,8 @@ class TestSysDNSUpdates(
250 "subnet": subnet,
251 "status": NODE_STATUS.DEPLOYED,
252 "domain": domain,
253+ "node_type": NODE_TYPE.MACHINE,
254+ "primary_rack": rack_controller,
255 },
256 )
257 expected_iface = yield deferToDatabase(
258@@ -589,6 +604,48 @@ class TestSysDNSUpdates(
259
260 @wait_for_reactor
261 @inlineCallbacks
262+ def test_dns_dynamic_update_controller_insert(self):
263+ listener = self.make_listener_without_delay()
264+ yield self.set_service(listener)
265+ yield deferToDatabase(
266+ self.register_trigger,
267+ "maasserver_node",
268+ "sys_dns_updates",
269+ ops=("insert",),
270+ )
271+ self.start_reading()
272+ try:
273+ yield deferToDatabase(self.create_rack_controller)
274+ msg = yield self.get_notify("sys_dns_updates")
275+ self.assertEqual(msg, "RELOAD")
276+ finally:
277+ self.stop_reading()
278+ yield self.postgres_listener_service.stopService()
279+
280+ @wait_for_reactor
281+ @inlineCallbacks
282+ def test_dns_dynamic_update_controller_update(self):
283+ listener = self.make_listener_without_delay()
284+ yield self.set_service(listener)
285+ yield deferToDatabase(
286+ self.register_trigger,
287+ "maasserver_node",
288+ "sys_dns_updates",
289+ ops=("update",),
290+ )
291+ self.start_reading()
292+ controller = yield deferToDatabase(self.create_rack_controller)
293+ try:
294+ controller.cpu_speed = 10
295+ yield deferToDatabase(controller.save)
296+ msg = yield self.get_notify("sys_dns_updates")
297+ self.assertEqual(msg, "RELOAD")
298+ finally:
299+ self.stop_reading()
300+ yield self.postgres_listener_service.stopService()
301+
302+ @wait_for_reactor
303+ @inlineCallbacks
304 def test_dns_dynamic_update_node_delete(self):
305 listener = self.make_listener_without_delay()
306 yield self.set_service(listener)

Subscribers

People subscribed via source and target branches