Merge ~cgrabowski/maas:backport_fix_missing_reverse_records into maas:3.3

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 0c9c3136e4e1548e83c7ae068b2c8ec7545c08c5
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:backport_fix_missing_reverse_records
Merge into: maas:3.3
Diff against target: 226 lines (+100/-31)
5 files modified
src/maasserver/triggers/system.py (+1/-1)
src/provisioningserver/dns/actions.py (+13/-0)
src/provisioningserver/dns/config.py (+2/-0)
src/provisioningserver/dns/tests/test_zoneconfig.py (+61/-0)
src/provisioningserver/dns/zoneconfig.py (+23/-30)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Christian Grabowski Approve
Review via email: mp+436339@code.launchpad.net

Commit message

use zone_info.zone_name instead of domain to freeze/thaw reverse updates
fix default ttls
(cherry picked from commit d4b96129a725fda571a05a67efecde937cb55da2)

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_fix_missing_reverse_records lp:~cgrabowski/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1860/consoleText
COMMIT: 0c9c3136e4e1548e83c7ae068b2c8ec7545c08c5

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

jenkins: !test

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

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

STATUS: SUCCESS
COMMIT: 0c9c3136e4e1548e83c7ae068b2c8ec7545c08c5

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

LANDING
-b backport_fix_missing_reverse_records lp:~cgrabowski/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: FAILED BUILD
LOG: http://maas-ci.internal:8080/job/maas-tester/1863/consoleText

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/triggers/system.py b/src/maasserver/triggers/system.py
index 8e5ba5a..9aa7e41 100644
--- a/src/maasserver/triggers/system.py
+++ b/src/maasserver/triggers/system.py
@@ -2143,7 +2143,7 @@ def render_dns_dynamic_update_node(op):
2143 domain text;2143 domain text;
2144 address_ttl int;2144 address_ttl int;
2145 BEGIN2145 BEGIN
2146 IF ((TG_OP = 'INSERT' OR TG_OP = 'UPDATE') AND TG_LEVEL = 'ROW') THEN2146 IF ((TG_OP = 'INSERT' OR TG_OP = 'UPDATE') AND TG_LEVEL = 'ROW') THEN
2147 IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN2147 IF NEW.node_type <> {NODE_TYPE.DEVICE} AND NEW.node_type <> {NODE_TYPE.MACHINE} THEN
2148 PERFORM pg_notify('sys_dns_updates', 'RELOAD');2148 PERFORM pg_notify('sys_dns_updates', 'RELOAD');
2149 END IF;2149 END IF;
diff --git a/src/provisioningserver/dns/actions.py b/src/provisioningserver/dns/actions.py
index 7749ff5..64fffda 100644
--- a/src/provisioningserver/dns/actions.py
+++ b/src/provisioningserver/dns/actions.py
@@ -4,6 +4,7 @@
4"""Low-level actions to manage the DNS service, like reloading zones."""4"""Low-level actions to manage the DNS service, like reloading zones."""
55
6from collections.abc import Sequence6from collections.abc import Sequence
7from contextlib import contextmanager, nullcontext
7from subprocess import CalledProcessError, TimeoutExpired8from subprocess import CalledProcessError, TimeoutExpired
8from time import sleep9from time import sleep
910
@@ -84,6 +85,18 @@ def bind_thaw_zone(zone=None, timeout=2):
84 raise85 raise
8586
8687
88@contextmanager
89def freeze_thaw_zone(required, zone=None, timeout=2):
90 if not required:
91 yield nullcontext()
92 else:
93 bind_freeze_zone(zone=zone, timeout=timeout)
94 try:
95 yield
96 finally:
97 bind_thaw_zone(zone=zone, timeout=timeout)
98
99
87def bind_reload(timeout=2):100def bind_reload(timeout=2):
88 """Ask BIND to reload its configuration and all zone files. This operation101 """Ask BIND to reload its configuration and all zone files. This operation
89 is 'best effort' (with logging) as the server may not be running, and there102 is 'best effort' (with logging) as the server may not be running, and there
diff --git a/src/provisioningserver/dns/config.py b/src/provisioningserver/dns/config.py
index 729b570..6e11f73 100644
--- a/src/provisioningserver/dns/config.py
+++ b/src/provisioningserver/dns/config.py
@@ -62,6 +62,8 @@ class DynamicDNSUpdate:
62 else:62 else:
63 if ip.version == 6:63 if ip.version == 6:
64 rectype = "AAAA"64 rectype = "AAAA"
65 if kwargs.get("ttl") == 0: # default ttl
66 kwargs["ttl"] = 30
65 return cls(answer=answer, rectype=rectype, **kwargs)67 return cls(answer=answer, rectype=rectype, **kwargs)
6668
67 @classmethod69 @classmethod
diff --git a/src/provisioningserver/dns/tests/test_zoneconfig.py b/src/provisioningserver/dns/tests/test_zoneconfig.py
index 10ee0f7..f747a53 100644
--- a/src/provisioningserver/dns/tests/test_zoneconfig.py
+++ b/src/provisioningserver/dns/tests/test_zoneconfig.py
@@ -8,6 +8,7 @@ from itertools import chain
8import os.path8import os.path
9import random9import random
10from tempfile import mktemp10from tempfile import mktemp
11from unittest.mock import call
1112
12from netaddr import IPAddress, IPNetwork, IPRange13from netaddr import IPAddress, IPNetwork, IPRange
13from testtools.matchers import (14from testtools.matchers import (
@@ -488,6 +489,42 @@ class TestDNSForwardZoneConfig(MAASTestCase):
488 stdin=expected_stdin.encode("ascii"),489 stdin=expected_stdin.encode("ascii"),
489 )490 )
490491
492 def test_full_reload_calls_freeze_thaw(self):
493 patch_zone_file_config_path(self)
494 execute_rndc_command = self.patch(actions, "execute_rndc_command")
495 domain = factory.make_string()
496 network = factory.make_ipv4_network()
497 ipv4_hostname = factory.make_name("host")
498 ipv4_ip = factory.pick_ip_in_network(network)
499 ipv6_hostname = factory.make_name("host")
500 ipv6_ip = factory.make_ipv6_address()
501 ipv6_network = factory.make_ipv6_network()
502 dynamic_range = IPRange(ipv6_network.first, ipv6_network.last)
503 ttl = random.randint(10, 300)
504 mapping = {
505 ipv4_hostname: HostnameIPMapping(None, ttl, {ipv4_ip}),
506 ipv6_hostname: HostnameIPMapping(None, ttl, {ipv6_ip}),
507 }
508 dns_zone_config = DNSForwardZoneConfig(
509 domain,
510 serial=random.randint(1, 100),
511 mapping=mapping,
512 default_ttl=ttl,
513 dynamic_ranges=[dynamic_range],
514 )
515 self.patch(dns_zone_config, "get_GENERATE_directives")
516 self.patch(actions, "run_command")
517 dns_zone_config.write_config()
518 dns_zone_config.force_config_write = True
519 dns_zone_config.write_config()
520 self.assertCountEqual(
521 execute_rndc_command.call_args_list,
522 [
523 call(("freeze", domain), timeout=2),
524 call(("thaw", domain), timeout=2),
525 ],
526 )
527
491528
492class TestDNSReverseZoneConfig(MAASTestCase):529class TestDNSReverseZoneConfig(MAASTestCase):
493 """Tests for DNSReverseZoneConfig."""530 """Tests for DNSReverseZoneConfig."""
@@ -1077,6 +1114,30 @@ class TestDNSReverseZoneConfig(MAASTestCase):
1077 stdin=expected_stdin.encode("ascii"),1114 stdin=expected_stdin.encode("ascii"),
1078 )1115 )
10791116
1117 def test_full_reload_calls_freeze_thaw(self):
1118 patch_zone_file_config_path(self)
1119 execute_rndc_command = self.patch(
1120 provisioningserver.dns.actions, "execute_rndc_command"
1121 )
1122 domain = factory.make_string()
1123 network = IPNetwork("10.0.0.0/24")
1124 zone = DNSReverseZoneConfig(
1125 domain,
1126 serial=random.randint(1, 100),
1127 network=network,
1128 )
1129 self.patch(actions, "run_command")
1130 zone.write_config()
1131 zone.force_config_write = True
1132 zone.write_config()
1133 self.assertCountEqual(
1134 execute_rndc_command.call_args_list,
1135 [
1136 call(("freeze", "0.0.10.in-addr.arpa"), timeout=2),
1137 call(("thaw", "0.0.10.in-addr.arpa"), timeout=2),
1138 ],
1139 )
1140
10801141
1081class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):1142class TestDNSReverseZoneConfig_GetGenerateDirectives(MAASTestCase):
1082 """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""1143 """Tests for `DNSReverseZoneConfig.get_GENERATE_directives()`."""
diff --git a/src/provisioningserver/dns/zoneconfig.py b/src/provisioningserver/dns/zoneconfig.py
index 59e714b..93f2504 100644
--- a/src/provisioningserver/dns/zoneconfig.py
+++ b/src/provisioningserver/dns/zoneconfig.py
@@ -12,11 +12,7 @@ from pathlib import Path
12from netaddr import IPAddress, IPNetwork, spanning_cidr12from netaddr import IPAddress, IPNetwork, spanning_cidr
13from netaddr.core import AddrFormatError13from netaddr.core import AddrFormatError
1414
15from provisioningserver.dns.actions import (15from provisioningserver.dns.actions import freeze_thaw_zone, NSUpdateCommand
16 bind_freeze_zone,
17 bind_thaw_zone,
18 NSUpdateCommand,
19)
20from provisioningserver.dns.config import (16from provisioningserver.dns.config import (
21 compose_zone_file_config_path,17 compose_zone_file_config_path,
22 render_dns_template,18 render_dns_template,
@@ -338,9 +334,7 @@ class DNSForwardZoneConfig(DomainConfigBase):
338 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)334 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)
339 self.requires_reload = True335 self.requires_reload = True
340 needs_freeze_thaw = self.zone_file_exists(zi)336 needs_freeze_thaw = self.zone_file_exists(zi)
341 if needs_freeze_thaw:337 with freeze_thaw_zone(needs_freeze_thaw, zone=zi.zone_name):
342 bind_freeze_zone(zone=self.domain)
343 try:
344 self.write_zone_file(338 self.write_zone_file(
345 zi.target_path,339 zi.target_path,
346 self.make_parameters(),340 self.make_parameters(),
@@ -359,9 +353,6 @@ class DNSForwardZoneConfig(DomainConfigBase):
359 "generate_directives": {"A": generate_directives},353 "generate_directives": {"A": generate_directives},
360 },354 },
361 )355 )
362 finally:
363 if needs_freeze_thaw:
364 bind_thaw_zone(zone=self.domain)
365356
366357
367class DNSReverseZoneConfig(DomainConfigBase):358class DNSReverseZoneConfig(DomainConfigBase):
@@ -634,23 +625,25 @@ class DNSReverseZoneConfig(DomainConfigBase):
634 else:625 else:
635 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)626 Path(f"{zi.target_path}.jnl").unlink(missing_ok=True)
636 self.requires_reload = True627 self.requires_reload = True
637 self.write_zone_file(628 needs_freeze_thaw = self.zone_file_exists(zi)
638 zi.target_path,629 with freeze_thaw_zone(needs_freeze_thaw, zone=zi.zone_name):
639 self.make_parameters(),630 self.write_zone_file(
640 {631 zi.target_path,
641 "mappings": {632 self.make_parameters(),
642 "PTR": self.get_PTR_mapping(633 {
643 self._mapping, zi.subnetwork634 "mappings": {
644 )635 "PTR": self.get_PTR_mapping(
645 },636 self._mapping, zi.subnetwork
646 "other_mapping": [],637 )
647 "generate_directives": {638 },
648 "PTR": generate_directives,639 "other_mapping": [],
649 "CNAME": self.get_rfc2317_GENERATE_directives(640 "generate_directives": {
650 zi.subnetwork,641 "PTR": generate_directives,
651 self._rfc2317_ranges,642 "CNAME": self.get_rfc2317_GENERATE_directives(
652 self.domain,643 zi.subnetwork,
653 ),644 self._rfc2317_ranges,
645 self.domain,
646 ),
647 },
654 },648 },
655 },649 )
656 )

Subscribers

People subscribed via source and target branches