Ejemplo n.º 1
0
    def test_contains_routes_between_nodes_on_same_vlan(self):
        vlan = factory.make_VLAN()
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(version=network1.version)
        node1, if1, sn1, sip1 = self.make_node_with_address(network1,
                                                            vlan=vlan)
        node2, if2, sn2, sip2 = self.make_node_with_address(network2,
                                                            vlan=vlan)

        # Routes between all addresses are found, even back to themselves.
        left = node1.id, if1.id, sn1.id, sn1.vlan.id, sip1.ip
        right = node2.id, if2.id, sn2.id, sn2.vlan.id, sip2.ip

        def row(ent1, ent2, metric):
            return (*ent1, *ent2, None, metric)

        expected = [
            row(left, left, 0),
            row(left, right, 2),  # Same VLAN, hence metric of 2.
            row(right, right, 0),
            row(right, left, 2),  # Same VLAN, hence metric of 2.
        ]

        with connection.cursor() as cursor:
            cursor.execute("SELECT * from maasserver_routable_pairs")
            self.assertItemsEqual(expected, cursor.fetchall())
Ejemplo n.º 2
0
    def test__does_not_contain_routes_between_nodes_on_differing_spaces(self):
        space1 = factory.make_Space()
        space2 = factory.make_Space()
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(version=network1.version)
        node1, ip1 = self.make_node_with_address(space1, network1)
        node2, ip2 = self.make_node_with_address(space2, network2)

        expected = []

        # No routable addresses are found.
        self.assertItemsEqual(expected,
                              find_addresses_between_nodes([node1], [node2]))
Ejemplo n.º 3
0
    def test__does_not_contain_routes_between_addrs_of_diff_network_fams(self):
        space = factory.make_Space()  # One space.
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(
            version=(4 if network1.version == 6 else 6))
        node1, ip1 = self.make_node_with_address(space, network1)
        node2, ip2 = self.make_node_with_address(space, network2)

        expected = []

        # No routable addresses are found.
        self.assertItemsEqual(expected,
                              find_addresses_between_nodes([node1], [node2]))
Ejemplo n.º 4
0
    def test__yields_routes_between_nodes_on_same_space(self):
        space = factory.make_Space()
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(version=network1.version)
        node1, ip1 = self.make_node_with_address(space, network1)
        node2, ip2 = self.make_node_with_address(space, network2)

        left = node1, ip1
        right = node2, ip2
        expected = [left + right]

        # A route from node1 to node2 is found.
        self.assertItemsEqual(expected,
                              find_addresses_between_nodes([node1], [node2]))
Ejemplo n.º 5
0
 def test__creates_subnet(self):
     subnet_name = factory.make_name("subnet")
     subnet_description = factory.make_name("description")
     vlan = factory.make_VLAN()
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     gateway_ip = factory.pick_ip_in_network(network)
     dns_servers = []
     for _ in range(2):
         dns_servers.append(
             factory.pick_ip_in_network(network,
                                        but_not=[gateway_ip] + dns_servers))
     form = SubnetForm({
         "name": subnet_name,
         "description": subnet_description,
         "vlan": vlan.id,
         "cidr": cidr,
         "gateway_ip": gateway_ip,
         "dns_servers": ",".join(dns_servers),
     })
     self.assertTrue(form.is_valid(), dict(form.errors))
     subnet = form.save()
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(
             name=subnet_name,
             description=subnet_description,
             vlan=vlan,
             cidr=cidr,
             gateway_ip=gateway_ip,
             dns_servers=dns_servers,
         ),
     )
Ejemplo n.º 6
0
 def test__updates_subnet(self):
     new_name = factory.make_name("subnet")
     new_description = factory.make_name("description")
     subnet = factory.make_Subnet()
     new_vlan = factory.make_VLAN()
     new_network = factory.make_ip4_or_6_network()
     new_cidr = str(new_network.cidr)
     new_gateway_ip = factory.pick_ip_in_network(new_network)
     new_dns_servers = []
     for _ in range(2):
         new_dns_servers.append(
             factory.pick_ip_in_network(new_network,
                                        but_not=[new_gateway_ip] +
                                        new_dns_servers))
     form = SubnetForm(instance=subnet,
                       data={
                           "name": new_name,
                           "description": new_description,
                           "vlan": new_vlan.id,
                           "cidr": new_cidr,
                           "gateway_ip": new_gateway_ip,
                           "dns_servers": ','.join(new_dns_servers),
                       })
     self.assertTrue(form.is_valid(), dict(form.errors))
     form.save()
     subnet = reload_object(subnet)
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(name=new_name,
                                     description=new_description,
                                     vlan=new_vlan,
                                     cidr=new_cidr,
                                     gateway_ip=new_gateway_ip,
                                     dns_servers=new_dns_servers))
