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