示例#1
0
 def test_get_hostname_dnsdata_mapping_returns_mapping(self):
     domain = Domain.objects.get_default_domain()
     expected_mapping = {}
     # Create 3 labels with 0-5 resources each, verify that they
     # Come back correctly.
     for _ in range(3):
         name = factory.make_name('label')
         dnsrr = factory.make_DNSResource(
             name=name, domain=domain, no_ip_addresses=True)
         for count in range(random.randint(1, 5)):
             factory.make_DNSData(dnsresource=dnsrr, ip_addresses=True)
         expected_mapping.update(self.make_mapping(dnsrr))
     # Add one resource to the domain which has no data, so it should not be
     # in the returned mapping.
     factory.make_DNSResource(domain=domain, no_ip_addresses=True)
     actual = DNSData.objects.get_hostname_dnsdata_mapping(domain)
     self.assertEqual(expected_mapping, actual)
示例#2
0
 def test_read(self):
     dnsrr = factory.make_DNSResource()
     for _ in range(3):
         factory.make_DNSResource()
     uri = get_dnsresource_uri(dnsrr)
     response = self.client.get(uri)
     self.assertEqual(http.client.OK, response.status_code,
                      response.content)
     parsed_dnsresource = json.loads(
         response.content.decode(settings.DEFAULT_CHARSET))
     self.assertThat(
         parsed_dnsresource,
         ContainsDict({
             "id": Equals(dnsrr.id),
             "fqdn": Equals(dnsrr.fqdn)
         }),
     )
示例#3
0
 def test_read_with_domain(self):
     for _ in range(3):
         factory.make_DNSResource()
     dnsrr = DNSResource.objects.first()
     uri = get_dnsresources_uri()
     response = self.client.get(
         uri,
         {'domain': [dnsrr.domain.name]})
     self.assertEqual(
         http.client.OK, response.status_code, response.content)
     expected_ids = [dnsrr.id]
     result_ids = [
         dnsresource["id"]
         for dnsresource in json.loads(
             response.content.decode(settings.DEFAULT_CHARSET))
         ]
     self.assertItemsEqual(expected_ids, result_ids)
示例#4
0
 def test_user_view_returns_dnsresource(self):
     user = factory.make_User()
     dnsresource = factory.make_DNSResource()
     self.assertEqual(
         dnsresource,
         DNSResource.objects.get_dnsresource_or_404(dnsresource.id, user,
                                                    NodePermission.view),
     )
示例#5
0
 def test_admin_admin_returns_dnsresource(self):
     admin = factory.make_admin()
     dnsresource = factory.make_DNSResource()
     self.assertEqual(
         dnsresource,
         DNSResource.objects.get_dnsresource_or_404(dnsresource.id, admin,
                                                    NodePermission.admin),
     )
示例#6
0
 def test_delete_deletes_dnsresource(self):
     self.become_admin()
     dnsresource = factory.make_DNSResource()
     uri = get_dnsresource_uri(dnsresource)
     response = self.client.delete(uri)
     self.assertEqual(http.client.NO_CONTENT, response.status_code,
                      response.content)
     self.assertIsNone(reload_object(dnsresource))
示例#7
0
 def test_add_delegations_adds_nsrrset_and_glue_in_depth(self):
     parent = factory.make_Domain()
     name = factory.make_name()
     child = factory.make_Domain(name="%s.%s" % (name, parent.name))
     default_name = Domain.objects.get_default_domain().name
     g_name = factory.make_name()
     grandchild = factory.make_Domain(name="%s.%s" % (g_name, child.name))
     dnsrr = factory.make_DNSResource(name="@", domain=child)
     nsname = factory.make_name()
     factory.make_DNSData(
         dnsresource=dnsrr,
         rrtype="NS",
         rrdata="%s.%s." % (nsname, grandchild.name),
     )
     nsrr = factory.make_DNSResource(name=nsname, domain=grandchild)
     other_name = factory.make_name()
     factory.make_DNSResource(name=other_name, domain=parent)
     factory.make_DNSData(
         dnsresource=dnsrr,
         rrtype="NS",
         rrdata="%s.%s." % (other_name, parent.name),
     )
     mappings = lazydict(get_hostname_dnsdata_mapping)
     mapping = mappings[parent]
     expected_map = {
         name: HostnameRRsetMapping(
             rrset={
                 (30, "NS", default_name),
                 (30, "NS", "%s.%s." % (nsname, grandchild.name)),
                 (30, "NS", "%s.%s." % (other_name, parent.name)),
             }
         )
     }
     ns_part = "%s.%s" % (nsname, g_name)
     for sip in nsrr.ip_addresses.all():
         if IPAddress(sip.ip).version == 6:
             expected_map[ns_part] = HostnameRRsetMapping(
                 rrset={(30, "AAAA", sip.ip)}
             )
         else:
             expected_map[ns_part] = HostnameRRsetMapping(
                 rrset={(30, "A", sip.ip)}
             )
     parent.add_delegations(mapping, default_name, [IPAddress("::1")], 30)
     self.assertEqual(expected_map, mapping)