Ejemplo n.º 7
0
 def test_create_defaults_to_managed(self):
     self.become_admin()
     subnet_name = factory.make_name("subnet")
     vlan = factory.make_VLAN()
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     rdns_mode = factory.pick_choice(RDNS_MODE_CHOICES)
     gateway_ip = factory.pick_ip_in_network(network)
     dns_servers = []
     for _ in range(2):
         dns_servers.append(
             factory.pick_ip_in_network(
                 network, but_not=[gateway_ip] + dns_servers))
     uri = get_subnets_uri()
     response = self.client.post(uri, {
         "name": subnet_name,
         "vlan": vlan.id,
         "cidr": cidr,
         "gateway_ip": gateway_ip,
         "dns_servers": ','.join(dns_servers),
         "rdns_mode": rdns_mode,
     })
     self.assertEqual(
         http.client.OK, response.status_code, response.content)
     created_subnet = json.loads(
         response.content.decode(settings.DEFAULT_CHARSET))
     self.assertEqual(subnet_name, created_subnet['name'])
     self.assertEqual(vlan.vid, created_subnet['vlan']['vid'])
     self.assertEqual(cidr, created_subnet['cidr'])
     self.assertEqual(gateway_ip, created_subnet['gateway_ip'])
     self.assertEqual(dns_servers, created_subnet['dns_servers'])
     self.assertEqual(rdns_mode, created_subnet['rdns_mode'])
     self.assertEqual(True, created_subnet['managed'])
Ejemplo n.º 8
0
    def test_create(self):
        self.become_admin()
        subnet_name = factory.make_name("subnet")
        vlan = factory.make_VLAN()
        network = factory.make_ip4_or_6_network()
        cidr = str(network.cidr)
        rdns_mode = factory.pick_choice(RDNS_MODE_CHOICES)
        allow_proxy = factory.pick_bool()
        allow_dns = factory.pick_bool()
        gateway_ip = factory.pick_ip_in_network(network)
        managed = factory.pick_bool()
        description = factory.make_string()
        dns_servers = []
        for _ in range(2):
            dns_servers.append(
                factory.pick_ip_in_network(network,
                                           but_not=[gateway_ip] + dns_servers))
        disabled_arches = random.sample(
            [
                boot_method.name for _, boot_method in BootMethodRegistry
                if boot_method.arch_octet or boot_method.path_prefix_http
            ],
            3,
        )

        uri = get_subnets_uri()
        response = self.client.post(
            uri,
            {
                "name": subnet_name,
                "vlan": vlan.id,
                "cidr": cidr,
                "gateway_ip": gateway_ip,
                "dns_servers": ",".join(dns_servers),
                "rdns_mode": rdns_mode,
                "allow_proxy": allow_proxy,
                "allow_dns": allow_dns,
                "managed": managed,
                "description": description,
                "disabled_boot_architectures": ",".join(disabled_arches),
            },
        )
        self.assertEqual(http.client.OK, response.status_code,
                         response.content)
        created_subnet = json.loads(
            response.content.decode(settings.DEFAULT_CHARSET))
        self.assertEqual(subnet_name, created_subnet["name"])
        self.assertEqual(vlan.vid, created_subnet["vlan"]["vid"])
        self.assertEqual(cidr, created_subnet["cidr"])
        self.assertEqual(gateway_ip, created_subnet["gateway_ip"])
        self.assertEqual(dns_servers, created_subnet["dns_servers"])
        self.assertEqual(rdns_mode, created_subnet["rdns_mode"])
        self.assertEqual(allow_proxy, created_subnet["allow_proxy"])
        self.assertEqual(allow_dns, created_subnet["allow_dns"])
        self.assertEqual(managed, created_subnet["managed"])
        self.assertEqual(description, created_subnet["description"])
        self.assertEqual(
            sorted(disabled_arches),
            sorted(created_subnet["disabled_boot_architectures"]),
        )
Ejemplo n.º 9
0
 def test_make_StaticIPAddress_uses_vlan_for_subnet_with_cidr(self):
     iface = factory.make_Interface()  # Specifies a VLAN.
     network = factory.make_ip4_or_6_network()
     sip = factory.make_StaticIPAddress(interface=iface, cidr=network)
     self.assertThat(sip.subnet.vlan, Equals(iface.vlan))
     self.assertThat({iface.vlan
                      for iface in sip.interface_set.all()},
                     Contains(iface.vlan))
