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