35
53
def test_next_zone_serial_returns_sequence(self):
54
initial = int(next_zone_serial())
36
55
self.assertSequenceEqual(
37
['%0.10d' % i for i in range(1, 11)],
38
[next_zone_serial() for i in range(10)])
56
['%0.10d' % i for i in range(initial + 1, initial + 11)],
57
[next_zone_serial() for i in range(initial, initial + 10)])
60
class TestDNSConfigModifications(TestCase):
63
("celery", FixtureResource(CeleryFixture())),
67
super(TestDNSConfigModifications, self).setUp()
68
self.bind = self.useFixture(BINDServer())
69
self.patch(conf, 'DNS_CONFIG_DIR', self.bind.config.homedir)
71
# This simulates what should happen when the package is
73
# Create MAAS-specific DNS configuration files.
74
call_command('set_up_dns')
75
# Register MAAS-specific DNS configuration files with the
76
# system's BIND instance.
78
'get_named_conf', edit=True,
79
config_path=self.bind.config.conf_file)
81
self.bind.runner.rndc('reload')
83
def create_nodegroup_with_lease(self, lease_number=1, nodegroup=None):
85
nodegroup = factory.make_node_group(
86
network=IPNetwork('192.168.0.1/24'))
87
node = factory.make_node(
88
nodegroup=nodegroup, set_hostname=True)
89
mac = factory.make_mac_address(node=node)
90
ips = IPRange(nodegroup.ip_range_low, nodegroup.ip_range_high)
91
lease_ip = str(islice(ips, lease_number, lease_number + 1).next())
92
lease = factory.make_dhcp_lease(
93
nodegroup=nodegroup, mac=mac.mac_address, ip=lease_ip)
94
return nodegroup, node, lease
96
def dig_resolve(self, fqdn):
97
"""Resolve `fqdn` using dig. Returns a list of results."""
99
port=self.bind.config.port,
100
commands=[fqdn, '+short']).split('\n')
102
def dig_reverse_resolve(self, ip):
103
"""Reverse resolve `ip` using dig. Returns a list of results."""
105
port=self.bind.config.port,
106
commands=['-x', ip, '+short']).split('\n')
108
def assertDNSMatches(self, hostname, domain, ip):
109
fqdn = "%s.%s" % (hostname, domain)
110
autogenerated_hostname = '%s.' % generated_hostname(ip, domain)
111
# The fqdn resolves to the autogenerated hostname (CNAME record) and
112
# the IP address (A record).
113
self.assertItemsEqual(
114
[autogenerated_hostname, ip],
115
self.dig_resolve(fqdn))
116
# A reverse lookup on the IP returns the autogenerated
119
[autogenerated_hostname], self.dig_reverse_resolve(ip))
121
def test_add_zone_loads_dns_zone(self):
122
nodegroup, node, lease = self.create_nodegroup_with_lease()
124
self.assertDNSMatches(node.hostname, nodegroup.name, lease.ip)
126
def test_change_zone_changes_dns_zone(self):
127
nodegroup, _, _ = self.create_nodegroup_with_lease()
128
write_full_dns_config()
129
nodegroup, new_node, new_lease = (
130
self.create_nodegroup_with_lease(
131
nodegroup=nodegroup, lease_number=2))
132
change_dns_zone(nodegroup)
133
self.assertDNSMatches(new_node.hostname, nodegroup.name, new_lease.ip)
135
def test_write_full_dns_loads_full_dns_config(self):
136
nodegroup, node, lease = self.create_nodegroup_with_lease()
137
write_full_dns_config()
138
self.assertDNSMatches(node.hostname, nodegroup.name, lease.ip)