From 94497dd1cfce6babe08f65603a2619afdc178969 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann Date: Thu, 13 Oct 2011 14:11:00 +0200 Subject: [PATCH] rapi: Add resource for modifying node MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit A separate patch will add “auto-promote” through “/2/nodes/[node_name]/role”. Signed-off-by: Michael Hanselmann Reviewed-by: Iustin Pop --- doc/rapi.rst | 22 ++++++++++++++++++++++ lib/rapi/client.py | 15 +++++++++++++++ lib/rapi/connector.py | 2 ++ lib/rapi/rlib2.py | 19 +++++++++++++++++++ test/ganeti.rapi.client_unittest.py | 8 ++++++++ 5 files changed, 66 insertions(+) diff --git a/doc/rapi.rst b/doc/rapi.rst index 5a00ddd..238b849 100644 --- a/doc/rapi.rst +++ b/doc/rapi.rst @@ -1326,6 +1326,28 @@ be a job id. It supports the bool ``force`` argument. + +``/2/nodes/[node_name]/modify`` ++++++++++++++++++++++++++++++++++ + +Modifies the parameters of a node. Supports the following commands: +``POST``. + +``POST`` +~~~~~~~ + +Returns a job ID. + +Body parameters: + +.. opcode_params:: OP_NODE_SET_PARAMS + :exclude: node_name + +Job result: + +.. opcode_result:: OP_NODE_SET_PARAMS + + ``/2/nodes/[node_name]/storage`` ++++++++++++++++++++++++++++++++ diff --git a/lib/rapi/client.py b/lib/rapi/client.py index dac670b..2453eb6 100644 --- a/lib/rapi/client.py +++ b/lib/rapi/client.py @@ -1449,6 +1449,21 @@ class GanetiRapiClient(object): # pylint: disable=R0904 ("/%s/nodes/%s/role" % (GANETI_RAPI_VERSION, node)), query, role) + def ModifyNode(self, group, **kwargs): + """Modifies a node. + + More details for parameters can be found in the RAPI documentation. + + @type group: string + @param group: Node name + @rtype: string + @return: job id + + """ + return self._SendRequest(HTTP_POST, + ("/%s/nodes/%s/modify" % + (GANETI_RAPI_VERSION, group)), None, kwargs) + def GetNodeStorageUnits(self, node, storage_type, output_fields): """Gets the storage units for a node. diff --git a/lib/rapi/connector.py b/lib/rapi/connector.py index 499e2e6..a0ddcaf 100644 --- a/lib/rapi/connector.py +++ b/lib/rapi/connector.py @@ -177,6 +177,8 @@ def GetHandlers(node_name_pattern, instance_name_pattern, rlib2.R_2_nodes_name_evacuate, re.compile(r"^/2/nodes/(%s)/migrate$" % node_name_pattern): rlib2.R_2_nodes_name_migrate, + re.compile(r"^/2/nodes/(%s)/modify$" % node_name_pattern): + rlib2.R_2_nodes_name_modify, re.compile(r"^/2/nodes/(%s)/storage$" % node_name_pattern): rlib2.R_2_nodes_name_storage, re.compile(r"^/2/nodes/(%s)/storage/modify$" % node_name_pattern): diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 0a958da..e905ec7 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -497,6 +497,25 @@ class R_2_nodes_name_migrate(baserlib.R_Generic): return baserlib.SubmitJob([op]) +class R_2_nodes_name_modify(baserlib.R_Generic): + """/2/nodes/[node_name]/modify resource. + + """ + def POST(self): + """Changes parameters of a node. + + @return: a job id + + """ + baserlib.CheckType(self.request_body, dict, "Body contents") + + op = baserlib.FillOpcode(opcodes.OpNodeSetParams, self.request_body, { + "instance_name": self.items[0], + }) + + return baserlib.SubmitJob([op]) + + class R_2_nodes_name_storage(baserlib.R_Generic): """/2/nodes/[node_name]/storage resource. diff --git a/test/ganeti.rapi.client_unittest.py b/test/ganeti.rapi.client_unittest.py index d7af45a..dc972d2 100755 --- a/test/ganeti.rapi.client_unittest.py +++ b/test/ganeti.rapi.client_unittest.py @@ -973,6 +973,14 @@ class GanetiRapiClientTests(testutils.GanetiTestCase): self.assertQuery("force", ["1"]) self.assertEqual("\"master-candidate\"", self.rapi.GetLastRequestData()) + def testModifyNode(self): + self.rapi.AddResponse("3783") + job_id = self.client.ModifyNode("node16979.example.com", drained=True) + self.assertEqual(job_id, 3783) + self.assertHandler(rlib2.R_2_nodes_name_modify) + self.assertItems(["node16979.example.com"]) + self.assertEqual(self.rapi.CountPending(), 0) + def testGetNodeStorageUnits(self): self.rapi.AddResponse("42") self.assertEqual(42, -- 1.7.10.4