Merge ~cgrabowski/maas:properly_format_records_for_glue_zones into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 84e37f6ee335ffc9af78f5f36cace469e9299f14
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:properly_format_records_for_glue_zones
Merge into: maas:master
Diff against target: 165 lines (+52/-17)
5 files modified
src/maasserver/dns/tests/test_zonegenerator.py (+2/-2)
src/maasserver/dns/zonegenerator.py (+3/-5)
src/provisioningserver/dns/config.py (+15/-2)
src/provisioningserver/dns/tests/test_config.py (+27/-1)
src/provisioningserver/dns/tests/test_zoneconfig.py (+5/-7)
Reviewer Review Type Date Requested Status
Alexsander de Souza Approve
MAAS Lander Approve
Review via email: mp+436411@code.launchpad.net

Commit message

format glue zone dynamic updates to specify shorter prefix len

Description of the change

It appears when sending a dynamic update PTR for a glue zone, the original zone (i.e the one with 0-<prefix len> in its name) requires the record to be named within that zone rather than generated from the original update.

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

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

STATUS: SUCCESS
COMMIT: 84e37f6ee335ffc9af78f5f36cace469e9299f14

review: Approve
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/dns/tests/test_zonegenerator.py b/src/maasserver/dns/tests/test_zonegenerator.py
2index ee649a4..d213c1a 100644
3--- a/src/maasserver/dns/tests/test_zonegenerator.py
4+++ b/src/maasserver/dns/tests/test_zonegenerator.py
5@@ -550,7 +550,7 @@ class TestZoneGenerator(MAASServerTestCase):
6 zones[1]._dynamic_updates,
7 [
8 DynamicDNSUpdate.as_reverse_record_update(
9- updates[0], str(IPNetwork("10/29"))
10+ updates[0], IPNetwork("10/29")
11 )
12 ],
13 )
14@@ -558,7 +558,7 @@ class TestZoneGenerator(MAASServerTestCase):
15 zones[2]._dynamic_updates,
16 [
17 DynamicDNSUpdate.as_reverse_record_update(
18- updates[0], str(IPNetwork("10/24"))
19+ updates[0], IPNetwork("10/24")
20 )
21 ],
22 )
23diff --git a/src/maasserver/dns/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
24index 2a87990..3088ac9 100644
25--- a/src/maasserver/dns/zonegenerator.py
26+++ b/src/maasserver/dns/zonegenerator.py
27@@ -452,13 +452,11 @@ class ZoneGenerator:
28 glue = set()
29
30 domain_updates = [
31- DynamicDNSUpdate.as_reverse_record_update(
32- update, str(subnet.cidr)
33- )
34+ DynamicDNSUpdate.as_reverse_record_update(update, network)
35 for update in dynamic_updates
36 if update.answer
37 and update.answer_is_ip
38- and (update.answer_as_ip in IPNetwork(subnet.cidr))
39+ and (update.answer_as_ip in network)
40 ]
41
42 yield DNSReverseZoneConfig(
43@@ -502,7 +500,7 @@ class ZoneGenerator:
44 ):
45 domain_updates.append(
46 DynamicDNSUpdate.as_reverse_record_update(
47- update, str(network)
48+ update, network
49 )
50 )
51 yield DNSReverseZoneConfig(
52diff --git a/src/provisioningserver/dns/config.py b/src/provisioningserver/dns/config.py
53index 6e11f73..73b8d48 100644
54--- a/src/provisioningserver/dns/config.py
55+++ b/src/provisioningserver/dns/config.py
56@@ -71,11 +71,24 @@ class DynamicDNSUpdate:
57 if not fwd_update.answer_is_ip:
58 return None
59 ip = IPAddress(fwd_update.answer)
60+ name = ip.reverse_dns
61+ if (
62+ ip.version == 4 and subnet.prefixlen > 24
63+ ) or subnet.prefixlen > 64:
64+ name = "in-addr.arpa."
65+ addr_split = fwd_update.answer.split(".")
66+ idx = len(addr_split) - 1
67+ for i, octet in enumerate(addr_split):
68+ if i == idx:
69+ name = f"{octet}.0-{subnet.prefixlen}.{name}"
70+ else:
71+ name = f"{octet}.{name}"
72+
73 return cls(
74 operation=fwd_update.operation,
75- name=ip.reverse_dns,
76+ name=name,
77 zone=fwd_update.zone,
78- subnet=subnet,
79+ subnet=str(subnet.cidr),
80 ttl=fwd_update.ttl,
81 answer=fwd_update.name,
82 rectype="PTR",
83diff --git a/src/provisioningserver/dns/tests/test_config.py b/src/provisioningserver/dns/tests/test_config.py
84index 41a1bc5..ddb9db4 100644
85--- a/src/provisioningserver/dns/tests/test_config.py
86+++ b/src/provisioningserver/dns/tests/test_config.py
87@@ -730,7 +730,33 @@ class TestDynamicDNSUpdate(MAASTestCase):
88 answer=fwd_update.name,
89 )
90 rev_update = DynamicDNSUpdate.as_reverse_record_update(
91- fwd_update, str(subnet)
92+ fwd_update, subnet
93+ )
94+ self.assertEqual(expected_rev_update.name, rev_update.name)
95+ self.assertEqual(expected_rev_update.rectype, rev_update.rectype)
96+ self.assertEqual(expected_rev_update.answer, rev_update.answer)
97+
98+ def test_as_reverse_record_update_for_glue_zone(self):
99+ domain = factory.make_name()
100+ subnet = IPNetwork("10.1.1.0/25")
101+ fwd_update = DynamicDNSUpdate(
102+ operation="INSERT",
103+ zone=domain,
104+ name=f"{factory.make_name()}.{domain}",
105+ rectype="A",
106+ answer=str("10.1.1.5"),
107+ )
108+ expected_rev_update = DynamicDNSUpdate(
109+ operation="INSERT",
110+ zone=domain,
111+ name="5.0-25.1.1.10.in-addr.arpa.",
112+ rectype="PTR",
113+ ttl=fwd_update.ttl,
114+ subnet=str(subnet),
115+ answer=fwd_update.name,
116+ )
117+ rev_update = DynamicDNSUpdate.as_reverse_record_update(
118+ fwd_update, subnet
119 )
120 self.assertEqual(expected_rev_update.name, rev_update.name)
121 self.assertEqual(expected_rev_update.rectype, rev_update.rectype)
122diff --git a/src/provisioningserver/dns/tests/test_zoneconfig.py b/src/provisioningserver/dns/tests/test_zoneconfig.py
123index f747a53..5e17b38 100644
124--- a/src/provisioningserver/dns/tests/test_zoneconfig.py
125+++ b/src/provisioningserver/dns/tests/test_zoneconfig.py
126@@ -968,7 +968,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
127 ),
128 ]
129 rev_updates = [
130- DynamicDNSUpdate.as_reverse_record_update(update, str(network))
131+ DynamicDNSUpdate.as_reverse_record_update(update, network)
132 for update in fwd_updates
133 ]
134 zone = DNSReverseZoneConfig(
135@@ -1053,7 +1053,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
136 ),
137 ]
138 rev_updates = [
139- DynamicDNSUpdate.as_reverse_record_update(update, str(network))
140+ DynamicDNSUpdate.as_reverse_record_update(update, network)
141 for update in fwd_updates
142 ]
143 zone = DNSReverseZoneConfig(
144@@ -1063,9 +1063,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
145 dynamic_updates=rev_updates,
146 )
147 glue_rev_updates = [
148- DynamicDNSUpdate.as_reverse_record_update(
149- update, str(glue_network)
150- )
151+ DynamicDNSUpdate.as_reverse_record_update(update, glue_network)
152 for update in fwd_updates
153 ]
154 glue_zone = DNSReverseZoneConfig(
155@@ -1078,8 +1076,8 @@ class TestDNSReverseZoneConfig(MAASTestCase):
156 [
157 "server localhost",
158 "zone 0-26.0.0.10.in-addr.arpa",
159- f"update add {IPAddress(ip1).reverse_dns} {zone.default_ttl} PTR {hostname1}",
160- f"update add {IPAddress(ip2).reverse_dns} {zone.default_ttl} PTR {hostname2}",
161+ f"update add {IPAddress(ip1).reverse_dns.replace('0.0.10', '0-26.0.0.10')} {zone.default_ttl} PTR {hostname1}",
162+ f"update add {IPAddress(ip2).reverse_dns.replace('0.0.10', '0-26.0.0.10')} {zone.default_ttl} PTR {hostname2}",
163 f"update add 0-26.0.0.10.in-addr.arpa {zone.default_ttl} SOA 0-26.0.0.10.in-addr.arpa. nobody.example.com. {zone.serial} 600 1800 604800 {zone.default_ttl}",
164 "send\n",
165 ]

Subscribers

People subscribed via source and target branches