summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhenguo Niu <niuzhenguo@huawei.com>2015-04-02 22:35:37 +0800
committerZhenguo Niu <niuzhenguo@huawei.com>2015-04-08 02:02:29 +0000
commit6aace9c77477fccac7898bfe154074a6407070d0 (patch)
tree33cb0bcb0cfa686504a702308a036c6cf84d15ac
parent0bac0ac02e576e67a34ca128feb89b27c5466b5f (diff)
downloadironic-6aace9c77477fccac7898bfe154074a6407070d0.tar.gz
Add maintenance check before call do_node_deploy
Currently if we set provision state to active or rebuild, there is no maintenance check before signal to conductor, so add the check on api side to save a rpc call. Closes-Bug: #1441413 Change-Id: I2898b874b92f865d7e566fac0ede568d1b6c3831
-rw-r--r--ironic/api/controllers/v1/node.py5
-rw-r--r--ironic/tests/api/v1/test_nodes.py17
2 files changed, 12 insertions, 10 deletions
diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py
index 5549d870e..6a4c270f4 100644
--- a/ironic/api/controllers/v1/node.py
+++ b/ironic/api/controllers/v1/node.py
@@ -426,6 +426,11 @@ class NodeStatesController(rest.RestController):
raise exception.NodeLocked(node=rpc_node.uuid,
host=rpc_node.reservation)
+ if (target in (ir_states.ACTIVE, ir_states.REBUILD)
+ and rpc_node.maintenance):
+ raise exception.NodeInMaintenance(op=_('provisioning'),
+ node=rpc_node.uuid)
+
m = ir_states.machine.copy()
m.initialize(rpc_node.provision_state)
if not m.is_valid_event(ir_states.VERBS.get(target, target)):
diff --git a/ironic/tests/api/v1/test_nodes.py b/ironic/tests/api/v1/test_nodes.py
index 285cfa603..9e60e139f 100644
--- a/ironic/tests/api/v1/test_nodes.py
+++ b/ironic/tests/api/v1/test_nodes.py
@@ -1899,17 +1899,14 @@ class TestPut(test_api_base.FunctionalTest):
True, 'test-topic')
def test_provision_node_in_maintenance_fail(self):
- with mock.patch.object(rpcapi.ConductorAPI, 'do_node_deploy') as dnd:
- self.node.maintenance = True
- self.node.save()
- dnd.side_effect = exception.NodeInMaintenance(op='provisioning',
- node=self.node.uuid)
+ self.node.maintenance = True
+ self.node.save()
- ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid,
- {'target': states.ACTIVE},
- expect_errors=True)
- self.assertEqual(400, ret.status_code)
- self.assertTrue(ret.json['error_message'])
+ ret = self.put_json('/nodes/%s/states/provision' % self.node.uuid,
+ {'target': states.ACTIVE},
+ expect_errors=True)
+ self.assertEqual(400, ret.status_code)
+ self.assertTrue(ret.json['error_message'])
@mock.patch.object(rpcapi.ConductorAPI, 'set_boot_device')
def test_set_boot_device(self, mock_sbd):