← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~cgrabowski/maas:backport_properly_format_records_for_glue_zones_to_3.3 into maas:3.3

 

Christian Grabowski has proposed merging ~cgrabowski/maas:backport_properly_format_records_for_glue_zones_to_3.3 into maas:3.3.

Commit message:
format glue zone dynamic updates to specify shorter prefix len
(cherry picked from commit c2b4038e602409028850b738afac7f32b03170d5)



Requested reviews:
  Christian Grabowski (cgrabowski)

For more details, see:
https://code.launchpad.net/~cgrabowski/maas/+git/maas/+merge/436418
-- 
Your team MAAS Committers is subscribed to branch maas:3.3.
diff --git a/src/maasserver/dns/tests/test_zonegenerator.py b/src/maasserver/dns/tests/test_zonegenerator.py
index ee649a4..d213c1a 100644
--- a/src/maasserver/dns/tests/test_zonegenerator.py
+++ b/src/maasserver/dns/tests/test_zonegenerator.py
@@ -550,7 +550,7 @@ class TestZoneGenerator(MAASServerTestCase):
             zones[1]._dynamic_updates,
             [
                 DynamicDNSUpdate.as_reverse_record_update(
-                    updates[0], str(IPNetwork("10/29"))
+                    updates[0], IPNetwork("10/29")
                 )
             ],
         )
@@ -558,7 +558,7 @@ class TestZoneGenerator(MAASServerTestCase):
             zones[2]._dynamic_updates,
             [
                 DynamicDNSUpdate.as_reverse_record_update(
-                    updates[0], str(IPNetwork("10/24"))
+                    updates[0], IPNetwork("10/24")
                 )
             ],
         )