示例#8
0
 def test_rejects_bad_sshfp_record(self):
     dnsresource = factory.make_DNSResource(no_ip_addresses=True)
     dnsdata = DNSData(dnsresource=dnsresource,
                       rrtype='SSHFP',
                       rrdata="wrong data")
     with ExpectedException(
             ValidationError,
             re.escape("{'__all__': [\"%s\"]}" % INVALID_SSHFP_MSG)):
         dnsdata.save()
示例#9
0
 def test__delete_dnsdata(self):
     user = factory.make_admin()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     dnsresource = factory.make_DNSResource(domain=domain)
     dnsdata = factory.make_DNSData(dnsresource)
     handler.delete_dnsdata({"domain": domain.id, "dnsdata_id": dnsdata.id})
     dnsdata = reload_object(dnsdata)
     self.assertThat(dnsdata, Is(None))
示例#10
0
    def test_read(self):
        for _ in range(3):
            factory.make_DNSResource()
        uri = get_dnsresources_uri()
        response = self.client.get(uri)

        self.assertEqual(
            http.client.OK, response.status_code, response.content)
        expected_ids = [
            dnsresource.id
            for dnsresource in DNSResource.objects.all()
            ]
        result_ids = [
            dnsresource["id"]
            for dnsresource in json.loads(
                response.content.decode(settings.DEFAULT_CHARSET))
            ]
        self.assertItemsEqual(expected_ids, result_ids)
示例#11
0
 def test__delete_resource(self):
     user = factory.make_admin()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     resource = factory.make_DNSResource(domain=domain)
     handler.delete_dnsresource(
         {"domain": domain.id, "dnsresource_id": resource.id}
     )
     self.assertThat(reload_object(resource), Is(None))
示例#12
0
 def test__delete_resource_as_non_admin_fails(self):
     user = factory.make_User()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     resource = factory.make_DNSResource(domain=domain)
     with ExpectedException(HandlerPermissionError):
         handler.delete_address_record(
             {"domain": domain.id, "dnsresource": resource.id}
         )
示例#13
0
 def test_update_admin_only(self):
     dnsresource = factory.make_DNSResource()
     new_name = factory.make_name("dnsresource")
     uri = get_dnsresource_uri(dnsresource)
     response = self.client.put(uri, {
         "name": new_name,
     })
     self.assertEqual(http.client.FORBIDDEN, response.status_code,
                      response.content)
 def test_create_resource_exists(self):
     self.become_admin()
     dnsresource_name = factory.make_name("dnsresource")
     domain = factory.make_Domain()
     # create a resource with the same details
     factory.make_DNSResource(domain=domain, name=dnsresource_name)
     uri = get_dnsresourcerecords_uri()
     response = self.client.post(
         uri,
         {
             "name": dnsresource_name,
             "domain": domain.name,
             "rrtype": "TXT",
             "rrdata": "Sample Text.",
         },
     )
     payload = json.loads(response.content.decode(settings.DEFAULT_CHARSET))
     self.assertEqual(payload["fqdn"], f"{dnsresource_name}.{domain.name}")
示例#15
0
 def test_get_hostname_dnsdata_mapping_includes_node_owner_id(self):
     domain = Domain.objects.get_default_domain()
     user = factory.make_User()
     node_name = factory.make_name("node")
     factory.make_Node_with_Interface_on_Subnet(
         hostname=node_name, domain=domain, owner=user)
     dnsrr = factory.make_DNSResource(domain=domain, name=node_name)
     factory.make_DNSData(dnsresource=dnsrr, ip_addresses=True)
     mapping = DNSData.objects.get_hostname_dnsdata_mapping(domain)
     self.assertEqual(mapping[node_name].user_id, user.id)
示例#16
0
    def test_read_all(self):
        self.become_admin()
        for _ in range(3):
            factory.make_DNSResource()
        factory.make_RegionRackController()
        uri = get_dnsresources_uri()
        response = self.client.get(uri, {"all": "true"})

        self.assertEqual(http.client.OK, response.status_code,
                         response.content)
        expected_ids = [
            dnsresource.id
            for dnsresource in get_dnsresource_queryset(all_records=True)
        ]
        result_ids = [
            dnsresource["id"] for dnsresource in json.loads(
                response.content.decode(settings.DEFAULT_CHARSET))
        ]
        self.assertItemsEqual(expected_ids, result_ids)
