module Ganeti.HTools.Program.Hail
( main
, options
, arguments
) where
import Control.Monad
import Data.Maybe (fromMaybe, isJust)
import System.IO
import qualified Ganeti.HTools.Cluster as Cluster
import Ganeti.Common
import Ganeti.HTools.CLI
import Ganeti.HTools.Backend.IAlloc
import Ganeti.HTools.Loader (Request(..), ClusterData(..))
import Ganeti.HTools.ExtLoader (maybeSaveData, loadExternalData
, queryAllMonDDCs)
import Ganeti.Utils
options :: IO [OptType]
options =
return
[ oPrintNodes
, oSaveCluster
, oDataFile
, oNodeSim
, oVerbose
, oIgnoreDyn
, oMonD
]
arguments :: [ArgCompletion]
arguments = [ArgCompletion OptComplFile 1 (Just 1)]
wrapReadRequest :: Options -> [String] -> IO Request
wrapReadRequest opts args = do
r1 <- case args of
[] -> exitErr "This program needs an input file."
_:_:_ -> exitErr "Only one argument is accepted (the input file)"
x:_ -> readRequest x
if isJust (optDataFile opts) || (not . null . optNodeSim) opts
then do
cdata <- loadExternalData opts
let Request rqt _ = r1
return $ Request rqt cdata
else do
let Request rqt cdata = r1
cdata' <-
if optMonD opts then queryAllMonDDCs cdata opts else return cdata
return $ Request rqt cdata'
main :: Options -> [String] -> IO ()
main opts args = do
let shownodes = optShowNodes opts
verbose = optVerbose opts
savecluster = optSaveCluster opts
request <- wrapReadRequest opts args
let Request rq cdata = request
when (verbose > 1) .
hPutStrLn stderr $ "Received request: " ++ show rq
when (verbose > 2) .
hPutStrLn stderr $ "Received cluster data: " ++ show cdata
maybePrintNodes shownodes "Initial cluster"
(Cluster.printNodes (cdNodes cdata))
maybeSaveData savecluster "pre-ialloc" "before iallocator run" cdata
let (maybe_ni, resp) = runIAllocator request
(fin_nl, fin_il) = fromMaybe (cdNodes cdata, cdInstances cdata) maybe_ni
putStrLn resp
maybePrintNodes shownodes "Final cluster" (Cluster.printNodes fin_nl)
maybeSaveData savecluster "post-ialloc" "after iallocator run"
(cdata { cdNodes = fin_nl, cdInstances = fin_il})