Merge ~ack/maas:1871584-subnet-no-dns-fix-2.7 into maas:2.7

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: aa96bdeebcd2a1929a225176fb98bf430f386a54
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:1871584-subnet-no-dns-fix-2.7
Merge into: maas:2.7
Diff against target: 158 lines (+69/-17)
2 files modified
src/maasserver/dns/tests/test_zonegenerator.py (+51/-1)
src/maasserver/dns/zonegenerator.py (+18/-16)
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
MAAS Lander unittests Pending
Review via email: mp+382398@code.launchpad.net

Commit message

LP: #1871584 - include MAAS IP in DNS zone even if subnet has allow_dns false

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) :
review: Approve

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/dns/tests/test_zonegenerator.py b/src/maasserver/dns/tests/test_zonegenerator.py
index 7499924..5655873 100644
--- a/src/maasserver/dns/tests/test_zonegenerator.py
+++ b/src/maasserver/dns/tests/test_zonegenerator.py
@@ -27,6 +27,7 @@ from maasserver.dns import zonegenerator
27from maasserver.dns.zonegenerator import (27from maasserver.dns.zonegenerator import (
28 get_dns_search_paths,28 get_dns_search_paths,
29 get_dns_server_address,29 get_dns_server_address,
30 get_dns_server_addresses,
30 get_hostname_dnsdata_mapping,31 get_hostname_dnsdata_mapping,
31 get_hostname_ip_mapping,32 get_hostname_ip_mapping,
32 InternalDomain,33 InternalDomain,
@@ -82,7 +83,7 @@ class TestGetDNSServerAddress(MAASServerTestCase):
82 self.assertThat(83 self.assertThat(
83 patch,84 patch,
84 MockCalledOnceWith(85 MockCalledOnceWith(
85 ANY,86 rack_controller=None,
86 include_alternates=False,87 include_alternates=False,
87 ipv4=ipv4,88 ipv4=ipv4,
88 ipv6=ipv6,89 ipv6=ipv6,
@@ -135,6 +136,37 @@ class TestGetDNSServerAddress(MAASServerTestCase):
135 self.assertIsNone(get_dns_server_address(rack_controller))136 self.assertIsNone(get_dns_server_address(rack_controller))
136137
137138
139class TestGetDNSServerAddresses(MAASServerTestCase):
140 def test_no_rack_all_subnets(self):
141 subnet1 = factory.make_Subnet(cidr="10.10.0.0/24", allow_dns=False)
142 subnet2 = factory.make_Subnet(cidr="10.20.0.0/24", allow_dns=True)
143 ip1 = factory.make_StaticIPAddress(subnet=subnet1)
144 ip2 = factory.make_StaticIPAddress(subnet=subnet2)
145 ips = {IPAddress(ip1.ip), IPAddress(ip2.ip)}
146 resolver = self.patch(server_address, "resolve_hostname")
147 resolver.return_value = ips
148 rack_controller = factory.make_RackController()
149 self.assertCountEqual(
150 get_dns_server_addresses(
151 rack_controller=rack_controller, filter_allowed_dns=False
152 ),
153 ips,
154 )
155
156 def test_with_rack_only_allow_dns(self):
157 subnet1 = factory.make_Subnet(cidr="10.10.0.0/24", allow_dns=False)
158 subnet2 = factory.make_Subnet(cidr="10.20.0.0/24", allow_dns=True)
159 ip1 = factory.make_StaticIPAddress(subnet=subnet1)
160 ip2 = factory.make_StaticIPAddress(subnet=subnet2)
161 resolver = self.patch(server_address, "resolve_hostname")
162 resolver.return_value = {IPAddress(ip1.ip), IPAddress(ip2.ip)}
163 rack_controller = factory.make_RackController()
164 self.assertCountEqual(
165 get_dns_server_addresses(rack_controller=rack_controller),
166 [IPAddress(ip2.ip)],
167 )
168
169
138class TestGetDNSSearchPaths(MAASServerTestCase):170class TestGetDNSSearchPaths(MAASServerTestCase):
139 def test__returns_all_authoritative_domains(self):171 def test__returns_all_authoritative_domains(self):
140 domain_names = get_dns_search_paths()172 domain_names = get_dns_search_paths()
@@ -541,6 +573,24 @@ class TestZoneGenerator(MAASServerTestCase):
541 )573 )
542 self.assertEqual({}, zones[2]._mapping)574 self.assertEqual({}, zones[2]._mapping)
543575
576 def test_forward_zone_includes_subnets_with_allow_dns_false(self):
577 default_ttl = random.randint(10, 300)
578 Config.objects.set_config("default_dns_ttl", default_ttl)
579 default_domain = Domain.objects.get_default_domain()
580 subnet = factory.make_Subnet(cidr="10.10.0.0/24", allow_dns=False)
581 ip = factory.make_StaticIPAddress(subnet=subnet)
582 resolver = self.patch(server_address, "resolve_hostname")
583 resolver.return_value = {IPAddress(ip.ip)}
584 zones = ZoneGenerator(
585 [default_domain], subnet, serial=random.randint(0, 65535)
586 )
587 [forward_zone] = [
588 zone for zone in zones if isinstance(zone, DNSForwardZoneConfig)
589 ]
590 self.assertEqual(
591 forward_zone._other_mapping["@"].rrset, {(default_ttl, "A", ip.ip)}
592 )
593
544 def rfc2317_network(self, network):594 def rfc2317_network(self, network):
545 """Returns the network that rfc2317 glue goes in, if any."""595 """Returns the network that rfc2317 glue goes in, if any."""
546 net = network596 net = network
diff --git a/src/maasserver/dns/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
index 140871d..cda8222 100644
--- a/src/maasserver/dns/zonegenerator.py
+++ b/src/maasserver/dns/zonegenerator.py
@@ -120,6 +120,7 @@ def get_dns_server_addresses(
120 ipv6=True,120 ipv6=True,
121 include_alternates=False,121 include_alternates=False,
122 default_region_ip=None,122 default_region_ip=None,
123 filter_allowed_dns=True,
123):124):
124 """Return the DNS server's IP addresses.125 """Return the DNS server's IP addresses.
125126
@@ -136,13 +137,15 @@ def get_dns_server_addresses(
136 :param include_alternates: Include IP addresses from other regions?137 :param include_alternates: Include IP addresses from other regions?
137 :param default_region_ip: The default source IP address to be used, if a138 :param default_region_ip: The default source IP address to be used, if a
138 specific URL is not defined.139 specific URL is not defined.
140 :param filter_allowed_dns: If true, only include addresses for subnets
141 with allow_dns=True.
139 :return: List of IPAddress to use. Loopback addresses are removed from the142 :return: List of IPAddress to use. Loopback addresses are removed from the
140 list, unless there are no non-loopback addresses.143 list, unless there are no non-loopback addresses.
141144
142 """145 """
143 try:146 try:
144 iplist = get_maas_facing_server_addresses(147 ips = get_maas_facing_server_addresses(
145 rack_controller,148 rack_controller=rack_controller,
146 ipv4=ipv4,149 ipv4=ipv4,
147 ipv6=ipv6,150 ipv6=ipv6,
148 include_alternates=include_alternates,151 include_alternates=include_alternates,
@@ -157,22 +160,21 @@ def get_dns_server_addresses(
157 "local_config_set --maas-url' command." % e.strerror160 "local_config_set --maas-url' command." % e.strerror
158 )161 )
159162
160 # LP:1847537 - Filter out MAAS DNS servers running on subnets which do not163 if filter_allowed_dns:
161 # allow DNS to be provided from MAAS.164 ips = [
162 filtered_list = [165 ip
163 ip166 for ip in ips
164 for ip in iplist167 if getattr(
165 if getattr(168 Subnet.objects.get_best_subnet_for_ip(ip), "allow_dns", True
166 Subnet.objects.get_best_subnet_for_ip(ip), "allow_dns", True169 )
167 )170 ]
168 ]171 non_loop = [ip for ip in ips if not ip.is_loopback()]
169 non_loop = [ip for ip in filtered_list if not ip.is_loopback()]172 if non_loop:
170 if len(non_loop) > 0:
171 return non_loop173 return non_loop
172 else:174 else:
173 for ip in filtered_list:175 for ip in ips:
174 warn_loopback(ip)176 warn_loopback(ip)
175 return filtered_list177 return ips
176178
177179
178def get_dns_search_paths():180def get_dns_search_paths():
@@ -237,7 +239,7 @@ class ZoneGenerator:
237 internal_domains,239 internal_domains,
238 ):240 ):
239 """Generator of forward zones, collated by domain name."""241 """Generator of forward zones, collated by domain name."""
240 dns_ip_list = get_dns_server_addresses()242 dns_ip_list = get_dns_server_addresses(filter_allowed_dns=False)
241 domains = set(domains)243 domains = set(domains)
242244
243 # For each of the domains that we are generating, create the zone from:245 # For each of the domains that we are generating, create the zone from:

Subscribers

People subscribed via source and target branches