rapi: Add /2/instances/[instance_name]/replace-disks resource
authorMichael Hanselmann <hansmi@google.com>
Thu, 13 Aug 2009 11:43:48 +0000 (13:43 +0200)
committerMichael Hanselmann <hansmi@google.com>
Thu, 13 Aug 2009 11:49:39 +0000 (13:49 +0200)
Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

doc/rapi.rst
lib/rapi/connector.py
lib/rapi/rlib2.py

index 9d95c81..1a9294d 100644 (file)
@@ -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``
 +++++++++++++++++++++++++++++++++++++
 
index 59621a9..d82780b 100644 (file)
@@ -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$'):
index 7042974..3a398a5 100644 (file)
@@ -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