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))
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)
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)
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)
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))
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))
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])
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)