'gnt-instance migrate' supports performing a failover on an instance
that is not possible to migrate (e.g. if the instance is down). This
patch exposes this option ('--allow-failover') to the RAPI client.

Signed-off-by: Yiannis Tsiouris <[email protected]>
Signed-off-by: Alex Kiousis <[email protected]>
---
 lib/rapi/client.py                     |  6 +++++-
 test/py/ganeti.rapi.client_unittest.py | 23 +++++++++++++----------
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/lib/rapi/client.py b/lib/rapi/client.py
index 4f6c8b62b..5128936bf 100644
--- a/lib/rapi/client.py
+++ b/lib/rapi/client.py
@@ -1342,7 +1342,7 @@ class GanetiRapiClient(object): # pylint: disable=R0904
                               (GANETI_RAPI_VERSION, instance)), query, body)
 
   def MigrateInstance(self, instance, mode=None, cleanup=None,
-                      target_node=None, reason=None):
+                      target_node=None, reason=None, allow_failover=None):
     """Migrates an instance.
 
     @type instance: string
@@ -1355,6 +1355,9 @@ class GanetiRapiClient(object): # pylint: disable=R0904
     @param target_node: Target Node for externally mirrored instances
     @type reason: string
     @param reason: the reason for executing this operation
+    @type allow_failover: bool
+    @param allow_failover: Whether to fallback to failover if migration is not
+      possible
     @rtype: string
     @return: job id
 
@@ -1363,6 +1366,7 @@ class GanetiRapiClient(object): # pylint: disable=R0904
     _SetItemIf(body, mode is not None, "mode", mode)
     _SetItemIf(body, cleanup is not None, "cleanup", cleanup)
     _SetItemIf(body, target_node is not None, "target_node", target_node)
+    _SetItemIf(body, allow_failover is not None, "allow_failover", 
allow_failover)
 
     query = []
     _AppendReason(query, reason)
diff --git a/test/py/ganeti.rapi.client_unittest.py 
b/test/py/ganeti.rapi.client_unittest.py
index 9c534e5c6..0ddfdb4c4 100755
--- a/test/py/ganeti.rapi.client_unittest.py
+++ b/test/py/ganeti.rapi.client_unittest.py
@@ -781,17 +781,20 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
   def testMigrateInstance(self):
     for mode in constants.HT_MIGRATION_MODES:
       for cleanup in [False, True]:
-        self.rapi.AddResponse("31910")
-        job_id = self.client.MigrateInstance("inst289", mode=mode,
-                                             cleanup=cleanup)
-        self.assertEqual(job_id, 31910)
-        self.assertHandler(rlib2.R_2_instances_name_migrate)
-        self.assertItems(["inst289"])
+        for allow_failover in [False, True]:
+          self.rapi.AddResponse("31910")
+          job_id = self.client.MigrateInstance("inst289", mode=mode,
+                                               cleanup=cleanup,
+                                               allow_failover=allow_failover)
+          self.assertEqual(job_id, 31910)
+          self.assertHandler(rlib2.R_2_instances_name_migrate)
+          self.assertItems(["inst289"])
 
-        data = serializer.LoadJson(self.rapi.GetLastRequestData())
-        self.assertEqual(len(data), 2)
-        self.assertEqual(data["mode"], mode)
-        self.assertEqual(data["cleanup"], cleanup)
+          data = serializer.LoadJson(self.rapi.GetLastRequestData())
+          self.assertEqual(len(data), 3)
+          self.assertEqual(data["mode"], mode)
+          self.assertEqual(data["cleanup"], cleanup)
+          self.assertEqual(data["allow_failover"], allow_failover)
 
   def testFailoverInstanceDefaults(self):
     self.rapi.AddResponse("7639")
-- 
2.11.0

Reply via email to