Merge lp:~newell-jensen/maas/power-query-handle-bmc-is-none into lp:~maas-committers/maas/trunk

Proposed by Newell Jensen
Status: Merged
Approved by: Blake Rouse
Approved revision: no longer in the source branch.
Merged at revision: 4864
Proposed branch: lp:~newell-jensen/maas/power-query-handle-bmc-is-none
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 86 lines (+23/-4)
3 files modified
src/maasserver/models/node.py (+8/-1)
src/maasserver/models/signals/power.py (+3/-1)
src/maasserver/models/signals/tests/test_power.py (+12/-2)
To merge this branch: bzr merge lp:~newell-jensen/maas/power-query-handle-bmc-is-none
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+290757@code.launchpad.net

Commit message

Update _power_control_node on the Node model to check if BMC is None before checking if it is accessible. This remedies the situation when a power_query is performed and there is no BMC.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/models/node.py'
--- src/maasserver/models/node.py 2016-03-30 03:33:50 +0000
+++ src/maasserver/models/node.py 2016-04-01 16:37:24 +0000
@@ -2906,8 +2906,15 @@
2906 # Check if the BMC is accessible. If not we need to do some work to2906 # Check if the BMC is accessible. If not we need to do some work to
2907 # make sure we can determine which rack controller can power2907 # make sure we can determine which rack controller can power
2908 # control this node.2908 # control this node.
2909 def is_bmc_accessible():
2910 if self.bmc is None:
2911 raise PowerProblem(
2912 "No BMC is defined. Cannot power control node.")
2913 else:
2914 return self.bmc.is_accessible()
2915
2909 defer.addCallback(2916 defer.addCallback(
2910 lambda _: deferToDatabase(transactional(self.bmc.is_accessible)))2917 lambda _: deferToDatabase(transactional(is_bmc_accessible)))
29112918
2912 def cb_update_routable_racks(accessible):2919 def cb_update_routable_racks(accessible):
2913 if not accessible:2920 if not accessible:
29142921
=== modified file 'src/maasserver/models/signals/power.py'
--- src/maasserver/models/signals/power.py 2016-03-30 03:33:50 +0000
+++ src/maasserver/models/signals/power.py 2016-04-01 16:37:24 +0000
@@ -9,6 +9,7 @@
99
10from datetime import timedelta10from datetime import timedelta
1111
12from maasserver.exceptions import PowerProblem
12from maasserver.models.node import Node13from maasserver.models.node import Node
13from maasserver.node_status import QUERY_TRANSITIONS14from maasserver.node_status import QUERY_TRANSITIONS
14from maasserver.utils.orm import (15from maasserver.utils.orm import (
@@ -46,7 +47,8 @@
46 d = deferToDatabase(transactional(Node.objects.get), system_id=system_id)47 d = deferToDatabase(transactional(Node.objects.get), system_id=system_id)
47 d.addCallback(lambda node: node.power_query())48 d.addCallback(lambda node: node.power_query())
48 d.addErrback(49 d.addErrback(
49 lambda failure: failure.trap((Node.DoesNotExist, UnknownPowerType)))50 lambda failure: failure.trap(
51 (Node.DoesNotExist, UnknownPowerType, PowerProblem)))
50 d.addErrback(52 d.addErrback(
51 log.err,53 log.err,
52 "Failed to update power state of machine after state transition.")54 "Failed to update power state of machine after state transition.")
5355
=== modified file 'src/maasserver/models/signals/tests/test_power.py'
--- src/maasserver/models/signals/tests/test_power.py 2016-03-30 03:33:50 +0000
+++ src/maasserver/models/signals/tests/test_power.py 2016-04-01 16:37:24 +0000
@@ -7,6 +7,7 @@
77
8from crochet import wait_for8from crochet import wait_for
9from maasserver.enum import POWER_STATE9from maasserver.enum import POWER_STATE
10from maasserver.exceptions import PowerProblem
10from maasserver.models.node import Node11from maasserver.models.node import Node
11from maasserver.models.signals import power12from maasserver.models.signals import power
12from maasserver.node_status import (13from maasserver.node_status import (
@@ -93,13 +94,13 @@
93 power_state = yield power.update_power_state_of_node(node.system_id)94 power_state = yield power.update_power_state_of_node(node.system_id)
94 self.assertEqual(power_state, POWER_STATE.ON)95 self.assertEqual(power_state, POWER_STATE.ON)
9596
96 def test__raises_failure_for_Node_DoesNotExist(self):97 def test__traps_failure_for_Node_DoesNotExist(self):
97 self.assertIsNone(power.update_power_state_of_node(98 self.assertIsNone(power.update_power_state_of_node(
98 factory.make_name('system_id')))99 factory.make_name('system_id')))
99100
100 @wait_for_reactor101 @wait_for_reactor
101 @defer.inlineCallbacks102 @defer.inlineCallbacks
102 def test__raises_failure_for_UnknownPowerType(self):103 def test__traps_failure_for_UnknownPowerType(self):
103 node = yield deferToDatabase(transactional(factory.make_Node))104 node = yield deferToDatabase(transactional(factory.make_Node))
104 mock_node_objects_get = self.patch(Node.objects, "get")105 mock_node_objects_get = self.patch(Node.objects, "get")
105 mock_node_objects_get.side_effect = UnknownPowerType()106 mock_node_objects_get.side_effect = UnknownPowerType()
@@ -108,6 +109,15 @@
108109
109 @wait_for_reactor110 @wait_for_reactor
110 @defer.inlineCallbacks111 @defer.inlineCallbacks
112 def test__traps_failure_for_PowerProblem(self):
113 node = yield deferToDatabase(transactional(factory.make_Node))
114 mock_node_objects_get = self.patch(Node.objects, "get")
115 mock_node_objects_get.side_effect = PowerProblem()
116 power_state = yield power.update_power_state_of_node(node.system_id)
117 self.assertIsNone(power_state)
118
119 @wait_for_reactor
120 @defer.inlineCallbacks
111 def test__logs_other_errors(self):121 def test__logs_other_errors(self):
112 node = yield deferToDatabase(transactional(factory.make_Node))122 node = yield deferToDatabase(transactional(factory.make_Node))
113 mock_node_objects_get = self.patch(Node.objects, "get")123 mock_node_objects_get = self.patch(Node.objects, "get")