~ubuntu-branches/ubuntu/raring/maas/raring-proposed

« back to all changes in this revision

Viewing changes to src/maasserver/tests/test_dns.py

  • Committer: Package Import Robot
  • Author(s): Andres Rodriguez
  • Date: 2012-07-17 08:28:36 UTC
  • mfrom: (1.1.16)
  • Revision ID: package-import@ubuntu.com-20120717082836-ucb2vou8tqg353eq
Tags: 0.1+bzr777+dfsg-0ubuntu1
* New upstream release
* Only run 'maas' command as root. (LP: #974046)
  - debian/extras/maas: Check id.
  - debian/maas.install: Install in 'sbin'.
* debian/maas.postinst:
  - restart apache2 after everything gets processed.
  - Update version to handle upgrades.
* debian/extras/maas-provision: Add wrapper to access 'maasprovisiong'
  command line.
* debian/patches/99_temporary_fix_path.patch: Dropped. No longer needed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
__metaclass__ = type
13
13
__all__ = []
14
14
 
 
15
 
 
16
from itertools import islice
 
17
 
 
18
from django.core.management import call_command
15
19
from maasserver.dns import (
 
20
    add_zone,
 
21
    change_dns_zone,
16
22
    next_zone_serial,
 
23
    write_full_dns_config,
17
24
    zone_serial,
18
25
    )
 
26
from maasserver.testing.factory import factory
19
27
from maasserver.testing.testcase import TestCase
 
28
from maastesting.bindfixture import BINDServer
 
29
from maastesting.celery import CeleryFixture
 
30
from maastesting.tests.test_bindfixture import dig_call
 
31
from netaddr import (
 
32
    IPNetwork,
 
33
    IPRange,
 
34
    )
 
35
from provisioningserver.dns.config import conf
 
36
from provisioningserver.dns.utils import generated_hostname
 
37
from testresources import FixtureResource
20
38
from testtools.matchers import MatchesStructure
21
39
 
22
40
 
33
51
            )
34
52
 
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)])
 
58
 
 
59
 
 
60
class TestDNSConfigModifications(TestCase):
 
61
 
 
62
    resources = (
 
63
        ("celery", FixtureResource(CeleryFixture())),
 
64
        )
 
65
 
 
66
    def setUp(self):
 
67
        super(TestDNSConfigModifications, self).setUp()
 
68
        self.bind = self.useFixture(BINDServer())
 
69
        self.patch(conf, 'DNS_CONFIG_DIR', self.bind.config.homedir)
 
70
 
 
71
        # This simulates what should happen when the package is
 
72
        # installed:
 
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.
 
77
        call_command(
 
78
            'get_named_conf', edit=True,
 
79
            config_path=self.bind.config.conf_file)
 
80
        # Reload BIND.
 
81
        self.bind.runner.rndc('reload')
 
82
 
 
83
    def create_nodegroup_with_lease(self, lease_number=1, nodegroup=None):
 
84
        if nodegroup is 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
 
95
 
 
96
    def dig_resolve(self, fqdn):
 
97
        """Resolve `fqdn` using dig.  Returns a list of results."""
 
98
        return dig_call(
 
99
            port=self.bind.config.port,
 
100
            commands=[fqdn, '+short']).split('\n')
 
101
 
 
102
    def dig_reverse_resolve(self, ip):
 
103
        """Reverse resolve `ip` using dig.  Returns a list of results."""
 
104
        return dig_call(
 
105
            port=self.bind.config.port,
 
106
            commands=['-x', ip, '+short']).split('\n')
 
107
 
 
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
 
117
        # hostname.
 
118
        self.assertEqual(
 
119
            [autogenerated_hostname], self.dig_reverse_resolve(ip))
 
120
 
 
121
    def test_add_zone_loads_dns_zone(self):
 
122
        nodegroup, node, lease = self.create_nodegroup_with_lease()
 
123
        add_zone(nodegroup)
 
124
        self.assertDNSMatches(node.hostname, nodegroup.name, lease.ip)
 
125
 
 
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)
 
134
 
 
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)