Beispiel #1
0
    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,
        )
Beispiel #2
0
    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
                )
            ),
        )
Beispiel #3
0
    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,
        )
Beispiel #4
0
    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))),
        )
Beispiel #5
0
    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,
                )),
        )
Beispiel #6
0
 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)
Beispiel #7
0
    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)
Beispiel #8
0
 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
Beispiel #9
0
    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)
Beispiel #10
0
    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)