← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~cgrabowski/maas:ensure_reverse_dns_updates_are_always_included into maas:master

 

Christian Grabowski has proposed merging ~cgrabowski/maas:ensure_reverse_dns_updates_are_always_included into maas:master.

Commit message:
better handle modified subnet values in update ownership comparison



Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~cgrabowski/maas/+git/maas/+merge/436473
-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~cgrabowski/maas:ensure_reverse_dns_updates_are_always_included into maas:master.
diff --git a/src/maasserver/dns/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
index 3088ac9..d6630ce 100644
--- a/src/maasserver/dns/zonegenerator.py
+++ b/src/maasserver/dns/zonegenerator.py
@@ -465,7 +465,7 @@ class ZoneGenerator:
                 default_ttl=default_ttl,
                 ns_host_name=ns_host_name,
                 mapping=mapping,
-                network=IPNetwork(subnet.cidr),
+                network=network,
                 dynamic_ranges=dynamic_ranges,
                 rfc2317_ranges=glue,
                 exclude={
diff --git a/src/provisioningserver/dns/tests/test_zoneconfig.py b/src/provisioningserver/dns/tests/test_zoneconfig.py
index 5e17b38..e9f6dc1 100644
--- a/src/provisioningserver/dns/tests/test_zoneconfig.py
+++ b/src/provisioningserver/dns/tests/test_zoneconfig.py
@@ -1136,6 +1136,63 @@ class TestDNSReverseZoneConfig(MAASTestCase):
             ],
         )
 
+    def test_dynamic_updates_included_when_large_cidr_has_been_split(self):
+        patch_zone_file_config_path(self)
+        domain = factory.make_string()
+        network = IPNetwork("10.0.0.0/21")
+        ip1 = factory.pick_ip_in_network(network)
+        ip2 = factory.pick_ip_in_network(network)
+        hostname1 = f"{factory.make_string()}.{domain}"
+        hostname2 = f"{factory.make_string()}.{domain}"
+        fwd_updates = [
+            DynamicDNSUpdate(
+                operation="INSERT",
+                zone=domain,
+                name=hostname1,
+                rectype="A",
+                answer=ip1,
+            ),
+            DynamicDNSUpdate(
+                operation="INSERT",
+                zone=domain,
+                name=hostname2,
+                rectype="A",
+                answer=ip2,
+            ),
+        ]
+        rev_updates = [
+            DynamicDNSUpdate.as_reverse_record_update(update, network)
+            for update in fwd_updates
+        ]
+        # gets changed to a /24 and any other space in the original
+        # subnet is split into a separate zone for a given /24
+        zone = DNSReverseZoneConfig(
+            domain,
+            serial=random.randint(1, 100),
+            network=IPNetwork("10.0.0.0/24"),
+            dynamic_updates=rev_updates,
+        )
+        run_command = self.patch(actions, "run_command")
+        zone.write_config()
+        zone.write_config()
+        expected_stdin = "\n".join(
+            [
+                "server localhost",
+                "zone 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 0.0.10.in-addr.arpa {zone.default_ttl} SOA 0.0.10.in-addr.arpa. nobody.example.com. {zone.serial} 600 1800 604800 {zone.default_ttl}",
+                "send\n",
+            ]
+        )
+        run_command.assert_called_once_with(
+            "nsupdate",
+            "-k",
+            get_nsupdate_key_path(),
+            "-v",
+            stdin=expected_stdin.encode("ascii"),
+        )
+
 
 class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):
     """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""
diff --git a/src/provisioningserver/dns/zoneconfig.py b/src/provisioningserver/dns/zoneconfig.py
index ee6c15e..1eaa602 100644
--- a/src/provisioningserver/dns/zoneconfig.py
+++ b/src/provisioningserver/dns/zoneconfig.py
@@ -172,14 +172,18 @@ class DomainConfigBase:
         else:
             return True
 
-    def dynamic_update(self, zone_info):
+    def dynamic_update(self, zone_info, network=None):
         nsupdate = NSUpdateCommand(
             zone_info.zone_name,
             [
                 update
                 for update in self._dynamic_updates
                 if update.zone == zone_info.zone_name
-                or IPNetwork(update.subnet) == zone_info.subnetwork
+                or (
+                    (IPNetwork(update.subnet) in network or network in IPNetwork(update.subnet))
+                    if network
+                    else (IPNetwork(update.subnet) in zone_info.subnetwork or zone_info.subnetwork in IPNetwork(update.subnet))
+                )
             ],
             serial=self.serial,
             ttl=self.default_ttl,

Follow ups