diff --git a/src/maasserver/dns/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
index 2a87990..3088ac9 100644
--- a/src/maasserver/dns/zonegenerator.py
+++ b/src/maasserver/dns/zonegenerator.py
@@ -452,13 +452,11 @@ class ZoneGenerator:
                 glue = set()
 
             domain_updates = [
-                DynamicDNSUpdate.as_reverse_record_update(
-                    update, str(subnet.cidr)
-                )
+                DynamicDNSUpdate.as_reverse_record_update(update, network)
                 for update in dynamic_updates
                 if update.answer
                 and update.answer_is_ip
-                and (update.answer_as_ip in IPNetwork(subnet.cidr))
+                and (update.answer_as_ip in network)
             ]
 
             yield DNSReverseZoneConfig(
@@ -502,7 +500,7 @@ class ZoneGenerator:
                 ):
                     domain_updates.append(
                         DynamicDNSUpdate.as_reverse_record_update(
-                            update, str(network)
+                            update, network
                         )
                     )
             yield DNSReverseZoneConfig(
diff --git a/src/provisioningserver/dns/config.py b/src/provisioningserver/dns/config.py
index 6e11f73..73b8d48 100644
--- a/src/provisioningserver/dns/config.py
+++ b/src/provisioningserver/dns/config.py
@@ -71,11 +71,24 @@ class DynamicDNSUpdate:
         if not fwd_update.answer_is_ip:
             return None
         ip = IPAddress(fwd_update.answer)
+        name = ip.reverse_dns
+        if (
+            ip.version == 4 and subnet.prefixlen > 24
+        ) or subnet.prefixlen > 64:
+            name = "in-addr.arpa."
+            addr_split = fwd_update.answer.split(".")
+            idx = len(addr_split) - 1
+            for i, octet in enumerate(addr_split):
+                if i == idx:
+                    name = f"{octet}.0-{subnet.prefixlen}.{name}"
+                else:
+                    name = f"{octet}.{name}"
+
         return cls(
             operation=fwd_update.operation,
-            name=ip.reverse_dns,
+            name=name,
             zone=fwd_update.zone,
-            subnet=subnet,
+            subnet=str(subnet.cidr),
             ttl=fwd_update.ttl,
             answer=fwd_update.name,
             rectype="PTR",
diff --git a/src/provisioningserver/dns/tests/test_config.py b/src/provisioningserver/dns/tests/test_config.py
index 41a1bc5..ddb9db4 100644
--- a/src/provisioningserver/dns/tests/test_config.py
+++ b/src/provisioningserver/dns/tests/test_config.py
@@ -730,7 +730,33 @@ class TestDynamicDNSUpdate(MAASTestCase):
             answer=fwd_update.name,
         )
         rev_update = DynamicDNSUpdate.as_reverse_record_update(
-            fwd_update, str(subnet)
+            fwd_update, subnet
+        )
+        self.assertEqual(expected_rev_update.name, rev_update.name)
+        self.assertEqual(expected_rev_update.rectype, rev_update.rectype)
+        self.assertEqual(expected_rev_update.answer, rev_update.answer)
+
+    def test_as_reverse_record_update_for_glue_zone(self):
+        domain = factory.make_name()
+        subnet = IPNetwork("10.1.1.0/25")
+        fwd_update = DynamicDNSUpdate(
+            operation="INSERT",
+            zone=domain,
+            name=f"{factory.make_name()}.{domain}",
+            rectype="A",
+            answer=str("10.1.1.5"),
+        )
+        expected_rev_update = DynamicDNSUpdate(
+            operation="INSERT",
+            zone=domain,
+            name="5.0-25.1.1.10.in-addr.arpa.",
+            rectype="PTR",
+            ttl=fwd_update.ttl,
+            subnet=str(subnet),
+            answer=fwd_update.name,
+        )
+        rev_update = DynamicDNSUpdate.as_reverse_record_update(
+            fwd_update, subnet
         )
         self.assertEqual(expected_rev_update.name, rev_update.name)
         self.assertEqual(expected_rev_update.rectype, rev_update.rectype)
diff --git a/src/provisioningserver/dns/tests/test_zoneconfig.py b/src/provisioningserver/dns/tests/test_zoneconfig.py
index f747a53..5e17b38 100644
--- a/src/provisioningserver/dns/tests/test_zoneconfig.py
+++ b/src/provisioningserver/dns/tests/test_zoneconfig.py
@@ -968,7 +968,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
             ),
         ]
         rev_updates = [
-            DynamicDNSUpdate.as_reverse_record_update(update, str(network))
+            DynamicDNSUpdate.as_reverse_record_update(update, network)
             for update in fwd_updates
         ]
         zone = DNSReverseZoneConfig(
@@ -1053,7 +1053,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
             ),
         ]
         rev_updates = [
-            DynamicDNSUpdate.as_reverse_record_update(update, str(network))
+            DynamicDNSUpdate.as_reverse_record_update(update, network)
             for update in fwd_updates
         ]
         zone = DNSReverseZoneConfig(
@@ -1063,9 +1063,7 @@ class TestDNSReverseZoneConfig(MAASTestCase):
             dynamic_updates=rev_updates,
         )
         glue_rev_updates = [
-            DynamicDNSUpdate.as_reverse_record_update(
-                update, str(glue_network)
-            )
+            DynamicDNSUpdate.as_reverse_record_update(update, glue_network)
             for update in fwd_updates
         ]
         glue_zone = DNSReverseZoneConfig(
@@ -1078,8 +1076,8 @@ class TestDNSReverseZoneConfig(MAASTestCase):
             [
                 "server localhost",
                 "zone 0-26.0.0.10.in-addr.arpa",
-                f"update add {IPAddress(ip1).reverse_dns} {zone.default_ttl} PTR {hostname1}",
-                f"update add {IPAddress(ip2).reverse_dns} {zone.default_ttl} PTR {hostname2}",
+                f"update add {IPAddress(ip1).reverse_dns.replace('0.0.10', '0-26.0.0.10')} {zone.default_ttl} PTR {hostname1}",
+                f"update add {IPAddress(ip2).reverse_dns.replace('0.0.10', '0-26.0.0.10')} {zone.default_ttl} PTR {hostname2}",
                 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}",
                 "send\n",
             ]

References