diff options
author | Zhenguo Niu <niuzhenguo@huawei.com> | 2015-04-02 22:35:37 +0800 |
---|---|---|
committer | Zhenguo Niu <niuzhenguo@huawei.com> | 2015-04-08 02:02:29 +0000 |
commit | 6aace9c77477fccac7898bfe154074a6407070d0 (patch) | |
tree | 33cb0bcb0cfa686504a702308a036c6cf84d15ac | |
parent | 0bac0ac02e576e67a34ca128feb89b27c5466b5f (diff) | |
download | ironic-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.py | 5 | ||||
-rw-r--r-- | ironic/tests/api/v1/test_nodes.py | 17 |
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): |