From 73452f12b205c2155bc5ce7350f6724c3679a4bb Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Thu, 30 Jul 2009 12:46:23 +0200
Subject: [PATCH] rapi: Add /2/[node_name]/evacuate resource

This can be used to evacuate a node.

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     | 19 +++++++++++++++++++
 3 files changed, 37 insertions(+)

diff --git a/doc/rapi.rst b/doc/rapi.rst
index a913b3215..b14b8f2a9 100644
--- a/doc/rapi.rst
+++ b/doc/rapi.rst
@@ -464,6 +464,22 @@ Example::
       ...
     ]
 
+``/2/nodes/[node_name]/evacuate``
++++++++++++++++++++++++++++++++++
+
+Evacuates all secondary instances off a node.
+
+It supports the following commands: ``POST``.
+
+``POST``
+~~~~~~~~
+
+To evacuate a node, either one of the ``iallocator`` or ``remote_node``
+parameters must be passed:
+
+    evacuate?iallocator=[iallocator]
+    evacuate?remote_node=[nodeX.example.com]
+
 ``/2/nodes/[node_name]/role``
 +++++++++++++++++++++++++++++
 
diff --git a/lib/rapi/connector.py b/lib/rapi/connector.py
index c3c12e6c7..1b9d64666 100644
--- a/lib/rapi/connector.py
+++ b/lib/rapi/connector.py
@@ -155,6 +155,8 @@ CONNECTOR.update({
   re.compile(r'^/2/nodes/([\w\._-]+)$'): rlib2.R_2_nodes_name,
   re.compile(r'^/2/nodes/([\w\._-]+)/tags$'): rlib2.R_2_nodes_name_tags,
   re.compile(r'^/2/nodes/([\w\._-]+)/role$'): rlib2.R_2_nodes_name_role,
+  re.compile(r'^/2/nodes/([\w\._-]+)/evacuate$'):
+      rlib2.R_2_nodes_name_evacuate,
   "/2/instances": rlib2.R_2_instances,
   re.compile(r'^/2/instances/([\w\._-]+)$'): rlib2.R_2_instances_name,
   re.compile(r'^/2/instances/([\w\._-]+)/tags$'): rlib2.R_2_instances_name_tags,
diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py
index 9c8e2a09f..9ef6247ab 100644
--- a/lib/rapi/rlib2.py
+++ b/lib/rapi/rlib2.py
@@ -261,6 +261,25 @@ class R_2_nodes_name_role(baserlib.R_Generic):
     return baserlib.SubmitJob([op])
 
 
+class R_2_nodes_name_evacuate(baserlib.R_Generic):
+  """/2/nodes/[node_name]/evacuate resource.
+
+  """
+  def POST(self):
+    """Evacuate all secondary instances off a node.
+
+    """
+    node_name = self.items[0]
+    remote_node = self._checkStringVariable("remote_node", default=None)
+    iallocator = self._checkStringVariable("iallocator", default=None)
+
+    op = opcodes.OpEvacuateNode(node_name=node_name,
+                                remote_node=remote_node,
+                                iallocator=iallocator)
+
+    return baserlib.SubmitJob([op])
+
+
 class R_2_instances(baserlib.R_Generic):
   """/2/instances resource.
 
-- 
GitLab