From 4245446f4378115af8c68b880590e46c54c0c6d0 Mon Sep 17 00:00:00 2001 From: Adeodato Simo <dato@google.com> Date: Fri, 7 Jan 2011 21:10:25 +0000 Subject: [PATCH] Expose OpAssignGroupNodes over RAPI and RAPI client Signed-off-by: Adeodato Simo <dato@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- doc/rapi.rst | 18 ++++++++++++++++++ lib/rapi/client.py | 29 +++++++++++++++++++++++++++++ lib/rapi/connector.py | 2 ++ lib/rapi/rlib2.py | 19 +++++++++++++++++++ test/ganeti.rapi.client_unittest.py | 12 ++++++++++++ 5 files changed, 80 insertions(+) diff --git a/doc/rapi.rst b/doc/rapi.rst index f994bd3b4..9b3bfad20 100644 --- a/doc/rapi.rst +++ b/doc/rapi.rst @@ -519,6 +519,24 @@ Body parameters: New node group name. +``/2/groups/[group_name]/assign-nodes`` ++++++++++++++++++++++++++++++++++++++++ + +Assigns nodes to a group. + +Supports the following commands: ``PUT``. + +``PUT`` +~~~~~~~ + +Returns a job ID. It supports the ``dry-run`` and ``force`` arguments. + +Body parameters: + +``nodes`` (list, required) + One or more nodes to assign to the group. + + ``/2/instances`` ++++++++++++++++ diff --git a/lib/rapi/client.py b/lib/rapi/client.py index 8e22afbe4..467dec909 100644 --- a/lib/rapi/client.py +++ b/lib/rapi/client.py @@ -1531,3 +1531,32 @@ class GanetiRapiClient(object): return self._SendRequest(HTTP_PUT, ("/%s/groups/%s/rename" % (GANETI_RAPI_VERSION, group)), None, body) + + + def AssignGroupNodes(self, group, nodes, force=False, dry_run=False): + """Assigns nodes to a group. + + @type group: string + @param group: Node gropu name + @type nodes: list of strings + @param nodes: List of nodes to assign to the group + + @rtype: int + @return: job id + + """ + query = [] + + if force: + query.append(("force", 1)) + + if dry_run: + query.append(("dry-run", 1)) + + body = { + "nodes": nodes, + } + + return self._SendRequest(HTTP_PUT, + ("/%s/groups/%s/assign-nodes" % + (GANETI_RAPI_VERSION, group)), query, body) diff --git a/lib/rapi/connector.py b/lib/rapi/connector.py index f6f2e11b1..ef03525f2 100644 --- a/lib/rapi/connector.py +++ b/lib/rapi/connector.py @@ -223,6 +223,8 @@ def GetHandlers(node_name_pattern, instance_name_pattern, rlib2.R_2_groups_name_modify, re.compile(r'^/2/groups/(%s)/rename$' % group_name_pattern): rlib2.R_2_groups_name_rename, + re.compile(r'^/2/groups/(%s)/assign-nodes$' % group_name_pattern): + rlib2.R_2_groups_name_assign_nodes, "/2/jobs": rlib2.R_2_jobs, re.compile(r"^/2/jobs/(%s)$" % job_id_pattern): diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 94a119372..3ff29887a 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -685,6 +685,25 @@ class R_2_groups_name_rename(baserlib.R_Generic): return baserlib.SubmitJob([op]) +class R_2_groups_name_assign_nodes(baserlib.R_Generic): + """/2/groups/[groupe_name]/assign-nodes resource. + + """ + def PUT(self): + """Assigns nodes to a group. + + @return: a job id + + """ + op = baserlib.FillOpcode(opcodes.OpAssignGroupNodes, self.request_body, { + "group_name": self.items[0], + "dry_run": self.dryRun(), + "force": self.useForce(), + }) + + return baserlib.SubmitJob([op]) + + def _ParseInstanceCreateRequestVersion1(data, dry_run): """Parses an instance creation request version 1. diff --git a/test/ganeti.rapi.client_unittest.py b/test/ganeti.rapi.client_unittest.py index 9b432b91f..117791bd1 100755 --- a/test/ganeti.rapi.client_unittest.py +++ b/test/ganeti.rapi.client_unittest.py @@ -351,6 +351,9 @@ class GanetiRapiClientTests(testutils.GanetiTestCase): def assertDryRun(self): self.assertTrue(self.rapi.GetLastHandler().dryRun()) + def assertUseForce(self): + self.assertTrue(self.rapi.GetLastHandler().useForce()) + def testEncodeQuery(self): query = [ ("a", None), @@ -1045,6 +1048,15 @@ class GanetiRapiClientTests(testutils.GanetiTestCase): self.assertEqual(job_id, 12348) self.assertHandler(rlib2.R_2_groups_name_modify) + def testAssignGroupNodes(self): + self.rapi.AddResponse("12349") + job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"], + force=True, dry_run=True) + self.assertEqual(job_id, 12349) + self.assertHandler(rlib2.R_2_groups_name_assign_nodes) + self.assertDryRun() + self.assertUseForce() + def testModifyCluster(self): for mnh in [None, False, True]: self.rapi.AddResponse("14470") -- GitLab