def test_handles_slash_32_dynamic_range(self): target_dir = patch_dns_config_path(self) domain = factory.make_string() network = factory.make_ipv4_network() ipv4_hostname = factory.make_name("host") ipv4_ip = factory.pick_ip_in_network(network) range_ip = factory.pick_ip_in_network(network, but_not={ipv4_ip}) ipv6_hostname = factory.make_name("host") ipv6_ip = factory.make_ipv6_address() ttl = random.randint(10, 300) mapping = { ipv4_hostname: HostnameIPMapping(None, ttl, {ipv4_ip}), ipv6_hostname: HostnameIPMapping(None, ttl, {ipv6_ip}), } dynamic_range = IPRange(IPAddress(range_ip), IPAddress(range_ip)) expected_generate_directives = DNSForwardZoneConfig.get_GENERATE_directives( dynamic_range) other_mapping = { ipv4_hostname: HostnameRRsetMapping(None, {(ttl, "MX", "10 bar")}) } dns_zone_config = DNSForwardZoneConfig( domain, serial=random.randint(1, 100), other_mapping=other_mapping, default_ttl=ttl, mapping=mapping, dynamic_ranges=[dynamic_range], ) dns_zone_config.write_config() self.assertThat( os.path.join(target_dir, "zone.%s" % domain), FileContains(matcher=ContainsAll([ "$TTL %d" % ttl, "%s %d IN A %s" % (ipv4_hostname, ttl, ipv4_ip), "%s %d IN AAAA %s" % (ipv6_hostname, ttl, ipv6_ip), "%s %d IN MX 10 bar" % (ipv4_hostname, ttl), ] + [ "$GENERATE %s %s IN A %s" % (iterator_values, reverse_dns, hostname) for iterator_values, reverse_dns, hostname in expected_generate_directives ])), )
def test_writes_reverse_dns_zone_config(self): target_dir = patch_dns_config_path(self) domain = factory.make_string() ns_host_name = factory.make_name("ns") network = IPNetwork("192.168.0.1/22") dynamic_network = IPNetwork("192.168.0.1/28") dns_zone_config = DNSReverseZoneConfig( domain, serial=random.randint(1, 100), network=network, ns_host_name=ns_host_name, dynamic_ranges=[ IPRange(dynamic_network.first, dynamic_network.last) ], ) dns_zone_config.write_config() for sub in range(4): reverse_file_name = "zone.%d.168.192.in-addr.arpa" % sub expected_GEN_direct = dns_zone_config.get_GENERATE_directives( dynamic_network, domain, DomainInfo( IPNetwork("192.168.%d.0/24" % sub), "%d.168.192.in-addr.arpa" % sub, ), ) expected = ContainsAll( ["30 IN NS %s." % ns_host_name] + [ "$GENERATE %s %s IN PTR %s" % (iterator_values, reverse_dns, hostname) for iterator_values, reverse_dns, hostname in expected_GEN_direct ] ) self.assertThat( os.path.join(target_dir, reverse_file_name), FileContains(matcher=expected), )
def test_writes_dns_zone_config(self): target_dir = patch_dns_config_path(self) domain = factory.make_string() network = factory.make_ipv4_network() ipv4_hostname = factory.make_name('host') ipv4_ip = factory.pick_ip_in_network(network) ipv6_hostname = factory.make_name('host') ipv6_ip = factory.make_ipv6_address() ttl = random.randint(10, 300) mapping = { ipv4_hostname: HostnameIPMapping(None, ttl, {ipv4_ip}), ipv6_hostname: HostnameIPMapping(None, ttl, {ipv6_ip}), } expected_generate_directives = ( DNSForwardZoneConfig.get_GENERATE_directives(network)) other_mapping = { ipv4_hostname: HostnameRRsetMapping(None, {(ttl, 'MX', '10 bar')}) } dns_zone_config = DNSForwardZoneConfig( domain, serial=random.randint(1, 100), other_mapping=other_mapping, default_ttl=ttl, mapping=mapping, dynamic_ranges=[IPRange(network.first, network.last)]) dns_zone_config.write_config() self.assertThat( os.path.join(target_dir, 'zone.%s' % domain), FileContains(matcher=ContainsAll([ '$TTL %d' % ttl, '%s %d IN A %s' % (ipv4_hostname, ttl, ipv4_ip), '%s %d IN AAAA %s' % (ipv6_hostname, ttl, ipv6_ip), '%s %d IN MX 10 bar' % (ipv4_hostname, ttl), ] + [ '$GENERATE %s %s IN A %s' % (iterator_values, reverse_dns, hostname) for iterator_values, reverse_dns, hostname in expected_generate_directives ])))
def test_write_config_makes_config_world_readable(self): target_dir = patch_dns_config_path(self) DNSConfig().write_config() config_file = FilePath(os.path.join(target_dir, MAAS_NAMED_CONF_NAME)) self.assertTrue(config_file.getPermissions().other.read)
def test_write_config_DNSConfigDirectoryMissing_if_dir_missing(self): dnsconfig = DNSConfig() dir_name = patch_dns_config_path(self) os.rmdir(dir_name) self.assertRaises(DNSConfigDirectoryMissing, dnsconfig.write_config)
def test_returns_filename_in_dns_config_dir(self): dns_dir = patch_dns_config_path(self) filename = factory.make_name("config") self.assertEqual(os.path.join(dns_dir, filename), compose_config_path(filename))
def test_set_up_options_conf_handles_no_upstream_dns(self): dns_conf_dir = patch_dns_config_path(self) set_up_options_conf() target_file = os.path.join(dns_conf_dir, MAAS_NAMED_CONF_OPTIONS_INSIDE_NAME) self.assertThat(target_file, FileExists())