Merge lp:~andreserl/maas/fix_lp1441408_lp1386504 into lp:~maas-committers/maas/trunk

Proposed by Andres Rodriguez
Status: Merged
Approved by: Blake Rouse
Approved revision: no longer in the source branch.
Merged at revision: 5571
Proposed branch: lp:~andreserl/maas/fix_lp1441408_lp1386504
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 148 lines (+48/-23)
6 files modified
src/maasserver/forms_commission.py (+0/-5)
src/maasserver/models/node.py (+4/-1)
src/maasserver/models/tests/test_node.py (+21/-0)
src/maasserver/node_action.py (+0/-4)
src/maasserver/tests/test_forms_commission.py (+10/-7)
src/maasserver/tests/test_node_action.py (+13/-6)
To merge this branch: bzr merge lp:~andreserl/maas/fix_lp1441408_lp1386504
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+311679@code.launchpad.net

Commit message

If a machine is already powered ON when executing the 'commissioning' action (both via UI and CLI), power cycle the machine instead of failing to start commissioning.

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

Looks good. One test looks like it needs an improvement.

review: Approve
Revision history for this message
Andres Rodriguez (andreserl) wrote :

Replied to comment inline.

Revision history for this message
Blake Rouse (blake-rouse) wrote :

This looks good. My follow up branch will add another tests.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/forms_commission.py'
2--- src/maasserver/forms_commission.py 2015-12-01 18:12:59 +0000
3+++ src/maasserver/forms_commission.py 2016-11-24 14:26:12 +0000
4@@ -9,7 +9,6 @@
5
6 from django import forms
7 from django.core.exceptions import ValidationError
8-from maasserver.enum import POWER_STATE
9 from maasserver.node_action import compile_node_actions
10
11
12@@ -36,10 +35,6 @@
13 raise ValidationError(
14 "Commission is not available because of the current state "
15 "of the node.")
16- if self.instance.power_state == POWER_STATE.ON:
17- raise ValidationError(
18- "Commission is not available because of the node is currently "
19- "powered on.")
20 return cleaned_data
21
22 def save(self):
23
24=== modified file 'src/maasserver/models/node.py'
25--- src/maasserver/models/node.py 2016-11-11 15:50:38 +0000
26+++ src/maasserver/models/node.py 2016-11-24 14:26:12 +0000
27@@ -3134,7 +3134,10 @@
28
29 # Request that the node be powered on post-commit.
30 d = post_commit()
31- d = self._power_control_node(d, power_on_node, power_info)
32+ if self.power_state == POWER_STATE.ON:
33+ d = self._power_control_node(d, power_cycle, power_info)
34+ else:
35+ d = self._power_control_node(d, power_on_node, power_info)
36
37 # Set the deployment timeout so the node is marked failed after
38 # a period of time.
39
40=== modified file 'src/maasserver/models/tests/test_node.py'
41--- src/maasserver/models/tests/test_node.py 2016-11-11 17:21:57 +0000
42+++ src/maasserver/models/tests/test_node.py 2016-11-24 14:26:12 +0000
43@@ -2304,6 +2304,27 @@
44 post_commit_hooks.reset() # Ignore these for now.
45 self.assertEqual('hwe-v', node.min_hwe_kernel)
46
47+ def test_start_commissioning_starts_node_if_already_on(self):
48+ node = factory.make_Node(
49+ interface=True, status=NODE_STATUS.NEW, power_type='manual',
50+ power_state=POWER_STATE.ON)
51+ node_start = self.patch(node, '_start')
52+ # Return a post-commit hook from Node.start().
53+ node_start.side_effect = (
54+ lambda user, user_data, old_status: post_commit())
55+ admin = factory.make_admin()
56+ node.start_commissioning(admin)
57+ post_commit_hooks.reset() # Ignore these for now.
58+ node = reload_object(node)
59+ expected_attrs = {
60+ 'status': NODE_STATUS.COMMISSIONING,
61+ 'owner': admin,
62+ }
63+ self.assertAttributes(node, expected_attrs)
64+ self.expectThat(node.owner, Equals(admin))
65+ self.assertThat(node_start, MockCalledOnceWith(
66+ admin, ANY, NODE_STATUS.NEW))
67+
68 def test_start_commissioning_clears_node_commissioning_results(self):
69 node = factory.make_Node(status=NODE_STATUS.NEW)
70 node_start = self.patch(node, '_start')
71
72=== modified file 'src/maasserver/node_action.py'
73--- src/maasserver/node_action.py 2016-08-16 09:31:16 +0000
74+++ src/maasserver/node_action.py 2016-11-24 14:26:12 +0000
75@@ -230,10 +230,6 @@
76 self, enable_ssh=False, skip_networking=False,
77 skip_storage=False):
78 """See `NodeAction.execute`."""
79- if self.node.power_state == POWER_STATE.ON:
80- raise NodeActionError(
81- "Unable to be commissioned because the power is currently on.")
82-
83 try:
84 self.node.start_commissioning(
85 self.user,
86
87=== modified file 'src/maasserver/tests/test_forms_commission.py'
88--- src/maasserver/tests/test_forms_commission.py 2015-12-01 18:12:59 +0000
89+++ src/maasserver/tests/test_forms_commission.py 2016-11-24 14:26:12 +0000
90@@ -36,17 +36,20 @@
91 "of the node."],
92 }, form.errors)
93
94- def test__not_allowed_if_on(self):
95+ def test__calls_start_commissioning_if_already_on(self):
96 node = factory.make_Node(
97 status=NODE_STATUS.READY, power_state=POWER_STATE.ON)
98 user = factory.make_admin()
99+ mock_start_commissioning = self.patch_autospec(
100+ node, "start_commissioning")
101 form = CommissionForm(instance=node, user=user, data={})
102- self.assertFalse(form.is_valid(), form.errors)
103- self.assertEqual({
104- '__all__': [
105- "Commission is not available because of the node is currently "
106- "powered on."],
107- }, form.errors)
108+ self.assertTrue(form.is_valid(), form.errors)
109+ node = form.save()
110+ self.assertThat(
111+ mock_start_commissioning,
112+ MockCalledOnceWith(
113+ user, enable_ssh=False, skip_networking=False,
114+ skip_storage=False))
115
116 def test__calls_start_commissioning_with_options(self):
117 node = factory.make_Node(
118
119=== modified file 'src/maasserver/tests/test_node_action.py'
120--- src/maasserver/tests/test_node_action.py 2016-11-11 15:50:38 +0000
121+++ src/maasserver/tests/test_node_action.py 2016-11-24 14:26:12 +0000
122@@ -281,13 +281,20 @@
123 ("READY", {"status": NODE_STATUS.READY}),
124 )
125
126- def test_raise_NodeActionError_if_on(self):
127+ def test_Commission_starts_commissioning_if_already_on(self):
128 node = factory.make_Node(
129- status=self.status, power_state=POWER_STATE.ON)
130- user = factory.make_admin()
131- action = Commission(node, user)
132- self.assertTrue(action.is_permitted())
133- self.assertRaises(NodeActionError, action.execute)
134+ interface=True, status=self.status,
135+ power_type='manual', power_state=POWER_STATE.ON)
136+ node_start = self.patch(node, '_start')
137+ node_start.side_effect = (
138+ lambda user, user_data, old_status: post_commit())
139+ admin = factory.make_admin()
140+ action = Commission(node, admin)
141+ with post_commit_hooks:
142+ action.execute()
143+ self.assertEqual(NODE_STATUS.COMMISSIONING, node.status)
144+ self.assertThat(
145+ node_start, MockCalledOnceWith(admin, ANY, ANY))
146
147 def test_Commission_starts_commissioning(self):
148 node = factory.make_Node(