Merge ~cgrabowski/maas:backport_ensure_reverse_dns_updates_are_always_included into maas:3.3

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 3e211dc52b91e0297f7a7987a88a2ee408259cf9
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:backport_ensure_reverse_dns_updates_are_always_included
Merge into: maas:3.3
Diff against target: 128 lines (+71/-4)
3 files modified
src/maasserver/dns/zonegenerator.py (+1/-1)
src/provisioningserver/dns/tests/test_zoneconfig.py (+57/-0)
src/provisioningserver/dns/zoneconfig.py (+13/-3)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Christian Grabowski Approve
Review via email: mp+436479@code.launchpad.net

Commit message

better handle modified subnet values in update ownership comparison
(cherry picked from commit 89184561b25cb6c05e5d466691a67e23ad3b6265)

To post a comment you must log in.
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

self-approving backport

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b backport_ensure_reverse_dns_updates_are_always_included lp:~cgrabowski/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 3e211dc52b91e0297f7a7987a88a2ee408259cf9

review: Approve

Update scan failed

At least one of the branches involved have failed to scan. You can manually schedule a rescan if required.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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:
465 default_ttl=default_ttl,465 default_ttl=default_ttl,
466 ns_host_name=ns_host_name,466 ns_host_name=ns_host_name,
467 mapping=mapping,467 mapping=mapping,
468 network=IPNetwork(subnet.cidr),468 network=network,
469 dynamic_ranges=dynamic_ranges,469 dynamic_ranges=dynamic_ranges,
470 rfc2317_ranges=glue,470 rfc2317_ranges=glue,
471 exclude={471 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):
1136 ],1136 ],
1137 )1137 )
11381138
1139 def test_dynamic_updates_included_when_large_cidr_has_been_split(self):
1140 patch_zone_file_config_path(self)
1141 domain = factory.make_string()
1142 network = IPNetwork("10.0.0.0/21")
1143 ip1 = factory.pick_ip_in_network(network)
1144 ip2 = factory.pick_ip_in_network(network)
1145 hostname1 = f"{factory.make_string()}.{domain}"
1146 hostname2 = f"{factory.make_string()}.{domain}"
1147 fwd_updates = [
1148 DynamicDNSUpdate(
1149 operation="INSERT",
1150 zone=domain,
1151 name=hostname1,
1152 rectype="A",
1153 answer=ip1,
1154 ),
1155 DynamicDNSUpdate(
1156 operation="INSERT",
1157 zone=domain,
1158 name=hostname2,
1159 rectype="A",
1160 answer=ip2,
1161 ),
1162 ]
1163 rev_updates = [
1164 DynamicDNSUpdate.as_reverse_record_update(update, network)
1165 for update in fwd_updates
1166 ]
1167 # gets changed to a /24 and any other space in the original
1168 # subnet is split into a separate zone for a given /24
1169 zone = DNSReverseZoneConfig(
1170 domain,
1171 serial=random.randint(1, 100),
1172 network=IPNetwork("10.0.0.0/24"),
1173 dynamic_updates=rev_updates,
1174 )
1175 run_command = self.patch(actions, "run_command")
1176 zone.write_config()
1177 zone.write_config()
1178 expected_stdin = "\n".join(
1179 [
1180 "server localhost",
1181 "zone 0.0.10.in-addr.arpa",
1182 f"update add {IPAddress(ip1).reverse_dns} {zone.default_ttl} PTR {hostname1}",
1183 f"update add {IPAddress(ip2).reverse_dns} {zone.default_ttl} PTR {hostname2}",
1184 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}",
1185 "send\n",
1186 ]
1187 )
1188 run_command.assert_called_once_with(
1189 "nsupdate",
1190 "-k",
1191 get_nsupdate_key_path(),
1192 "-v",
1193 stdin=expected_stdin.encode("ascii"),
1194 )
1195
11391196
1140class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):1197class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):
1141 """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""1198 """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""
diff --git a/src/provisioningserver/dns/zoneconfig.py b/src/provisioningserver/dns/zoneconfig.py
index 93f2504..9bb6f11 100644
--- a/src/provisioningserver/dns/zoneconfig.py
+++ b/src/provisioningserver/dns/zoneconfig.py
@@ -105,6 +105,10 @@ def get_details_for_ip_range(ip_range):
105 return intersecting_subnets, prefix, rdns_suffix105 return intersecting_subnets, prefix, rdns_suffix
106106
107107
108def networks_overlap(net1, net2):
109 return net1 in net2 or net2 in net1
110
111
108class DomainInfo:112class DomainInfo:
109 """Information about a DNS zone"""113 """Information about a DNS zone"""
110114
@@ -171,14 +175,20 @@ class DomainConfigBase:
171 else:175 else:
172 return True176 return True
173177
174 def dynamic_update(self, zone_info):178 def dynamic_update(self, zone_info, network=None):
175 nsupdate = NSUpdateCommand(179 nsupdate = NSUpdateCommand(
176 zone_info.zone_name,180 zone_info.zone_name,
177 [181 [
178 update182 update
179 for update in self._dynamic_updates183 for update in self._dynamic_updates
180 if update.zone == zone_info.zone_name184 if update.zone == zone_info.zone_name
181 or IPNetwork(update.subnet) == zone_info.subnetwork185 or (
186 networks_overlap(IPNetwork(update.subnet), network)
187 if network
188 else networks_overlap(
189 IPNetwork(update.subnet), zone_info.subnetwork
190 )
191 )
182 ],192 ],
183 serial=self.serial,193 serial=self.serial,
184 ttl=self.default_ttl,194 ttl=self.default_ttl,
@@ -621,7 +631,7 @@ class DNSReverseZoneConfig(DomainConfigBase):
621 )631 )
622 )632 )
623 if not self.force_config_write and self.zone_file_exists(zi):633 if not self.force_config_write and self.zone_file_exists(zi):
624 self.dynamic_update(zi)634 self.dynamic_update(zi, network=self._network)
625 else:635 else:
626 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)636 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)
627 self.requires_reload = True637 self.requires_reload = True

Subscribers

People subscribed via source and target branches