{-
-Copyright (C) 2009, 2010, 2011 Google Inc.
+Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-}
-module Ganeti.HTools.Program.Hail (main) where
+module Ganeti.HTools.Program.Hail (main, options) where
import Control.Monad
+import Data.Maybe (fromMaybe, isJust)
import System.IO
-import qualified System
+import System.Exit
import qualified Ganeti.HTools.Cluster as Cluster
import Ganeti.HTools.CLI
import Ganeti.HTools.IAlloc
import Ganeti.HTools.Loader (Request(..), ClusterData(..))
-import Ganeti.HTools.ExtLoader (maybeSaveData)
+import Ganeti.HTools.ExtLoader (maybeSaveData, loadExternalData)
-- | Options list and functions.
options :: [OptType]
, oDataFile
, oNodeSim
, oVerbose
- , oShowVer
- , oShowHelp
]
--- | Main function.
-main :: IO ()
-main = do
- cmd_args <- System.getArgs
- (opts, args) <- parseOpts cmd_args "hail" options
+wrapReadRequest :: Options -> [String] -> IO Request
+wrapReadRequest opts args = do
+ when (null args) $ do
+ hPutStrLn stderr "Error: this program needs an input file."
+ exitWith $ ExitFailure 1
+
+ r1 <- readRequest (head args)
+ if isJust (optDataFile opts) || (not . null . optNodeSim) opts
+ then do
+ cdata <- loadExternalData opts
+ let Request rqt _ = r1
+ return $ Request rqt cdata
+ else return r1
+
+-- | Main function.
+main :: Options -> [String] -> IO ()
+main opts args = do
let shownodes = optShowNodes opts
verbose = optVerbose opts
savecluster = optSaveCluster opts
- request <- readRequest opts args
+ request <- wrapReadRequest opts args
let Request rq cdata = request
- when (verbose > 1) $
+ when (verbose > 1) .
hPutStrLn stderr $ "Received request: " ++ show rq
- when (verbose > 2) $
+ when (verbose > 2) .
hPutStrLn stderr $ "Received cluster data: " ++ show cdata
maybePrintNodes shownodes "Initial cluster"
maybeSaveData savecluster "pre-ialloc" "before iallocator run" cdata
let (maybe_ni, resp) = runIAllocator request
- (fin_nl, fin_il) = maybe (cdNodes cdata, cdInstances cdata) id maybe_ni
+ (fin_nl, fin_il) = fromMaybe (cdNodes cdata, cdInstances cdata) maybe_ni
putStrLn resp
maybePrintNodes shownodes "Final cluster" (Cluster.printNodes fin_nl)