Merge ~cgrabowski/maas:ensure_reverse_dns_updates_are_always_included into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: b32fce75827dc516efc21edb2e230d751152fd17
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:ensure_reverse_dns_updates_are_always_included
Merge into: maas:master
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
Alexsander de Souza Approve
Review via email: mp+436473@code.launchpad.net

Commit message

better handle modified subnet values in update ownership comparison

To post a comment you must log in.
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

+1

review: Approve
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

jenkins: !test

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

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

STATUS: SUCCESS
COMMIT: b32fce75827dc516efc21edb2e230d751152fd17

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/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
2index 3088ac9..d6630ce 100644
3--- a/src/maasserver/dns/zonegenerator.py
4+++ b/src/maasserver/dns/zonegenerator.py
5@@ -465,7 +465,7 @@ class ZoneGenerator:
6 default_ttl=default_ttl,
7 ns_host_name=ns_host_name,
8 mapping=mapping,
9- network=IPNetwork(subnet.cidr),
10+ network=network,
11 dynamic_ranges=dynamic_ranges,
12 rfc2317_ranges=glue,
13 exclude={
14diff --git a/src/provisioningserver/dns/tests/test_zoneconfig.py b/src/provisioningserver/dns/tests/test_zoneconfig.py
15index 5e17b38..e9f6dc1 100644
16--- a/src/provisioningserver/dns/tests/test_zoneconfig.py
17+++ b/src/provisioningserver/dns/tests/test_zoneconfig.py
18@@ -1136,6 +1136,63 @@ class TestDNSReverseZoneConfig(MAASTestCase):
19 ],
20 )
21
22+ def test_dynamic_updates_included_when_large_cidr_has_been_split(self):
23+ patch_zone_file_config_path(self)
24+ domain = factory.make_string()
25+ network = IPNetwork("10.0.0.0/21")
26+ ip1 = factory.pick_ip_in_network(network)
27+ ip2 = factory.pick_ip_in_network(network)
28+ hostname1 = f"{factory.make_string()}.{domain}"
29+ hostname2 = f"{factory.make_string()}.{domain}"
30+ fwd_updates = [
31+ DynamicDNSUpdate(
32+ operation="INSERT",
33+ zone=domain,
34+ name=hostname1,
35+ rectype="A",
36+ answer=ip1,
37+ ),
38+ DynamicDNSUpdate(
39+ operation="INSERT",
40+ zone=domain,
41+ name=hostname2,
42+ rectype="A",
43+ answer=ip2,
44+ ),
45+ ]
46+ rev_updates = [
47+ DynamicDNSUpdate.as_reverse_record_update(update, network)
48+ for update in fwd_updates
49+ ]
50+ # gets changed to a /24 and any other space in the original
51+ # subnet is split into a separate zone for a given /24
52+ zone = DNSReverseZoneConfig(
53+ domain,
54+ serial=random.randint(1, 100),
55+ network=IPNetwork("10.0.0.0/24"),
56+ dynamic_updates=rev_updates,
57+ )
58+ run_command = self.patch(actions, "run_command")
59+ zone.write_config()
60+ zone.write_config()
61+ expected_stdin = "\n".join(
62+ [
63+ "server localhost",
64+ "zone 0.0.10.in-addr.arpa",
65+ f"update add {IPAddress(ip1).reverse_dns} {zone.default_ttl} PTR {hostname1}",
66+ f"update add {IPAddress(ip2).reverse_dns} {zone.default_ttl} PTR {hostname2}",
67+ 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}",
68+ "send\n",
69+ ]
70+ )
71+ run_command.assert_called_once_with(
72+ "nsupdate",
73+ "-k",
74+ get_nsupdate_key_path(),
75+ "-v",
76+ stdin=expected_stdin.encode("ascii"),
77+ )
78+
79
80 class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):
81 """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""
82diff --git a/src/provisioningserver/dns/zoneconfig.py b/src/provisioningserver/dns/zoneconfig.py
83index ee6c15e..ec5da14 100644
84--- a/src/provisioningserver/dns/zoneconfig.py
85+++ b/src/provisioningserver/dns/zoneconfig.py
86@@ -106,6 +106,10 @@ def get_details_for_ip_range(ip_range):
87 return intersecting_subnets, prefix, rdns_suffix
88
89
90+def networks_overlap(net1, net2):
91+ return net1 in net2 or net2 in net1
92+
93+
94 class DomainInfo:
95 """Information about a DNS zone"""
96
97@@ -172,14 +176,20 @@ class DomainConfigBase:
98 else:
99 return True
100
101- def dynamic_update(self, zone_info):
102+ def dynamic_update(self, zone_info, network=None):
103 nsupdate = NSUpdateCommand(
104 zone_info.zone_name,
105 [
106 update
107 for update in self._dynamic_updates
108 if update.zone == zone_info.zone_name
109- or IPNetwork(update.subnet) == zone_info.subnetwork
110+ or (
111+ networks_overlap(IPNetwork(update.subnet), network)
112+ if network
113+ else networks_overlap(
114+ IPNetwork(update.subnet), zone_info.subnetwork
115+ )
116+ )
117 ],
118 serial=self.serial,
119 ttl=self.default_ttl,
120@@ -632,7 +642,7 @@ class DNSReverseZoneConfig(DomainConfigBase):
121 )
122 )
123 if not self.force_config_write and self.zone_file_exists(zi):
124- self.dynamic_update(zi)
125+ self.dynamic_update(zi, network=self._network)
126 PROMETHEUS_METRICS.update(
127 "maas_dns_dynamic_update_count",
128 "inc",

Subscribers

People subscribed via source and target branches