8
from crochet import wait_for
9
from maasserver.clusterrpc import power as power_module
8
10
from maasserver.clusterrpc.power import (
11
pick_best_power_state,
17
from maasserver.enum import POWER_STATE
13
18
from maasserver.testing.factory import factory
14
from maasserver.testing.testcase import MAASServerTestCase
19
from maasserver.testing.testcase import (
21
MAASTransactionServerTestCase,
23
from maasserver.utils.orm import transactional
24
from maasserver.utils.threads import deferToDatabase
15
25
from maastesting.matchers import MockCalledOnceWith
16
26
from mock import Mock
17
27
from provisioningserver.rpc.cluster import (
70
90
MockCalledOnceWith(
71
91
PowerDriverCheck, power_type=power_info.power_type
95
class TestPowerQueryAll(MAASTransactionServerTestCase):
96
"""Tests for `power_query_all`."""
99
def make_node_with_power_info(self):
100
node = factory.make_Node()
101
power_info = node.get_effective_power_info()
102
return node, power_info
106
def test__calls_PowerQuery_on_all_clients(self):
107
node, power_info = yield deferToDatabase(
108
self.make_node_with_power_info)
110
successful_rack_ids = [
111
factory.make_name("system_id")
115
factory.make_name("system_id")
120
for rack_id in successful_rack_ids:
121
power_state = factory.pick_enum(POWER_STATE)
122
power_states.append(power_state)
124
client.ident = rack_id
125
client.return_value = succeed({
126
"state": power_state,
128
clients.append(client)
129
for rack_id in failed_rack_ids:
131
client.ident = rack_id
132
client.return_value = fail(factory.make_exception())
133
clients.append(client)
135
self.patch(power_module, "getAllClients").return_value = clients
136
power_state, success_racks, failed_racks = yield power_query_all(
137
node.system_id, node.hostname, power_info)
139
self.assertEqual(pick_best_power_state(power_states), power_state)
140
self.assertItemsEqual(successful_rack_ids, success_racks)
141
self.assertItemsEqual(failed_rack_ids, failed_racks)
145
def test__handles_timeout(self):
146
node, power_info = yield deferToDatabase(
147
self.make_node_with_power_info)
149
def defer_way_later(*args, **kwargs):
150
# Create a defer that will finish in 1 minute.
151
return deferLater(reactor, 60 * 60, lambda: None)
153
rack_id = factory.make_name("system_id")
155
client.ident = rack_id
156
client.side_effect = defer_way_later
158
self.patch(power_module, "getAllClients").return_value = [client]
159
power_state, success_racks, failed_racks = yield power_query_all(
160
node.system_id, node.hostname, power_info, timeout=0.5)
162
self.assertEqual(POWER_STATE.UNKNOWN, power_state)
163
self.assertItemsEqual([], success_racks)
164
self.assertItemsEqual([rack_id], failed_racks)