~allenap/maas/ipmi-power-confusion--bug-1560830

« back to all changes in this revision

Viewing changes to src/maasserver/models/tests/test_domain.py

  • Committer: MAAS Lander
  • Author(s): LaMont Jones
  • Date: 2016-04-25 18:06:57 UTC
  • mfrom: (4933.2.9 bug-1571621)
  • Revision ID: maas_lander-20160425180657-flyd1jupqx7ec9zk
[r=mpontillo][bug=1562919,1571621,1573690][author=lamont] Handle delegations for subdomains.  Fix the handling of fqdn in the dns apis when it refers to the top of a domain.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
)
15
15
from django.db.models import ProtectedError
16
16
from django.db.utils import IntegrityError
 
17
from maasserver.dns.zonegenerator import (
 
18
    get_hostname_dnsdata_mapping,
 
19
    lazydict,
 
20
)
17
21
from maasserver.enum import NODE_PERMISSION
18
22
from maasserver.models.config import Config
19
 
from maasserver.models.dnsdata import DNSData
 
23
from maasserver.models.dnsdata import (
 
24
    DNSData,
 
25
    HostnameRRsetMapping,
 
26
)
 
27
from maasserver.models.dnsresource import DNSResource
20
28
from maasserver.models.domain import (
21
29
    DEFAULT_DOMAIN_NAME,
22
30
    Domain,
195
203
        with ExpectedException(ProtectedError):
196
204
            domain.delete()
197
205
 
 
206
    def test_add_delegations_may_do_nothing(self):
 
207
        domain = factory.make_Domain()
 
208
        mapping = {}
 
209
        domain.add_delegations(mapping, '::1', 30)
 
210
 
 
211
    def test_add_delegations_adds_delegation(self):
 
212
        parent = factory.make_Domain()
 
213
        name = factory.make_name()
 
214
        factory.make_Domain(name="%s.%s" % (name, parent.name))
 
215
        mappings = lazydict(get_hostname_dnsdata_mapping)
 
216
        mapping = mappings[parent]
 
217
        parent.add_delegations(mapping, "::1", 30)
 
218
        expected_map = HostnameRRsetMapping(
 
219
            rrset={(30, 'AAAA', '::1'), (30, 'NS', name)})
 
220
        self.assertEqual(expected_map, mapping[name])
 
221
 
 
222
    def test_add_delegations_adds_nsrrset_and_glue(self):
 
223
        parent = factory.make_Domain()
 
224
        name = factory.make_name()
 
225
        child = factory.make_Domain(name="%s.%s" % (name, parent.name))
 
226
        dnsrr = factory.make_DNSResource(name='@', domain=child)
 
227
        nsname = factory.make_name()
 
228
        factory.make_DNSData(
 
229
            dnsresource=dnsrr, rrtype='NS',
 
230
            rrdata="%s.%s." % (nsname, child.name))
 
231
        nsrr = factory.make_DNSResource(name=nsname, domain=child)
 
232
        other_name = factory.make_name()
 
233
        factory.make_DNSResource(name=other_name, domain=parent)
 
234
        factory.make_DNSData(
 
235
            dnsresource=dnsrr, rrtype='NS',
 
236
            rrdata="%s.%s." % (other_name, parent.name))
 
237
        mappings = lazydict(get_hostname_dnsdata_mapping)
 
238
        mapping = mappings[parent]
 
239
        parent.add_delegations(mapping, "::1", 30)
 
240
        expected_map = {
 
241
            name: HostnameRRsetMapping(
 
242
                rrset={
 
243
                    (30, 'AAAA', '::1'),
 
244
                    (30, 'NS', name),
 
245
                    (30, 'NS', "%s.%s." % (nsname, child.name)),
 
246
                    (30, 'NS', "%s.%s." % (other_name, parent.name)),
 
247
                }
 
248
            ),
 
249
        }
 
250
        for sip in nsrr.ip_addresses.all():
 
251
            if IPAddress(sip.ip).version == 6:
 
252
                expected_map[nsname] = HostnameRRsetMapping(
 
253
                    rrset={(30, 'AAAA', sip.ip)})
 
254
            else:
 
255
                expected_map[nsname] = HostnameRRsetMapping(
 
256
                    rrset={(30, 'A', sip.ip)})
 
257
        self.assertEqual(expected_map, mapping)
 
258
 
 
259
    def test_add_delegations_adds_nsrrset_and_glue_in_depth(self):
 
260
        parent = factory.make_Domain()
 
261
        name = factory.make_name()
 
262
        child = factory.make_Domain(name="%s.%s" % (name, parent.name))
 
263
        g_name = factory.make_name()
 
264
        grandchild = factory.make_Domain(name="%s.%s" % (g_name, child.name))
 
265
        dnsrr = factory.make_DNSResource(name='@', domain=child)
 
266
        nsname = factory.make_name()
 
267
        factory.make_DNSData(
 
268
            dnsresource=dnsrr, rrtype='NS',
 
269
            rrdata="%s.%s." % (nsname, grandchild.name))
 
270
        nsrr = factory.make_DNSResource(name=nsname, domain=grandchild)
 
271
        other_name = factory.make_name()
 
272
        factory.make_DNSResource(name=other_name, domain=parent)
 
273
        factory.make_DNSData(
 
274
            dnsresource=dnsrr, rrtype='NS',
 
275
            rrdata="%s.%s." % (other_name, parent.name))
 
276
        mappings = lazydict(get_hostname_dnsdata_mapping)
 
277
        mapping = mappings[parent]
 
278
        expected_map = {
 
279
            name: HostnameRRsetMapping(
 
280
                rrset={
 
281
                    (30, 'AAAA', '::1'),
 
282
                    (30, 'NS', name),
 
283
                    (30, 'NS', "%s.%s." % (nsname, grandchild.name)),
 
284
                    (30, 'NS', "%s.%s." % (other_name, parent.name)),
 
285
                }
 
286
            ),
 
287
        }
 
288
        ns_part = "%s.%s" % (nsname, g_name)
 
289
        for sip in nsrr.ip_addresses.all():
 
290
            if IPAddress(sip.ip).version == 6:
 
291
                expected_map[ns_part] = HostnameRRsetMapping(
 
292
                    rrset={(30, 'AAAA', sip.ip)})
 
293
            else:
 
294
                expected_map[ns_part] = HostnameRRsetMapping(
 
295
                    rrset={(30, 'A', sip.ip)})
 
296
        parent.add_delegations(mapping, "::1", 30)
 
297
        self.assertEqual(expected_map, mapping)
 
298
 
 
299
    def test_add_delegations_allows_dots(self):
 
300
        parent = factory.make_Domain()
 
301
        name = "%s.%s" % (factory.make_name(), factory.make_name())
 
302
        factory.make_Domain(name="%s.%s" % (name, parent.name))
 
303
        mappings = lazydict(get_hostname_dnsdata_mapping)
 
304
        mapping = mappings[parent]
 
305
        parent.add_delegations(mapping, "::1", 30)
 
306
        expected_map = HostnameRRsetMapping(
 
307
            rrset={(30, 'AAAA', '::1'), (30, 'NS', name)})
 
308
        self.assertEqual(expected_map, mapping[name])
 
309
 
 
310
    def test_add_delegations_stops_at_one_deep(self):
 
311
        parent = factory.make_Domain()
 
312
        name = factory.make_name()
 
313
        child = factory.make_Domain(name="%s.%s" % (name, parent.name))
 
314
        factory.make_Domain(name="%s.%s" % (factory.make_name(), child.name))
 
315
        mappings = lazydict(get_hostname_dnsdata_mapping)
 
316
        mapping = mappings[parent]
 
317
        parent.add_delegations(mapping, "::1", 30)
 
318
        expected_map = HostnameRRsetMapping(
 
319
            rrset={(30, 'AAAA', '::1'), (30, 'NS', name)})
 
320
        self.assertEqual(expected_map, mapping[name])
 
321
 
 
322
    def test_save_migrates_dnsresource(self):
 
323
        p_name = "%s.%s" % (factory.make_name(), factory.make_name())
 
324
        c_name = factory.make_name()
 
325
        parent = factory.make_Domain(name=p_name)
 
326
        dnsrr = factory.make_DNSResource(name=c_name, domain=parent)
 
327
        child = factory.make_Domain(name="%s.%s" % (c_name, p_name))
 
328
        dnsrr_from_db = DNSResource.objects.get(id=dnsrr.id)
 
329
        self.assertEqual('@', dnsrr_from_db.name)
 
330
        self.assertEqual(child, dnsrr_from_db.domain)
 
331
        self.assertItemsEqual(
 
332
            [], DNSResource.objects.filter(name=c_name, domain=parent))
 
333
 
198
334
    def test_update_kms_srv_deletes_srv_records(self):
199
335
        domain = factory.make_Domain()
200
336
        target = "%s.%s" % (factory.make_name(), factory.make_name())