Ejemplo n.º 10
0
    def test_does_not_contain_routes_between_addrs_of_diff_network_fams(self):
        space = factory.make_Space()  # One space.
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(
            version=(4 if network1.version == 6 else 6))
        node1, if1, sn1, sip1 = self.make_node_with_address(network1, space)
        node2, if2, sn2, sip2 = self.make_node_with_address(network2, space)

        # Only routes from left to left and right to right are found: right is
        # not routable from left, and left is not routable from right because
        # the address families differ.
        left = node1.id, if1.id, sn1.id, sn1.vlan.id, sip1.ip
        right = node2.id, if2.id, sn2.id, sn2.vlan.id, sip2.ip
        expected = [(*left, *left, space.id, 0), (*right, *right, space.id, 0)]

        with connection.cursor() as cursor:
            cursor.execute("SELECT * from maasserver_routable_pairs")
            self.assertItemsEqual(expected, cursor.fetchall())
Ejemplo n.º 11
0
 def test__error_for_vlan_not_in_fabric(self):
     fabric = factory.make_Fabric()
     vlan = factory.make_VLAN(fabric=Fabric.objects.get_default_fabric())
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"cidr": cidr, "fabric": fabric.id, "vlan": vlan.id})
     self.assertFalse(form.is_valid(), dict(form.errors))
     self.assertEqual(
         {"vlan": ["VLAN %s is not in fabric %s." % (vlan, fabric)]},
         dict(form.errors),
     )
Ejemplo n.º 12
0
 def test__creates_subnet_in_default_fabric_with_vid(self):
     vlan = factory.make_VLAN(fabric=Fabric.objects.get_default_fabric())
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"cidr": cidr, "vid": vlan.vid, "vlan": None})
     self.assertTrue(form.is_valid(), dict(form.errors))
     subnet = form.save()
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(name=cidr, cidr=cidr, vlan=vlan),
     )
Ejemplo n.º 13
0
 def test__error_for_unknown_vid_in_default_fabric(self):
     fabric = factory.make_Fabric()
     vlan = factory.make_VLAN(fabric=fabric)
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"cidr": cidr, "vid": vlan.vid})
     self.assertFalse(form.is_valid(), dict(form.errors))
     self.assertEqual(
         {"vid": ["No VLAN with vid %s in default fabric." % vlan.vid]},
         dict(form.errors),
     )
Ejemplo n.º 14
0
    def test__contains_routes_between_nodes_via_null_space(self):
        network1 = factory.make_ip4_or_6_network()
        network2 = factory.make_ip4_or_6_network(version=network1.version)
        node1, if1, sn1, sip1 = self.make_node_with_address(network1)
        node2, if2, sn2, sip2 = self.make_node_with_address(network2)

        # Routes between all addresses are found, even back to themselves.
        left = node1.id, if1.id, sn1.id, sn1.vlan.id, sip1.ip
        right = node2.id, if2.id, sn2.id, sn2.vlan.id, sip2.ip
        row = lambda ent1, ent2, metric: (*ent1, *ent2, None, metric)
        expected = [
            row(left, left, 0),
            row(left, right, 4),  # The NULL space, hence metric of 4.
            row(right, right, 0),
            row(right, left, 4),  # The NULL space, hence metric of 4.
        ]

        with connection.cursor() as cursor:
            cursor.execute("SELECT * from maasserver_routable_pairs")
            self.assertItemsEqual(expected, cursor.fetchall())
Ejemplo n.º 15
0
 def test__creates_subnet_name_equal_to_cidr(self):
     vlan = factory.make_VLAN()
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"vlan": vlan.id, "cidr": cidr})
     self.assertTrue(form.is_valid(), dict(form.errors))
     subnet = form.save()
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(name=cidr, vlan=vlan, cidr=cidr),
     )
Ejemplo n.º 16
0
 def test__creates_subnet_in_default_vlan_in_fabric(self):
     fabric = factory.make_Fabric()
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"cidr": cidr, "fabric": fabric.id, "vlan": None})
     self.assertTrue(form.is_valid(), dict(form.errors))
     subnet = form.save()
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(name=cidr,
                                     cidr=cidr,
                                     vlan=fabric.get_default_vlan()),
     )
Ejemplo n.º 17
0
    def test__yields_routes_between_multiple_nodes_on_same_space(self):
        space = factory.make_Space()

        lefts, rights = [], []
        for index in range(3):
            network1 = factory.make_ip4_or_6_network()
            network2 = factory.make_ip4_or_6_network(version=network1.version)
            lefts.append(self.make_node_with_address(space, network1))
            rights.append(self.make_node_with_address(space, network2))

        expected = [
            (n1, ip1, n2, ip2)
            for (n1, ip1), (n2, ip2) in product(lefts, rights)
            # Addresses are only routable when they're the same IP version.
            if ip1.version == ip2.version
        ]

        # A route from each node on the left is found to each on the right.
        self.assertItemsEqual(
            expected,
            find_addresses_between_nodes((node for node, _ in lefts),
                                         (node for node, _ in rights)))
