Merge lp:~mpontillo/maas/fix-relay-vlan-hostmap-creation--bug-1686755 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 6041
Proposed branch: lp:~mpontillo/maas/fix-relay-vlan-hostmap-creation--bug-1686755
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 669 lines (+276/-71)
3 files modified
src/maasserver/triggers/system.py (+39/-49)
src/maasserver/triggers/testing.py (+3/-1)
src/maasserver/triggers/tests/test_system_listener.py (+234/-21)
To merge this branch: bzr merge lp:~mpontillo/maas/fix-relay-vlan-hostmap-creation--bug-1686755
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+323561@code.launchpad.net

Commit message

Fix hostmap creation when IP addresses are created on VLANs with DHCP relay enabled. Also fix DHCP snippet triggers to fire when they occur on a VLAN with DHCP relay enabled.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good mostly. But have some issues in the dhcp alert procedure that needs to be fixed.

review: Needs Fixing
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Fixed. Thanks.

Revision history for this message
Blake Rouse (blake-rouse) :
review: Needs Fixing
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Thanks for the fixes. Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/triggers/system.py'
2--- src/maasserver/triggers/system.py 2017-01-28 00:51:47 +0000
3+++ src/maasserver/triggers/system.py 2017-05-05 15:31:09 +0000
4@@ -368,10 +368,27 @@
5 DHCP_ALERT = dedent("""\
6 CREATE OR REPLACE FUNCTION sys_dhcp_alert(vlan maasserver_vlan)
7 RETURNS void AS $$
8+ DECLARE
9+ relay_vlan maasserver_vlan;
10 BEGIN
11- PERFORM pg_notify(CONCAT('sys_dhcp_', vlan.primary_rack_id), '');
12- IF vlan.secondary_rack_id IS NOT NULL THEN
13- PERFORM pg_notify(CONCAT('sys_dhcp_', vlan.secondary_rack_id), '');
14+ IF vlan.dhcp_on THEN
15+ PERFORM pg_notify(CONCAT('sys_dhcp_', vlan.primary_rack_id), '');
16+ IF vlan.secondary_rack_id IS NOT NULL THEN
17+ PERFORM pg_notify(CONCAT('sys_dhcp_', vlan.secondary_rack_id), '');
18+ END IF;
19+ END IF;
20+ IF vlan.relay_vlan_id IS NOT NULL THEN
21+ SELECT maasserver_vlan.* INTO relay_vlan
22+ FROM maasserver_vlan
23+ WHERE maasserver_vlan.id = vlan.relay_vlan_id;
24+ IF relay_vlan.dhcp_on THEN
25+ PERFORM pg_notify(CONCAT(
26+ 'sys_dhcp_', relay_vlan.primary_rack_id), '');
27+ IF relay_vlan.secondary_rack_id IS NOT NULL THEN
28+ PERFORM pg_notify(CONCAT(
29+ 'sys_dhcp_', relay_vlan.secondary_rack_id), '');
30+ END IF;
31+ END IF;
32 END IF;
33 RETURN;
34 END;
35@@ -393,15 +410,11 @@
36 -- Update old VLAN if DHCP is enabled.
37 SELECT * INTO vlan
38 FROM maasserver_vlan WHERE id = OLD.vlan_id;
39- IF vlan.dhcp_on THEN
40- PERFORM sys_dhcp_alert(vlan);
41- END IF;
42+ PERFORM sys_dhcp_alert(vlan);
43 -- Update the new VLAN if DHCP is enabled.
44 SELECT * INTO vlan
45 FROM maasserver_vlan WHERE id = NEW.vlan_id;
46- IF vlan.dhcp_on THEN
47- PERFORM sys_dhcp_alert(vlan);
48- END IF;
49+ PERFORM sys_dhcp_alert(vlan);
50 -- Related fields of subnet where changed.
51 ELSIF OLD.cidr != NEW.cidr OR
52 (OLD.gateway_ip IS NULL AND NEW.gateway_ip IS NOT NULL) OR
53@@ -411,9 +424,7 @@
54 -- Network has changed update alert DHCP if enabled.
55 SELECT * INTO vlan
56 FROM maasserver_vlan WHERE id = NEW.vlan_id;
57- IF vlan.dhcp_on THEN
58- PERFORM sys_dhcp_alert(vlan);
59- END IF;
60+ PERFORM sys_dhcp_alert(vlan);
61 END IF;
62 RETURN NEW;
63 END;
64@@ -431,9 +442,7 @@
65 -- Update VLAN if DHCP is enabled.
66 SELECT * INTO vlan
67 FROM maasserver_vlan WHERE id = OLD.vlan_id;
68- IF vlan.dhcp_on THEN
69- PERFORM sys_dhcp_alert(vlan);
70- END IF;
71+ PERFORM sys_dhcp_alert(vlan);
72 RETURN NEW;
73 END;
74 $$ LANGUAGE plpgsql;
75@@ -453,9 +462,7 @@
76 FROM maasserver_vlan, maasserver_subnet
77 WHERE maasserver_subnet.id = NEW.subnet_id AND
78 maasserver_subnet.vlan_id = maasserver_vlan.id;
79- IF vlan.dhcp_on THEN
80- PERFORM sys_dhcp_alert(vlan);
81- END IF;
82+ PERFORM sys_dhcp_alert(vlan);
83 END IF;
84 RETURN NEW;
85 END;
86@@ -476,9 +483,7 @@
87 FROM maasserver_vlan, maasserver_subnet
88 WHERE maasserver_subnet.id = NEW.subnet_id AND
89 maasserver_subnet.vlan_id = maasserver_vlan.id;
90- IF vlan.dhcp_on THEN
91- PERFORM sys_dhcp_alert(vlan);
92- END IF;
93+ PERFORM sys_dhcp_alert(vlan);
94 END IF;
95 RETURN NEW;
96 END;
97@@ -499,9 +504,7 @@
98 FROM maasserver_vlan, maasserver_subnet
99 WHERE maasserver_subnet.id = OLD.subnet_id AND
100 maasserver_subnet.vlan_id = maasserver_vlan.id;
101- IF vlan.dhcp_on THEN
102- PERFORM sys_dhcp_alert(vlan);
103- END IF;
104+ PERFORM sys_dhcp_alert(vlan);
105 END IF;
106 RETURN NEW;
107 END;
108@@ -523,9 +526,7 @@
109 FROM maasserver_vlan, maasserver_subnet
110 WHERE maasserver_subnet.id = NEW.subnet_id AND
111 maasserver_subnet.vlan_id = maasserver_vlan.id;
112- IF vlan.dhcp_on THEN
113- PERFORM sys_dhcp_alert(vlan);
114- END IF;
115+ PERFORM sys_dhcp_alert(vlan);
116 END IF;
117 RETURN NEW;
118 END;
119@@ -556,17 +557,11 @@
120 maasserver_subnet.vlan_id = maasserver_vlan.id;
121 IF old_vlan.id != new_vlan.id THEN
122 -- Different VLAN's; update each if DHCP enabled.
123- IF old_vlan.dhcp_on THEN
124- PERFORM sys_dhcp_alert(old_vlan);
125- END IF;
126- IF new_vlan.dhcp_on THEN
127- PERFORM sys_dhcp_alert(new_vlan);
128- END IF;
129+ PERFORM sys_dhcp_alert(old_vlan);
130+ PERFORM sys_dhcp_alert(new_vlan);
131 ELSE
132 -- Same VLAN so only need to update once.
133- IF new_vlan.dhcp_on THEN
134- PERFORM sys_dhcp_alert(new_vlan);
135- END IF;
136+ PERFORM sys_dhcp_alert(new_vlan);
137 END IF;
138 ELSIF (OLD.ip IS NULL AND NEW.ip IS NOT NULL) OR
139 (OLD.ip IS NOT NULL and NEW.ip IS NULL) OR
140@@ -576,9 +571,7 @@
141 FROM maasserver_vlan, maasserver_subnet
142 WHERE maasserver_subnet.id = NEW.subnet_id AND
143 maasserver_subnet.vlan_id = maasserver_vlan.id;
144- IF new_vlan.dhcp_on THEN
145- PERFORM sys_dhcp_alert(new_vlan);
146- END IF;
147+ PERFORM sys_dhcp_alert(new_vlan);
148 END IF;
149 END IF;
150 RETURN NEW;
151@@ -600,9 +593,7 @@
152 FROM maasserver_vlan, maasserver_subnet
153 WHERE maasserver_subnet.id = OLD.subnet_id AND
154 maasserver_subnet.vlan_id = maasserver_vlan.id;
155- IF vlan.dhcp_on THEN
156- PERFORM sys_dhcp_alert(vlan);
157- END IF;
158+ PERFORM sys_dhcp_alert(vlan);
159 END IF;
160 RETURN NEW;
161 END;
162@@ -635,8 +626,7 @@
163 AND maasserver_staticipaddress.alloc_type != 6
164 AND maasserver_staticipaddress.ip IS NOT NULL
165 AND host(maasserver_staticipaddress.ip) != ''
166- AND maasserver_vlan.id = maasserver_subnet.vlan_id
167- AND maasserver_vlan.dhcp_on)
168+ AND maasserver_vlan.id = maasserver_subnet.vlan_id)
169 LOOP
170 PERFORM sys_dhcp_alert(vlan);
171 END LOOP;
172@@ -673,8 +663,7 @@
173 AND maasserver_staticipaddress.alloc_type != 6
174 AND maasserver_staticipaddress.ip IS NOT NULL
175 AND host(maasserver_staticipaddress.ip) != ''
176- AND maasserver_vlan.id = maasserver_subnet.vlan_id
177- AND maasserver_vlan.dhcp_on)
178+ AND maasserver_vlan.id = maasserver_subnet.vlan_id)
179 LOOP
180 PERFORM sys_dhcp_alert(vlan);
181 END LOOP;
182@@ -723,7 +712,8 @@
183 maasserver_subnet
184 WHERE maasserver_subnet.id = _subnet_id
185 AND maasserver_vlan.id = maasserver_subnet.vlan_id
186- AND maasserver_vlan.dhcp_on = true)
187+ AND (maasserver_vlan.dhcp_on = true
188+ OR maasserver_vlan.relay_vlan_id IS NOT NULL))
189 LOOP
190 PERFORM sys_dhcp_alert(vlan);
191 END LOOP;
192@@ -744,8 +734,8 @@
193 FROM maasserver_vlan, maasserver_interface
194 WHERE maasserver_interface.node_id = _node_id
195 AND maasserver_interface.vlan_id = maasserver_vlan.id
196- AND maasserver_vlan.dhcp_on = true
197- )
198+ AND (maasserver_vlan.dhcp_on = true
199+ OR maasserver_vlan.relay_vlan_id IS NOT NULL))
200 SELECT primary_rack_id FROM racks
201 WHERE primary_rack_id IS NOT NULL
202 UNION
203
204=== modified file 'src/maasserver/triggers/testing.py'
205--- src/maasserver/triggers/testing.py 2017-04-11 01:29:40 +0000
206+++ src/maasserver/triggers/testing.py 2017-05-05 15:31:09 +0000
207@@ -372,9 +372,11 @@
208 event.delete()
209
210 @transactional
211- def create_staticipaddress(self, params=None):
212+ def create_staticipaddress(self, params=None, vlan=None):
213 if params is None:
214 params = {}
215+ if vlan is not None:
216+ params['subnet'] = vlan.subnet_set.first()
217 return factory.make_StaticIPAddress(**params)
218
219 @transactional
220
221=== modified file 'src/maasserver/triggers/tests/test_system_listener.py'
222--- src/maasserver/triggers/tests/test_system_listener.py 2017-01-28 00:51:47 +0000
223+++ src/maasserver/triggers/tests/test_system_listener.py 2017-05-05 15:31:09 +0000
224@@ -842,6 +842,115 @@
225
226 @wait_for_reactor
227 @inlineCallbacks
228+ def test_sends_messages_when_ip_address_created(self):
229+ primary_rack = yield deferToDatabase(self.create_rack_controller)
230+ secondary_rack = yield deferToDatabase(self.create_rack_controller)
231+ vlan = yield deferToDatabase(self.create_vlan, params={
232+ "dhcp_on": True,
233+ "primary_rack": primary_rack,
234+ "secondary_rack": secondary_rack,
235+ })
236+ relay_vlan = yield deferToDatabase(self.create_vlan, params={
237+ "relay_vlan": vlan
238+ })
239+ yield deferToDatabase(self.create_subnet, {
240+ "vlan": relay_vlan,
241+ })
242+ yield deferToDatabase(register_system_triggers)
243+ primary_rack_dv = DeferredValue()
244+ secondary_rack_dv = DeferredValue()
245+ listener = self.make_listener_without_delay()
246+ listener.register(
247+ "sys_dhcp_%s" % primary_rack.id,
248+ lambda *args: primary_rack_dv.set(args))
249+ listener.register(
250+ "sys_dhcp_%s" % secondary_rack.id,
251+ lambda *args: secondary_rack_dv.set(args))
252+ yield listener.startService()
253+ try:
254+ yield deferToDatabase(self.create_staticipaddress, vlan=relay_vlan)
255+ yield primary_rack_dv.get(timeout=2)
256+ yield secondary_rack_dv.get(timeout=2)
257+ finally:
258+ yield listener.stopService()
259+
260+ @wait_for_reactor
261+ @inlineCallbacks
262+ def test_sends_messages_when_ip_address_updated(self):
263+ primary_rack = yield deferToDatabase(self.create_rack_controller)
264+ secondary_rack = yield deferToDatabase(self.create_rack_controller)
265+ vlan = yield deferToDatabase(self.create_vlan, params={
266+ "dhcp_on": True,
267+ "primary_rack": primary_rack,
268+ "secondary_rack": secondary_rack,
269+ })
270+ relay_vlan = yield deferToDatabase(self.create_vlan, params={
271+ "relay_vlan": vlan
272+ })
273+ yield deferToDatabase(self.create_subnet, {
274+ "vlan": relay_vlan,
275+ })
276+ yield deferToDatabase(register_system_triggers)
277+ primary_rack_dv = DeferredValue()
278+ secondary_rack_dv = DeferredValue()
279+ listener = self.make_listener_without_delay()
280+ listener.register(
281+ "sys_dhcp_%s" % primary_rack.id,
282+ lambda *args: primary_rack_dv.set(args))
283+ listener.register(
284+ "sys_dhcp_%s" % secondary_rack.id,
285+ lambda *args: secondary_rack_dv.set(args))
286+ sip = yield deferToDatabase(
287+ self.create_staticipaddress, vlan=relay_vlan)
288+ yield listener.startService()
289+ try:
290+ yield deferToDatabase(
291+ self.update_staticipaddress, sip.id, params={
292+ 'ip': ''
293+ })
294+ yield primary_rack_dv.get(timeout=2)
295+ yield secondary_rack_dv.get(timeout=2)
296+ finally:
297+ yield listener.stopService()
298+
299+ @wait_for_reactor
300+ @inlineCallbacks
301+ def test_sends_messages_when_ip_address_deleted(self):
302+ primary_rack = yield deferToDatabase(self.create_rack_controller)
303+ secondary_rack = yield deferToDatabase(self.create_rack_controller)
304+ vlan = yield deferToDatabase(self.create_vlan, params={
305+ "dhcp_on": True,
306+ "primary_rack": primary_rack,
307+ "secondary_rack": secondary_rack,
308+ })
309+ relay_vlan = yield deferToDatabase(self.create_vlan, params={
310+ "relay_vlan": vlan
311+ })
312+ yield deferToDatabase(self.create_subnet, {
313+ "vlan": relay_vlan,
314+ })
315+ yield deferToDatabase(register_system_triggers)
316+ primary_rack_dv = DeferredValue()
317+ secondary_rack_dv = DeferredValue()
318+ listener = self.make_listener_without_delay()
319+ listener.register(
320+ "sys_dhcp_%s" % primary_rack.id,
321+ lambda *args: primary_rack_dv.set(args))
322+ listener.register(
323+ "sys_dhcp_%s" % secondary_rack.id,
324+ lambda *args: secondary_rack_dv.set(args))
325+ sip = yield deferToDatabase(
326+ self.create_staticipaddress, vlan=relay_vlan)
327+ yield listener.startService()
328+ try:
329+ yield deferToDatabase(self.delete_staticipaddress, sip.id)
330+ yield primary_rack_dv.get(timeout=2)
331+ yield secondary_rack_dv.get(timeout=2)
332+ finally:
333+ yield listener.stopService()
334+
335+ @wait_for_reactor
336+ @inlineCallbacks
337 def test_sends_messages_when_relay_vlan_unset(self):
338 yield deferToDatabase(register_system_triggers)
339 primary_rack = yield deferToDatabase(self.create_rack_controller)
340@@ -1283,6 +1392,11 @@
341 MAASTransactionServerTestCase, TransactionalHelpersMixin):
342 """End-to-end test for the DHCP triggers code."""
343
344+ scenarios = (
345+ ('with_dhcp_relay', {"dhcp_relay": True}),
346+ ('without_dhcp_relay', {"dhcp_relay": False}),
347+ )
348+
349 @wait_for_reactor
350 @inlineCallbacks
351 def test_sends_message_for_new_managed_dhcp_range(self):
352@@ -1294,12 +1408,16 @@
353 "primary_rack": primary_rack,
354 "secondary_rack": secondary_rack,
355 })
356+ relay_vlan = None
357+ if self.dhcp_relay:
358+ relay_vlan = yield deferToDatabase(self.create_vlan, {
359+ "relay_vlan": vlan,
360+ })
361 network = factory.make_ipv4_network()
362 subnet = yield deferToDatabase(self.create_subnet, {
363 "cidr": str(network.cidr),
364- "vlan": vlan,
365+ "vlan": relay_vlan if self.dhcp_relay else vlan,
366 })
367-
368 listener = self.make_listener_without_delay()
369 primary_dv = DeferredValue()
370 listener.register(
371@@ -1336,10 +1454,15 @@
372 "primary_rack": primary_rack,
373 "secondary_rack": secondary_rack,
374 })
375+ relay_vlan = None
376+ if self.dhcp_relay:
377+ relay_vlan = yield deferToDatabase(self.create_vlan, {
378+ "relay_vlan": vlan,
379+ })
380 network = factory.make_ipv4_network()
381 subnet = yield deferToDatabase(self.create_subnet, {
382 "cidr": str(network.cidr),
383- "vlan": vlan,
384+ "vlan": relay_vlan if self.dhcp_relay else vlan,
385 })
386 network = subnet.get_ipnetwork()
387 start_ip = str(IPAddress(network.first + 2))
388@@ -1382,10 +1505,15 @@
389 "primary_rack": primary_rack,
390 "secondary_rack": secondary_rack,
391 })
392+ relay_vlan = None
393+ if self.dhcp_relay:
394+ relay_vlan = yield deferToDatabase(self.create_vlan, {
395+ "relay_vlan": vlan,
396+ })
397 network = factory.make_ipv4_network()
398 subnet = yield deferToDatabase(self.create_subnet, {
399 "cidr": str(network.cidr),
400- "vlan": vlan,
401+ "vlan": relay_vlan if self.dhcp_relay else vlan,
402 })
403 network = subnet.get_ipnetwork()
404 start_ip = str(IPAddress(network.first + 2))
405@@ -1427,10 +1555,15 @@
406 "primary_rack": primary_rack,
407 "secondary_rack": secondary_rack,
408 })
409+ relay_vlan = None
410+ if self.dhcp_relay:
411+ relay_vlan = yield deferToDatabase(self.create_vlan, {
412+ "relay_vlan": vlan,
413+ })
414 network = factory.make_ipv4_network()
415 subnet = yield deferToDatabase(self.create_subnet, {
416 "cidr": str(network.cidr),
417- "vlan": vlan,
418+ "vlan": relay_vlan if self.dhcp_relay else vlan,
419 })
420 network = subnet.get_ipnetwork()
421 start_ip = str(IPAddress(network.first + 2))
422@@ -1472,10 +1605,15 @@
423 "primary_rack": primary_rack,
424 "secondary_rack": secondary_rack,
425 })
426+ relay_vlan = None
427+ if self.dhcp_relay:
428+ relay_vlan = yield deferToDatabase(self.create_vlan, {
429+ "relay_vlan": vlan,
430+ })
431 network = factory.make_ipv4_network()
432 subnet = yield deferToDatabase(self.create_subnet, {
433 "cidr": str(network.cidr),
434- "vlan": vlan,
435+ "vlan": relay_vlan if self.dhcp_relay else vlan,
436 })
437 network = subnet.get_ipnetwork()
438 start_ip = str(IPAddress(network.first + 2))
439@@ -1536,7 +1674,7 @@
440 lambda *args: secondary_dv.set(args))
441 yield listener.startService()
442 try:
443- yield deferToDatabase(self.create_staticipaddress, {
444+ yield deferToDatabase(self.create_staticipaddress, params={
445 "subnet": subnet,
446 "alloc_type": IPADDRESS_TYPE.USER_RESERVED,
447 "user": user,
448@@ -1987,6 +2125,11 @@
449 MAASTransactionServerTestCase, TransactionalHelpersMixin):
450 """End-to-end test for the DHCP triggers code."""
451
452+ scenarios = (
453+ ('with_dhcp_relay', {"dhcp_relay": True}),
454+ ('without_dhcp_relay', {"dhcp_relay": False}),
455+ )
456+
457 @wait_for_reactor
458 @inlineCallbacks
459 def test_sends_message_for_global_dhcp_snippet_inserted(self):
460@@ -1996,8 +2139,13 @@
461 "dhcp_on": True,
462 "primary_rack": primary_rack,
463 })
464+ relay_vlan = None
465+ if self.dhcp_relay:
466+ relay_vlan = yield deferToDatabase(self.create_vlan, {
467+ "relay_vlan": vlan,
468+ })
469 yield deferToDatabase(self.create_subnet, {
470- "vlan": vlan,
471+ "vlan": relay_vlan if self.dhcp_relay else vlan,
472 })
473 dv = DeferredValue()
474 listener = self.make_listener_without_delay()
475@@ -2022,8 +2170,13 @@
476 "dhcp_on": True,
477 "primary_rack": primary_rack,
478 })
479+ relay_vlan = None
480+ if self.dhcp_relay:
481+ relay_vlan = yield deferToDatabase(self.create_vlan, {
482+ "relay_vlan": vlan,
483+ })
484 yield deferToDatabase(self.create_subnet, {
485- "vlan": vlan,
486+ "vlan": relay_vlan if self.dhcp_relay else vlan,
487 })
488 dv = DeferredValue()
489 listener = self.make_listener_without_delay()
490@@ -2051,8 +2204,13 @@
491 "dhcp_on": True,
492 "primary_rack": primary_rack,
493 })
494+ relay_vlan = None
495+ if self.dhcp_relay:
496+ relay_vlan = yield deferToDatabase(self.create_vlan, {
497+ "relay_vlan": vlan,
498+ })
499 subnet = yield deferToDatabase(self.create_subnet, {
500- "vlan": vlan,
501+ "vlan": relay_vlan if self.dhcp_relay else vlan,
502 })
503 dv = DeferredValue()
504 listener = self.make_listener_without_delay()
505@@ -2078,8 +2236,13 @@
506 "dhcp_on": True,
507 "primary_rack": primary_rack,
508 })
509+ relay_vlan = None
510+ if self.dhcp_relay:
511+ relay_vlan = yield deferToDatabase(self.create_vlan, {
512+ "relay_vlan": vlan,
513+ })
514 yield deferToDatabase(self.create_subnet, {
515- "vlan": vlan,
516+ "vlan": relay_vlan if self.dhcp_relay else vlan,
517 })
518 node = yield deferToDatabase(self.create_node)
519 yield deferToDatabase(self.create_interface, {
520@@ -2110,8 +2273,13 @@
521 "dhcp_on": True,
522 "primary_rack": primary_rack,
523 })
524+ relay_vlan = None
525+ if self.dhcp_relay:
526+ relay_vlan = yield deferToDatabase(self.create_vlan, {
527+ "relay_vlan": vlan,
528+ })
529 yield deferToDatabase(self.create_subnet, {
530- "vlan": vlan,
531+ "vlan": relay_vlan if self.dhcp_relay else vlan,
532 })
533 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
534 "enabled": True,
535@@ -2140,8 +2308,13 @@
536 "dhcp_on": True,
537 "primary_rack": primary_rack,
538 })
539+ relay_vlan = None
540+ if self.dhcp_relay:
541+ relay_vlan = yield deferToDatabase(self.create_vlan, {
542+ "relay_vlan": vlan,
543+ })
544 yield deferToDatabase(self.create_subnet, {
545- "vlan": vlan,
546+ "vlan": relay_vlan if self.dhcp_relay else vlan,
547 })
548 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
549 "enabled": False,
550@@ -2173,8 +2346,13 @@
551 "dhcp_on": True,
552 "primary_rack": primary_rack,
553 })
554+ relay_vlan = None
555+ if self.dhcp_relay:
556+ relay_vlan = yield deferToDatabase(self.create_vlan, {
557+ "relay_vlan": vlan,
558+ })
559 yield deferToDatabase(self.create_subnet, {
560- "vlan": vlan,
561+ "vlan": relay_vlan if self.dhcp_relay else vlan,
562 })
563 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
564 "enabled": False,
565@@ -2202,8 +2380,13 @@
566 "dhcp_on": True,
567 "primary_rack": primary_rack,
568 })
569+ relay_vlan = None
570+ if self.dhcp_relay:
571+ relay_vlan = yield deferToDatabase(self.create_vlan, {
572+ "relay_vlan": vlan,
573+ })
574 yield deferToDatabase(self.create_subnet, {
575- "vlan": vlan,
576+ "vlan": relay_vlan if self.dhcp_relay else vlan,
577 })
578 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
579 "enabled": True,
580@@ -2231,8 +2414,13 @@
581 "dhcp_on": True,
582 "primary_rack": primary_rack,
583 })
584+ relay_vlan = None
585+ if self.dhcp_relay:
586+ relay_vlan = yield deferToDatabase(self.create_vlan, {
587+ "relay_vlan": vlan,
588+ })
589 subnet = yield deferToDatabase(self.create_subnet, {
590- "vlan": vlan,
591+ "vlan": relay_vlan if self.dhcp_relay else vlan,
592 })
593 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
594 "enabled": True,
595@@ -2260,8 +2448,13 @@
596 "dhcp_on": True,
597 "primary_rack": primary_rack,
598 })
599+ relay_vlan = None
600+ if self.dhcp_relay:
601+ relay_vlan = yield deferToDatabase(self.create_vlan, {
602+ "relay_vlan": vlan,
603+ })
604 yield deferToDatabase(self.create_subnet, {
605- "vlan": vlan,
606+ "vlan": relay_vlan if self.dhcp_relay else vlan,
607 })
608 node = yield deferToDatabase(self.create_node)
609 yield deferToDatabase(self.create_interface, {
610@@ -2294,8 +2487,13 @@
611 "dhcp_on": True,
612 "primary_rack": primary_rack,
613 })
614+ relay_vlan = None
615+ if self.dhcp_relay:
616+ relay_vlan = yield deferToDatabase(self.create_vlan, {
617+ "relay_vlan": vlan,
618+ })
619 yield deferToDatabase(self.create_subnet, {
620- "vlan": vlan,
621+ "vlan": relay_vlan if self.dhcp_relay else vlan,
622 })
623 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
624 "enabled": True,
625@@ -2321,8 +2519,13 @@
626 "dhcp_on": True,
627 "primary_rack": primary_rack,
628 })
629+ relay_vlan = None
630+ if self.dhcp_relay:
631+ relay_vlan = yield deferToDatabase(self.create_vlan, {
632+ "relay_vlan": vlan,
633+ })
634 yield deferToDatabase(self.create_subnet, {
635- "vlan": vlan,
636+ "vlan": relay_vlan if self.dhcp_relay else vlan,
637 })
638 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
639 "enabled": False,
640@@ -2351,8 +2554,13 @@
641 "dhcp_on": True,
642 "primary_rack": primary_rack,
643 })
644+ relay_vlan = None
645+ if self.dhcp_relay:
646+ relay_vlan = yield deferToDatabase(self.create_vlan, {
647+ "relay_vlan": vlan,
648+ })
649 subnet = yield deferToDatabase(self.create_subnet, {
650- "vlan": vlan,
651+ "vlan": relay_vlan if self.dhcp_relay else vlan,
652 })
653 dhcp_snippet = yield deferToDatabase(self.create_dhcp_snippet, {
654 "enabled": True,
655@@ -2379,8 +2587,13 @@
656 "dhcp_on": True,
657 "primary_rack": primary_rack,
658 })
659+ relay_vlan = None
660+ if self.dhcp_relay:
661+ relay_vlan = yield deferToDatabase(self.create_vlan, {
662+ "relay_vlan": vlan,
663+ })
664 yield deferToDatabase(self.create_subnet, {
665- "vlan": vlan,
666+ "vlan": relay_vlan if self.dhcp_relay else vlan,
667 })
668 node = yield deferToDatabase(self.create_node)
669 yield deferToDatabase(self.create_interface, {