Support --dry-run in harep
authorKlaus Aehlig <aehlig@google.com>
Wed, 2 Dec 2015 16:20:46 +0000 (17:20 +0100)
committerKlaus Aehlig <aehlig@google.com>
Mon, 7 Dec 2015 10:47:58 +0000 (11:47 +0100)
Add a --dry-run option to harep, so that users can verify
that the actions taken by harep are the ones they want.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Lisa Velden <velden@google.com>

src/Ganeti/HTools/Program/Harep.hs

index 54628b0..8ad7deb 100644 (file)
@@ -48,6 +48,7 @@ import Data.Maybe
 import Data.Ord
 import System.Time
 import qualified Data.Map as Map
+import qualified Text.JSON as J
 
 import Ganeti.BasicTypes
 import Ganeti.Common
@@ -84,6 +85,7 @@ options = do
     [ luxi
     , oJobDelay
     , oReason
+    , oDryRun
     ]
 
 arguments :: [ArgCompletion]
@@ -288,7 +290,7 @@ commitChange opts client instData = do
   let iname = Instance.name $ arInstance instData
       arData = getArData $ arState instData
       rmTags = tagsToRemove instData
-      execJobsWaitOk' opcodes = do
+      execJobsWaitOk' opcodes = unless (optDryRun opts) $ do
         res <- execJobsWaitOk
                  [map (annotateOpCode (optReason opts) now) opcodes] client
         case res of
@@ -401,6 +403,17 @@ detectBroken nl inst =
      _ -> Nothing  -- Other cases are unimplemented for now: DTDiskless,
                    -- DTFile, DTSharedFile, DTBlock, DTRbd, DTExt.
 
+-- | Submit jobs, unless a dry-run is requested; in this case, just report
+-- the job that would be submitted.
+submitJobs' :: Options -> [[MetaOpCode]] -> L.Client -> IO (Result [JobId])
+submitJobs' opts jobs client =
+  if optDryRun opts
+    then do
+      putStrLn . (++) "jobs: " . J.encode $ map (map metaOpCode) jobs
+      return $ Ok []
+    else
+      submitJobs jobs client
+
 -- | Perform the suggested repair on an instance if its policy allows it.
 doRepair :: Options
          -> L.Client     -- ^ The Luxi client
@@ -467,8 +480,10 @@ doRepair opts client delay instData (rtype, opcodes) =
 
         uuid <- newUUID
         time <- getClockTime
-        jids <- submitJobs [map (annotateOpCode (optReason opts) now) opcodes']
-                           client
+        jids <- submitJobs'
+                  opts
+                  [map (annotateOpCode (optReason opts) now) opcodes']
+                  client
 
         case jids of
           Bad e    -> exitErr e