示例#17
0
 def test__delete_resource_as_non_admin_fails(self):
     user = factory.make_User()
     handler = DomainHandler(user, {})
     domain = factory.make_Domain()
     resource = factory.make_DNSResource(domain=domain)
     with ExpectedException(HandlerPermissionError):
         handler.delete_dnsresource({
             'domain': domain.id,
             'dnsresource': resource.id,
         })
示例#18
0
 def test__user_admin_raises_PermissionError(self):
     user = factory.make_User()
     dnsresource = factory.make_DNSResource()
     self.assertRaises(
         PermissionDenied,
         DNSResource.objects.get_dnsresource_or_404,
         dnsresource.id,
         user,
         NodePermission.admin,
     )
示例#19
0
 def test_rejects_bad_cname_target(self):
     target = factory.make_name('na*e')
     dnsresource = factory.make_DNSResource(no_ip_addresses=True)
     dnsdata = DNSData(dnsresource=dnsresource,
                       rrtype='CNAME',
                       rrdata=target)
     with ExpectedException(
             ValidationError,
             re.escape("{'__all__': [\"%s\"]}" % INVALID_CNAME_MSG)):
         dnsdata.save()
示例#20
0
 def test_rejects_cname_with_address(self):
     name = factory.make_name('name')
     target = factory.make_name('target')
     domain = factory.make_Domain()
     dnsrr = factory.make_DNSResource(name=name, domain=domain)
     dnsrr.save()
     dnsdata = DNSData(dnsresource=dnsrr, rrtype='CNAME', rrdata=target)
     with ExpectedException(
             ValidationError,
             re.escape("{'__all__': ['%s']}" % CNAME_AND_OTHER_MSG)):
         dnsdata.save()
示例#21
0
 def test_save_migrates_dnsresource(self):
     p_name = "%s.%s" % (factory.make_name(), factory.make_name())
     c_name = factory.make_name()
     parent = factory.make_Domain(name=p_name)
     dnsrr = factory.make_DNSResource(name=c_name, domain=parent)
     child = factory.make_Domain(name="%s.%s" % (c_name, p_name))
     dnsrr_from_db = DNSResource.objects.get(id=dnsrr.id)
     self.assertEqual('@', dnsrr_from_db.name)
     self.assertEqual(child, dnsrr_from_db.domain)
     self.assertItemsEqual(
         [], DNSResource.objects.filter(name=c_name, domain=parent))
示例#22
0
 def test_get_normal_user_only_owned_entries(self):
     user = factory.make_User()
     other_user = factory.make_User()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     hostname1 = factory.make_name("node")
     factory.make_Node_with_Interface_on_Subnet(hostname=hostname1,
                                                domain=domain,
                                                owner=user)
     dnsrr1 = factory.make_DNSResource(domain=domain, name=hostname1)
     factory.make_DNSData(dnsresource=dnsrr1, ip_addresses=True)
     hostname2 = factory.make_name("node")
     factory.make_Node_with_Interface_on_Subnet(hostname=hostname2,
                                                domain=domain,
                                                owner=other_user)
     dnsrr2 = factory.make_DNSResource(domain=domain, name=hostname2)
     factory.make_DNSData(dnsresource=dnsrr2, ip_addresses=True)
     details = handler.get({"id": domain.id})
     for entry in details['rrsets']:
         self.assertEqual(entry['user_id'], user.id)
示例#23
0
 def test__delete_dnsdata_fails_for_non_admin(self):
     user = factory.make_User()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     dnsresource = factory.make_DNSResource(domain=domain)
     dnsdata = factory.make_DNSData(dnsresource)
     with ExpectedException(HandlerPermissionError):
         handler.delete_dnsdata(
             {"domain": domain.id, "dnsdata_id": dnsdata.id}
         )
     dnsdata = reload_object(dnsdata)
     self.assertThat(dnsdata, Not(Is(None)))
示例#24
0
 def test_render_json_for_related_rrdata_includes_user_id(self):
     domain = factory.make_Domain()
     node_name = factory.make_name('node')
     user = factory.make_User()
     factory.make_Node_with_Interface_on_Subnet(
         hostname=node_name, domain=domain, owner=user)
     dnsrr = factory.make_DNSResource(domain=domain, name=node_name)
     factory.make_DNSData(dnsresource=dnsrr, ip_addresses=True)
     expected = self.render_rrdata(domain, for_list=False)
     actual = domain.render_json_for_related_rrdata(for_list=True)
     self.assertEqual(actual, expected)
     for record in actual:
         self.assertEqual(record['user_id'], user.id)
示例#25
0
 def test__delete_address_deletes_single_address(self):
     user = factory.make_admin()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     name = factory.make_hostname()
     resource = factory.make_DNSResource(
         domain=domain, name=name, ip_addresses=["127.0.0.1", "127.0.0.2"])
     handler.delete_address_record({
         'domain': domain.id,
         'dnsresource_id': resource.id,
         'rrdata': "127.0.0.1"
     })
     self.assertThat(resource.get_addresses(), Equals(["127.0.0.2"]))
