def test_query_all_nodes_swallows_Exception(self): node1, node2 = self.make_nodes(2) error_message = factory.make_name("error") error_type = factory.make_exception_type() new_state_2 = self.pick_alternate_state(node2["power_state"]) get_power_state = self.patch(power, "get_power_state") get_power_state.side_effect = [ fail(error_type(error_message)), succeed(new_state_2), ] suppress_reporting(self) maaslog = FakeLogger("maas.power", level=logging.DEBUG) twistlog = TwistedLoggerFixture() with maaslog, twistlog: yield power.query_all_nodes([node1, node2]) self.assertDocTestMatches( """\ hostname-...: Failed to refresh power state: %s hostname-...: Power state has changed from ... to ... """ % error_message, maaslog.output, )
def test_query_all_nodes_only_queries_queryable_power_types(self): nodes = self.make_nodes() # nodes are all queryable, so add one that isn't: nodes.append(self.make_node(power_type="manual")) # Report back that all nodes' power states are as recorded. power_states = [node["power_state"] for node in nodes] get_power_state = self.patch(power, "get_power_state") get_power_state.side_effect = map(succeed, power_states) suppress_reporting(self) yield power.query_all_nodes(nodes) self.assertThat( get_power_state, MockCallsMatch( *( call( node["system_id"], node["hostname"], node["power_type"], node["context"], clock=reactor, ) for node in nodes if node["power_type"] in PowerDriverRegistry ) ), )
def test_query_all_nodes_swallows_PowerError(self): node1, node2 = self.make_nodes(2) new_state_2 = self.pick_alternate_state(node2["power_state"]) get_power_state = self.patch(power, "get_power_state") error_msg = factory.make_name("error") get_power_state.side_effect = [ fail(PowerError(error_msg)), succeed(new_state_2), ] suppress_reporting(self) with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: yield power.query_all_nodes([node1, node2]) self.assertDocTestMatches( """\ %s: Could not query power state: %s. %s: Power state has changed from %s to %s. """ % ( node1["hostname"], error_msg, node2["hostname"], node2["power_state"], new_state_2, ), maaslog.output, )
def test_query_all_nodes_gets_and_reports_power_state(self): nodes = self.make_nodes() # Report back that all nodes' power states are as recorded. power_states = [node["power_state"] for node in nodes] queries = list(map(succeed, power_states)) get_power_state = self.patch(power, "get_power_state") get_power_state.side_effect = queries report_power_state = self.patch(power, "report_power_state") report_power_state.side_effect = lambda d, sid, hn: d yield power.query_all_nodes(nodes) self.assertThat( get_power_state, MockCallsMatch(*(call( node["system_id"], node["hostname"], node["power_type"], node["context"], clock=reactor, ) for node in nodes)), ) self.assertThat( report_power_state, MockCallsMatch(*(call(query, node["system_id"], node["hostname"]) for query, node in zip(queries, nodes))), )
def test_query_all_nodes_skips_nodes_in_action_registry(self): nodes = self.make_nodes() # First node is in the registry. power.power_action_registry[nodes[0]["system_id"]] = sentinel.action # Report back power state of nodes' not in registry. power_states = [node["power_state"] for node in nodes[1:]] get_power_state = self.patch(power, "get_power_state") get_power_state.side_effect = map(succeed, power_states) suppress_reporting(self) yield power.query_all_nodes(nodes) self.assertThat( get_power_state, MockCallsMatch(*(call( node["system_id"], node["hostname"], node["power_type"], node["context"], clock=reactor, ) for node in nodes[1:])), ) self.assertThat( get_power_state, Not( MockCalledWith( nodes[0]["system_id"], nodes[0]["hostname"], nodes[0]["power_type"], nodes[0]["context"], clock=reactor, )), )
def test_query_all_nodes_logs_skip_if_node_in_action_registry(self): node = self.make_node() power.power_action_registry[node['system_id']] = sentinel.action with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: yield power.query_all_nodes([node]) self.assertDocTestMatches( "hostname-...: Skipping query power status, " "power action already in progress.", maaslog.output)
def test_query_all_nodes_returns_deferredlist_of_number_of_nodes(self): node1, node2 = self.make_nodes(2) get_power_state = self.patch(power, 'get_power_state') get_power_state.side_effect = [ succeed(node1['power_state']), succeed(node2['power_state']), ] suppress_reporting(self) results = yield power.query_all_nodes([node1, node2]) self.assertEqual([(True, node1['power_state']), (True, node2['power_state'])], results)
def query_nodes(self, client): # Get the nodes' power parameters from the region. Keep getting more # power parameters until the region returns an empty list. while True: response = yield client( ListNodePowerParameters, uuid=client.localIdent) power_parameters = response['nodes'] if len(power_parameters) > 0: yield query_all_nodes( power_parameters, max_concurrency=self.max_nodes_at_once, clock=self.clock) else: break
def test_query_all_nodes_swallows_NoSuchNode(self): node1, node2 = self.make_nodes(2) new_state_2 = self.pick_alternate_state(node2['power_state']) get_power_state = self.patch(power, 'get_power_state') get_power_state.side_effect = [ fail(exceptions.NoSuchNode()), succeed(new_state_2), ] suppress_reporting(self) with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: yield power.query_all_nodes([node1, node2]) self.assertDocTestMatches( """\ hostname-...: Power state has changed from ... to ... """, maaslog.output)
def test_query_all_nodes_swallows_PowerActionFail(self): node1, node2 = self.make_nodes(2) new_state_2 = self.pick_alternate_state(node2['power_state']) get_power_state = self.patch(power, 'get_power_state') error_msg = factory.make_name("error") get_power_state.side_effect = [ fail(exceptions.PowerActionFail(error_msg)), succeed(new_state_2), ] suppress_reporting(self) with FakeLogger("maas.power", level=logging.DEBUG) as maaslog: yield power.query_all_nodes([node1, node2]) self.assertDocTestMatches( """\ hostname-...: Could not query power state: %s. hostname-...: Power state has changed from ... to ... """ % error_msg, maaslog.output)