From 4c98b915725f672da79162754b71079567f85766 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Thu, 13 Aug 2009 13:43:48 +0200
Subject: [PATCH] rapi: Add /2/instances/[instance_name]/replace-disks resource

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 doc/rapi.rst          | 16 ++++++++++++++++
 lib/rapi/connector.py |  2 ++
 lib/rapi/rlib2.py     | 31 +++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+)

diff --git a/doc/rapi.rst b/doc/rapi.rst
index 9d95c8147..1a9294d40 100644
--- a/doc/rapi.rst
+++ b/doc/rapi.rst
@@ -334,6 +334,22 @@ instance if even if secondary disks are failing.
 It supports the ``dry-run`` argument.
 
 
+``/2/instances/[instance_name]/replace-disks``
+++++++++++++++++++++++++++++++++++++++++++++++
+
+Replaces disks on an instance.
+
+It supports the following commands: ``POST``.
+
+``POST``
+~~~~~~~~
+
+Takes the parameters ``mode`` (one of ``replace_on_primary``,
+``replace_on_secondary``, ``replace_new_secondary`` or ``replace_auto``),
+``disks`` (comma separated list of disk indexes), ``remote_node`` and
+``iallocator``.
+
+
 ``/2/instances/[instance_name]/tags``
 +++++++++++++++++++++++++++++++++++++
 
diff --git a/lib/rapi/connector.py b/lib/rapi/connector.py
index 59621a9e5..d82780b51 100644
--- a/lib/rapi/connector.py
+++ b/lib/rapi/connector.py
@@ -170,6 +170,8 @@ CONNECTOR.update({
       rlib2.R_2_instances_name_reboot,
   re.compile(r'^/2/instances/([\w\._-]+)/reinstall$'):
       rlib2.R_2_instances_name_reinstall,
+  re.compile(r'^/2/instances/([\w\._-]+)/replace-disks$'):
+      rlib2.R_2_instances_name_replace_disks,
   re.compile(r'^/2/instances/([\w\._-]+)/shutdown$'):
       rlib2.R_2_instances_name_shutdown,
   re.compile(r'^/2/instances/([\w\._-]+)/startup$'):
diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index 7042974e3..3a398a572 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -550,6 +550,37 @@ class R_2_instances_name_reinstall(baserlib.R_Generic):
     return baserlib.SubmitJob(ops)
 
 
+class R_2_instances_name_replace_disks(baserlib.R_Generic):
+  """/2/instances/[instance_name]/replace-disks resource.
+
+  """
+  def POST(self):
+    """Replaces disks on an instance.
+
+    """
+    instance_name = self.items[0]
+    remote_node = self._checkStringVariable("remote_node", default=None)
+    mode = self._checkStringVariable("mode", default=None)
+    raw_disks = self._checkStringVariable("disks", default=None)
+    iallocator = self._checkStringVariable("iallocator", default=None)
+
+    if raw_disks:
+      try:
+        disks = [int(part) for part in raw_disks.split(",")]
+      except ValueError, err:
+        raise http.HttpBadRequest("Invalid disk index passed: %s" % str(err))
+    else:
+      disks = []
+
+    op = opcodes.OpReplaceDisks(instance_name=instance_name,
+                                remote_node=remote_node,
+                                mode=mode,
+                                disks=disks,
+                                iallocator=iallocator)
+
+    return baserlib.SubmitJob([op])
+
+
 class _R_Tags(baserlib.R_Generic):
   """ Quasiclass for tagging resources
 
-- 
GitLab