Signed-off-by: Adeodato Simo <[email protected]>
---
doc/rapi.rst | 18 ++++++++++++++++++
lib/rapi/client.py | 29 +++++++++++++++++++++++++++++
lib/rapi/connector.py | 2 ++
lib/rapi/rlib2.py | 23 +++++++++++++++++++++++
test/ganeti.rapi.client_unittest.py | 12 ++++++++++++
5 files changed, 84 insertions(+), 0 deletions(-)
diff --git a/doc/rapi.rst b/doc/rapi.rst
index f994bd3..ef70585 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 8e22afb..be0850b 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 f6f2e11..155c305 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 94a1193..c0b90d7 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -685,6 +685,29 @@ 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
+
+ """
+ baserlib.CheckType(self.request_body, dict, "Body contents")
+ nodes = baserlib.CheckParameter(self.request_body, "nodes", exptype=list)
+ group_name = self.items[0]
+
+ op = opcodes.OpAssignGroupNodes(group_name=group_name, nodes=nodes,
+ force=self.useForce(),
+ dry_run=self.dryRun())
+
+ 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 dffbd05..5920970 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),
@@ -1039,6 +1042,15 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
self.assertEqual(job_id, 12347)
self.assertHandler(rlib2.R_2_groups_name_rename)
+ 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")
--
1.7.3.1