示例#26
0
 def test_dnsresource_address_overrides_domain(self):
     # DNSResource.address_ttl _does_, however, override Domain.ttl for
     # addresses that do not have nodes associated with them.
     global_ttl = random.randint(100, 199)
     Config.objects.set_config("default_dns_ttl", global_ttl)
     subnet = factory.make_Subnet(cidr="10.0.0.0/23")
     domain = factory.make_Domain(ttl=random.randint(200, 299))
     node = factory.make_Node_with_Interface_on_Subnet(
         status=NODE_STATUS.READY,
         subnet=subnet,
         domain=domain,
         address_ttl=random.randint(300, 399),
     )
     boot_iface = node.get_boot_interface()
     [boot_ip] = boot_iface.claim_auto_ips()
     dnsrr = factory.make_DNSResource(domain=domain,
                                      address_ttl=random.randint(400, 499))
     node_ips = {boot_ip.ip}
     dnsrr_ips = {
         ip.ip
         for ip in dnsrr.ip_addresses.all() if ip is not None
     }
     expected_forward = {
         node.hostname:
         HostnameIPMapping(node.system_id, node.address_ttl, node_ips,
                           node.node_type),
         dnsrr.name:
         HostnameIPMapping(None, dnsrr.address_ttl, dnsrr_ips, None,
                           dnsrr.id),
     }
     expected_reverse = {
         node.fqdn:
         HostnameIPMapping(
             node.system_id,
             node.address_ttl,
             node_ips,
             node.node_type,
             None,
         ),
         dnsrr.fqdn:
         HostnameIPMapping(None, dnsrr.address_ttl, dnsrr_ips, None,
                           dnsrr.id),
     }
     zones = ZoneGenerator(
         domain,
         subnet,
         default_ttl=global_ttl,
         serial=random.randint(0, 65535),
     ).as_list()
     self.assertEqual(expected_forward, zones[0]._mapping)
     self.assertEqual(expected_reverse, zones[1]._mapping)
示例#27
0
 def test_update(self):
     self.become_admin()
     dnsresource = factory.make_DNSResource()
     new_name = factory.make_name("dnsresource")
     uri = get_dnsresource_uri(dnsresource)
     response = self.client.put(uri, {"name": new_name})
     self.assertEqual(http.client.OK, response.status_code,
                      response.content)
     self.assertEqual(
         "%s.%s" % (new_name, dnsresource.domain.name),
         json.loads(response.content.decode(
             settings.DEFAULT_CHARSET))["fqdn"],
     )
     self.assertEqual(new_name, reload_object(dnsresource).name)
示例#28
0
 def test_dnsresources_are_in_the_dns(self):
     self.patch(settings, "DNS_CONNECT", True)
     domain = factory.make_Domain()
     subnet = factory.make_ipv4_Subnet_with_IPRanges()
     dynamic_range = subnet.get_dynamic_ranges()[0]
     ip = factory.pick_ip_in_IPRange(dynamic_range)
     ip_obj = factory.make_StaticIPAddress(
         alloc_type=IPADDRESS_TYPE.USER_RESERVED, ip=ip, subnet=subnet)
     rrname = factory.make_name("label")
     dnsrr = factory.make_DNSResource(name=rrname,
                                      domain=domain,
                                      ip_addresses=[ip_obj])
     dns_update_all_zones()
     self.assertDNSMatches(dnsrr.name, domain.name, ip_obj.ip)
示例#29
0
 def test_update_resource_validation_error(self):
     user = factory.make_admin()
     handler = DomainHandler(user, {}, None)
     domain = factory.make_Domain()
     resource = factory.make_DNSResource(domain=domain)
     self.assertRaises(
         ValidationError,
         handler.update_dnsresource,
         {
             "domain": domain.id,
             "dnsresource_id": resource.id,
             "address_ttl": "invalid",
         },
     )
示例#30
0
 def test__creates_dnsdata(self):
     name = factory.make_name("dnsdata")
     (rrtype, rrdata) = factory.pick_rrset()
     dnsrr = factory.make_DNSResource(no_ip_addresses=True)
     form = DNSDataForm({
         "name": name,
         "dnsresource": dnsrr.id,
         "rrtype": rrtype,
         "rrdata": rrdata,
     })
     self.assertTrue(form.is_valid(), form.errors)
     dnsdata = form.save()
     self.assertEqual(dnsrr.id, dnsdata.dnsresource.id)
     self.assertEqual(rrtype, dnsdata.rrtype)
     self.assertEqual(rrdata, dnsdata.rrdata)