Merge lp:~mpontillo/maas/bug-1449396-lets-not-power-query-devices into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 3858
Proposed branch: lp:~mpontillo/maas/bug-1449396-lets-not-power-query-devices
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 103 lines (+35/-1)
6 files modified
src/maasserver/api/nodes.py (+6/-0)
src/maasserver/api/tests/test_nodes.py (+6/-0)
src/maasserver/node_query.py (+5/-0)
src/maasserver/rpc/nodes.py (+2/-1)
src/maasserver/rpc/tests/test_nodes.py (+11/-0)
src/maasserver/websockets/handlers/node.py (+5/-0)
To merge this branch: bzr merge lp:~mpontillo/maas/bug-1449396-lets-not-power-query-devices
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+257854@code.launchpad.net

Commit message

Fix for bug #1449396: Don't try to perform power queries on non-installable nodes

To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote :

I think this is ready for another look.

Revision history for this message
Gavin Panella (allenap) wrote :

Looks good!

review: Approve
Revision history for this message
Mike Pontillo (mpontillo) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/api/nodes.py'
2--- src/maasserver/api/nodes.py 2015-04-21 22:51:42 +0000
3+++ src/maasserver/api/nodes.py 2015-04-30 14:48:22 +0000
4@@ -651,11 +651,17 @@
5 :return: a dict whose key is "state" with a value of one of
6 'on' or 'off'.
7
8+ Returns 400 if the node is not installable.
9 Returns 404 if the node is not found.
10 Returns 503 (with explanatory text) if the power state could not
11 be queried.
12 """
13 node = get_object_or_404(Node, system_id=system_id)
14+ if not node.installable:
15+ raise MAASAPIBadRequest(
16+ "%s: Unable to query power state; not an installable node" %
17+ node.hostname)
18+
19 ng = node.nodegroup
20
21 try:
22
23=== modified file 'src/maasserver/api/tests/test_nodes.py'
24--- src/maasserver/api/tests/test_nodes.py 2015-04-10 09:38:25 +0000
25+++ src/maasserver/api/tests/test_nodes.py 2015-04-30 14:48:22 +0000
26@@ -1871,6 +1871,12 @@
27 self.assertResponseCode(httplib.SERVICE_UNAVAILABLE, response)
28 self.assertIn(error_message, response.content)
29
30+ def test__returns_400_if_device(self):
31+ device = factory.make_Device()
32+ response = self.client.get(
33+ self.get_node_uri(device), {"op": "query_power_state"})
34+ self.assertResponseCode(httplib.BAD_REQUEST, response)
35+
36 def test__returns_actual_state(self):
37 node = factory.make_Node(power_type="ipmi")
38 random_state = random.choice(["on", "off", "error"])
39
40=== modified file 'src/maasserver/node_query.py'
41--- src/maasserver/node_query.py 2015-03-25 15:33:23 +0000
42+++ src/maasserver/node_query.py 2015-04-30 14:48:22 +0000
43@@ -111,6 +111,11 @@
44 # abandon this task; there's no point even logging.
45 return
46
47+ if not node.installable:
48+ # This is actually a device, not a node. We don't support power queries
49+ # for devices.
50+ return
51+
52 if power_info is None:
53 # The node does not have a valid power type, so we can't query it.
54 # Logging this is just spam; this problem is reported elsewhere, so
55
56=== modified file 'src/maasserver/rpc/nodes.py'
57--- src/maasserver/rpc/nodes.py 2015-03-25 15:33:23 +0000
58+++ src/maasserver/rpc/nodes.py 2015-04-30 14:48:22 +0000
59@@ -74,7 +74,8 @@
60 else:
61 power_info_by_node = (
62 (node, node.get_effective_power_info())
63- for node in nodegroup.node_set.exclude(status=NODE_STATUS.BROKEN)
64+ for node in nodegroup.node_set.exclude(
65+ status=NODE_STATUS.BROKEN).exclude(installable=False)
66 )
67 return [
68 {
69
70=== modified file 'src/maasserver/rpc/tests/test_nodes.py'
71--- src/maasserver/rpc/tests/test_nodes.py 2015-03-26 00:12:12 +0000
72+++ src/maasserver/rpc/tests/test_nodes.py 2015-04-30 14:48:22 +0000
73@@ -332,3 +332,14 @@
74
75 self.assertThat(
76 returned_system_ids, Not(Contains(broken_node.system_id)))
77+
78+ def test_does_not_return_power_info_for_devices(self):
79+ cluster = factory.make_NodeGroup()
80+ device = factory.make_Device()
81+
82+ power_parameters = list_cluster_nodes_power_parameters(cluster.uuid)
83+ returned_system_ids = [
84+ power_params['system_id'] for power_params in power_parameters]
85+
86+ self.assertThat(
87+ returned_system_ids, Not(Contains(device.system_id)))
88
89=== modified file 'src/maasserver/websockets/handlers/node.py'
90--- src/maasserver/websockets/handlers/node.py 2015-04-08 20:54:14 +0000
91+++ src/maasserver/websockets/handlers/node.py 2015-04-30 14:48:22 +0000
92@@ -465,6 +465,11 @@
93 def check_power(self, params):
94 """Check the power state of the node."""
95 obj = self.get_object(params)
96+ if not obj.installable:
97+ raise HandlerError(
98+ "%s: Unable to query power state; not an installable node" %
99+ obj.hostname)
100+
101 ng = obj.nodegroup
102
103 try: