In some cases we do not want to migrate an instance off a node.
Add a function to change all OpMigrate to a corresponding OpFailover.
This will simplify the handling of such code.

Signed-off-by: Klaus Aehlig <[email protected]>
---
 src/Ganeti/Jobs.hs | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/Ganeti/Jobs.hs b/src/Ganeti/Jobs.hs
index 924ed56..642046b 100644
--- a/src/Ganeti/Jobs.hs
+++ b/src/Ganeti/Jobs.hs
@@ -40,10 +40,12 @@ module Ganeti.Jobs
   , execJobsWaitOk
   , execJobsWaitOkJid
   , waitForJobs
+  , forceFailover
   ) where
 
 import Control.Exception (bracket)
 import Control.Monad (void, forM)
+import Data.Functor.Identity (runIdentity)
 import Data.List
 import Data.Tuple
 import Data.IORef
@@ -196,3 +198,19 @@ execJobsWaitOkJid opcodes client = do
 execJobsWaitOk :: [[MetaOpCode]] -> L.Client -> IO (Result ())
 execJobsWaitOk opcodes =
   fmap void . execJobsWaitOkJid opcodes
+
+-- | Channge Migrations to Failovers
+forceFailover :: OpCode -> OpCode
+forceFailover op@(OpInstanceMigrate {}) = runIdentity $ do
+  timeout <- mkNonNegative C.defaultShutdownTimeout
+  return OpInstanceFailover { opInstanceName = opInstanceName op
+                            , opInstanceUuid = opInstanceUuid op
+                            , opShutdownTimeout = timeout
+                            , opIgnoreConsistency = True
+                            , opTargetNode = opTargetNode op
+                            , opTargetNodeUuid = opTargetNodeUuid op
+                            , opIgnoreIpolicy = opIgnoreIpolicy op
+                            , opMigrationCleanup = opMigrationCleanup op
+                            , opIallocator = opIallocator op
+                            }
+forceFailover op = op
-- 
2.5.0.rc2.392.g76e840b

Reply via email to