Ejemplo n.º 18
0
 def test__creates_subnet_in_default_fabric_and_vlan(self):
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({"cidr": cidr})
     self.assertTrue(form.is_valid(), dict(form.errors))
     subnet = form.save()
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(
             name=cidr,
             cidr=cidr,
             vlan=Fabric.objects.get_default_fabric().get_default_vlan(),
         ),
     )
Ejemplo n.º 19
0
 def test_create(self):
     self.become_admin()
     subnet_name = factory.make_name("subnet")
     vlan = factory.make_VLAN()
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     rdns_mode = factory.pick_choice(RDNS_MODE_CHOICES)
     allow_proxy = factory.pick_bool()
     allow_dns = factory.pick_bool()
     gateway_ip = factory.pick_ip_in_network(network)
     managed = factory.pick_bool()
     dns_servers = []
     for _ in range(2):
         dns_servers.append(
             factory.pick_ip_in_network(
                 network, but_not=[gateway_ip] + dns_servers
             )
         )
     uri = get_subnets_uri()
     response = self.client.post(
         uri,
         {
             "name": subnet_name,
             "vlan": vlan.id,
             "cidr": cidr,
             "gateway_ip": gateway_ip,
             "dns_servers": ",".join(dns_servers),
             "rdns_mode": rdns_mode,
             "allow_proxy": allow_proxy,
             "allow_dns": allow_dns,
             "managed": managed,
         },
     )
     self.assertEqual(
         http.client.OK, response.status_code, response.content
     )
     created_subnet = json.loads(
         response.content.decode(settings.DEFAULT_CHARSET)
     )
     self.assertEqual(subnet_name, created_subnet["name"])
     self.assertEqual(vlan.vid, created_subnet["vlan"]["vid"])
     self.assertEqual(cidr, created_subnet["cidr"])
     self.assertEqual(gateway_ip, created_subnet["gateway_ip"])
     self.assertEqual(dns_servers, created_subnet["dns_servers"])
     self.assertEqual(rdns_mode, created_subnet["rdns_mode"])
     self.assertEqual(allow_proxy, created_subnet["allow_proxy"])
     self.assertEqual(allow_dns, created_subnet["allow_dns"])
     self.assertEqual(managed, created_subnet["managed"])
Ejemplo n.º 20
0
 def test__error_for_unknown_vid_in_fabric(self):
     fabric = factory.make_Fabric()
     vlan = factory.make_VLAN(fabric=Fabric.objects.get_default_fabric())
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({
         "cidr": cidr,
         "fabric": fabric.id,
         "vid": vlan.vid,
     })
     self.assertFalse(form.is_valid(), dict(form.errors))
     self.assertEqual(
         {
             "vid":
             ["No VLAN with vid %s in fabric %s." % (vlan.vid, fabric)]
         }, dict(form.errors))
Ejemplo n.º 21
0
 def test__creates_subnet_in_fabric_with_vid(self):
     fabric = factory.make_Fabric()
     vlan = factory.make_VLAN(fabric=fabric)
     network = factory.make_ip4_or_6_network()
     cidr = str(network.cidr)
     form = SubnetForm({
         "cidr": cidr,
         "fabric": fabric.id,
         "vid": vlan.vid,
         "vlan": None,
     })
     self.assertTrue(form.is_valid(), form.errors)
     subnet = form.save()
     self.assertThat(
         subnet, MatchesStructure.byEquality(name=cidr,
                                             cidr=cidr,
                                             vlan=vlan))
Ejemplo n.º 22
0
 def test__updates_subnet_name_to_cidr(self):
     subnet = factory.make_Subnet()
     subnet.name = subnet.cidr
     subnet.save()
     new_network = factory.make_ip4_or_6_network()
     new_cidr = str(new_network.cidr)
     new_gateway_ip = factory.pick_ip_in_network(new_network)
     form = SubnetForm(instance=subnet,
                       data={
                           "cidr": new_cidr,
                           "gateway_ip": new_gateway_ip,
                       })
     self.assertTrue(form.is_valid(), dict(form.errors))
     form.save()
     subnet = reload_object(subnet)
     self.assertThat(
         subnet,
         MatchesStructure.byEquality(name=new_cidr,
                                     cidr=new_cidr,
                                     gateway_ip=new_gateway_ip))