예제 #1
0
    def test__returns_at_most_60kiB_of_JSON(self):
        # Configure the rack controller subnet to be very large so it
        # can hold that many BMC connected to the interface for the rack
        # controller.
        rack = factory.make_RackController(power_type='')
        rack_interface = rack.get_boot_interface()
        subnet = factory.make_Subnet(
            cidr=str(factory.make_ipv6_network(slash=8)))
        factory.make_StaticIPAddress(ip=factory.pick_ip_in_Subnet(subnet),
                                     subnet=subnet,
                                     interface=rack_interface)

        # Ensure that there are at least 64kiB of power parameters (when
        # converted to JSON) in the database.
        example_parameters = {"key%d" % i: "value%d" % i for i in range(250)}
        remaining = 2**16
        while remaining > 0:
            node = self.make_Node(bmc_connected_to=rack,
                                  power_parameters=example_parameters)
            remaining -= len(json.dumps(node.get_effective_power_parameters()))

        nodes = list_cluster_nodes_power_parameters(
            rack.system_id, limit=None)  # Remove numeric limit.

        # The total size of the JSON is less than 60kiB, but only a bit.
        nodes_json = map(json.dumps, nodes)
        nodes_json_lengths = map(len, nodes_json)
        nodes_json_length = sum(nodes_json_lengths)
        expected_maximum = 60 * (2**10)  # 60kiB
        self.expectThat(nodes_json_length, LessThan(expected_maximum + 1))
        expected_minimum = 50 * (2**10)  # 50kiB
        self.expectThat(nodes_json_length, GreaterThan(expected_minimum - 1))
예제 #2
0
    def test__returns_checked_nodes_in_last_checked_order(self):
        rack = factory.make_RackController(power_type='')
        nodes = [self.make_Node(bmc_connected_to=rack) for _ in range(5)]

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]

        # Checked nodes are always sorted from least recently checked to most.
        node_sort_key = attrgetter("power_state_queried", "system_id")
        nodes_in_order = sorted(nodes, key=node_sort_key)
        self.assertEqual([node.system_id for node in nodes_in_order],
                         system_ids)
예제 #3
0
    def test__excludes_broken_nodes(self):
        rack = factory.make_RackController(power_type='')
        node_queryable = self.make_Node(bmc_connected_to=rack)

        self.make_Node(status=NODE_STATUS.BROKEN, bmc_connected_to=rack)
        self.make_Node(status=NODE_STATUS.BROKEN,
                       power_state_queried=(now() - timedelta(minutes=10)),
                       bmc_connected_to=rack)

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]

        self.assertItemsEqual([node_queryable.system_id], system_ids)
예제 #4
0
    def test_excludes_no_power_type(self):
        rack = factory.make_RackController(power_type="")
        node_queryable = self.make_Node(bmc_connected_to=rack)

        factory.make_Device(power_type="")
        factory.make_Device(power_type="")
        factory.make_Device(power_type="",
                            power_state_queried=(now() -
                                                 timedelta(minutes=10)))

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]

        self.assertItemsEqual([node_queryable.system_id], system_ids)
예제 #5
0
    def test__returns_only_accessible_nodes(self):
        rack = factory.make_RackController(power_type='')
        # Accessible nodes.
        node_ids = [
            self.make_Node(bmc_connected_to=rack).system_id for _ in range(3)
        ]
        # Inaccessible nodes.
        for _ in range(3):
            node = self.make_Node(bmc_connected_to=rack)
            node.bmc = None
            node.save()

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]
        self.assertEquals(sorted(node_ids), sorted(system_ids))
예제 #6
0
    def test__limited_to_10_nodes_at_a_time_by_default(self):
        # Configure the rack controller subnet to be large enough.
        rack = factory.make_RackController(power_type='')
        rack_interface = rack.get_boot_interface()
        subnet = factory.make_Subnet(
            cidr=str(factory.make_ipv6_network(slash=8)))
        factory.make_StaticIPAddress(ip=factory.pick_ip_in_Subnet(subnet),
                                     subnet=subnet,
                                     interface=rack_interface)

        # Create at least 11 nodes connected to the rack.
        for _ in range(11):
            self.make_Node(bmc_connected_to=rack)

        # Only 10 nodes' power parameters are returned.
        self.assertThat(list_cluster_nodes_power_parameters(rack.system_id),
                        HasLength(10))
예제 #7
0
    def test__returns_unchecked_nodes_first(self):
        rack = factory.make_RackController(power_type='')
        datetime_10_minutes_ago = now() - timedelta(minutes=10)
        nodes = [
            self.make_Node(bmc_connected_to=rack,
                           power_state_queried=datetime_10_minutes_ago)
            for _ in range(5)
        ]
        node_unchecked = random.choice(nodes)
        node_unchecked.power_state_queried = None
        node_unchecked.save()

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]

        # The unchecked node is always the first out.
        self.assertEqual(node_unchecked.system_id, system_ids[0])
예제 #8
0
    def test__excludes_recently_checked_nodes(self):
        rack = factory.make_RackController(power_type='')

        node_unchecked = self.make_Node(bmc_connected_to=rack)
        node_unchecked.power_state_queried = None
        node_unchecked.save()

        datetime_now = now()
        node_checked_recently = self.make_Node(bmc_connected_to=rack)
        node_checked_recently.power_state_queried = datetime_now
        node_checked_recently.save()

        datetime_10_minutes_ago = datetime_now - timedelta(minutes=10)
        node_checked_long_ago = self.make_Node(bmc_connected_to=rack)
        node_checked_long_ago.power_state_queried = datetime_10_minutes_ago
        node_checked_long_ago.save()

        power_parameters = list_cluster_nodes_power_parameters(rack.system_id)
        system_ids = [params["system_id"] for params in power_parameters]

        self.assertItemsEqual(
            {node_unchecked.system_id, node_checked_long_ago.system_id},
            system_ids)