htools: read the disk template in Luxi and Rapi
[ganeti-local] / htools / Ganeti / HTools / CLI.hs
index effb8d6..dd0d392 100644 (file)
@@ -1,8 +1,8 @@
 {-| Implementation of command-line functions.
 
-This module holds the common cli-related functions for the binaries,
-separated into this module since Utils.hs is used in many other places
-and this is more IO oriented.
+This module holds the common command-line related functions for the
+binaries, separated into this module since "Ganeti.HTools.Utils" is
+used in many other places and this is more IO oriented.
 
 -}
 
@@ -38,6 +38,8 @@ module Ganeti.HTools.CLI
     -- * The options
     , oDataFile
     , oDiskMoves
+    , oSelInst
+    , oInstMoves
     , oDynuFile
     , oEvacMode
     , oExInst
@@ -65,6 +67,7 @@ module Ganeti.HTools.CLI
     , oPrintNodes
     , oQuiet
     , oRapiMaster
+    , oReplay
     , oSaveCluster
     , oShowHelp
     , oShowVer
@@ -72,9 +75,9 @@ module Ganeti.HTools.CLI
     , oVerbose
     ) where
 
+import Control.Monad
 import Data.Maybe (fromMaybe)
 import qualified Data.Version
-import Monad
 import System.Console.GetOpt
 import System.IO
 import System.Info
@@ -86,20 +89,28 @@ import qualified Ganeti.Constants as C
 import Ganeti.HTools.Types
 import Ganeti.HTools.Utils
 
--- | The default value for the luxi socket
+-- * Constants
+
+-- | The default value for the luxi socket.
+--
+-- This is re-exported from the "Ganeti.Constants" module.
 defaultLuxiSocket :: FilePath
 defaultLuxiSocket = C.masterSocket
 
+-- * Data types
+
 -- | Command line options structure.
 data Options = Options
     { optDataFile    :: Maybe FilePath -- ^ Path to the cluster data file
     , optDiskMoves   :: Bool           -- ^ Allow disk moves
+    , optInstMoves   :: Bool           -- ^ Allow instance moves
     , optDynuFile    :: Maybe FilePath -- ^ Optional file with dynamic use data
     , optEvacMode    :: Bool           -- ^ Enable evacuation mode
     , optExInst      :: [String]       -- ^ Instances to be excluded
     , optExTags      :: Maybe [String] -- ^ Tags to use for exclusion
     , optExecJobs    :: Bool           -- ^ Execute the commands via Luxi
     , optGroup       :: Maybe GroupID  -- ^ The UUID of the group to process
+    , optSelInst     :: [String]       -- ^ Instances to be excluded
     , optINodes      :: Int            -- ^ Nodes required for an instance
     , optISpec       :: RSpec          -- ^ Requested instance specs
     , optLuxi        :: Maybe FilePath -- ^ Collect data from Luxi
@@ -122,6 +133,7 @@ data Options = Options
     , optShowNodes   :: Maybe [String] -- ^ Whether to show node status
     , optShowVer     :: Bool           -- ^ Just show the program version
     , optTieredSpec  :: Maybe RSpec    -- ^ Requested specs for tiered mode
+    , optReplay      :: Maybe String   -- ^ Unittests: RNG state
     , optVerbose     :: Int            -- ^ Verbosity level
     } deriving Show
 
@@ -130,12 +142,14 @@ defaultOptions :: Options
 defaultOptions  = Options
  { optDataFile    = Nothing
  , optDiskMoves   = True
+ , optInstMoves   = True
  , optDynuFile    = Nothing
  , optEvacMode    = False
  , optExInst      = []
  , optExTags      = Nothing
  , optExecJobs    = False
  , optGroup       = Nothing
+ , optSelInst     = []
  , optINodes      = 2
  , optISpec       = RSpec 1 4096 102400
  , optLuxi        = Nothing
@@ -158,12 +172,15 @@ defaultOptions  = Options
  , optShowNodes   = Nothing
  , optShowVer     = False
  , optTieredSpec  = Nothing
+ , optReplay      = Nothing
  , optVerbose     = 1
  }
 
--- | Abrreviation for the option type
+-- | Abrreviation for the option type.
 type OptType = OptDescr (Options -> Result Options)
 
+-- * Command line options
+
 oDataFile :: OptType
 oDataFile = Option "t" ["text-data"]
             (ReqArg (\ f o -> Ok o { optDataFile = Just f }) "FILE")
@@ -175,6 +192,18 @@ oDiskMoves = Option "" ["no-disk-moves"]
              "disallow disk moves from the list of allowed instance changes,\
              \ thus allowing only the 'cheap' failover/migrate operations"
 
+oSelInst :: OptType
+oSelInst = Option "" ["select-instances"]
+          (ReqArg (\ f opts -> Ok opts { optSelInst = sepSplit ',' f }) "INSTS")
+          "only select given instances for any moves"
+
+oInstMoves :: OptType
+oInstMoves = Option "" ["no-instance-moves"]
+             (NoArg (\ opts -> Ok opts { optInstMoves = False}))
+             "disallow instance (primary node) moves from the list of allowed,\
+             \ instance changes, thus allowing only slower, but sometimes\
+             \ safer, drbd secondary changes"
+
 oDynuFile :: OptType
 oDynuFile = Option "U" ["dynu-file"]
             (ReqArg (\ f opts -> Ok opts { optDynuFile = Just f }) "FILE")
@@ -189,7 +218,7 @@ oEvacMode = Option "E" ["evac-mode"]
 oExInst :: OptType
 oExInst = Option "" ["exclude-instances"]
           (ReqArg (\ f opts -> Ok opts { optExInst = sepSplit ',' f }) "INSTS")
-          "exclude given instances  from any moves"
+          "exclude given instances from any moves"
 
 oExTags :: OptType
 oExTags = Option "" ["exclusion-tags"]
@@ -363,18 +392,25 @@ oTieredSpec = Option "" ["tiered-alloc"]
               "TSPEC")
              "enable tiered specs allocation, given as 'disk,ram,cpu'"
 
+oReplay :: OptType
+oReplay = Option "" ["replay"]
+          (ReqArg (\ stat opts -> Ok opts { optReplay = Just stat } ) "STATE")
+          "Pre-seed the random number generator with STATE"
+
 oVerbose :: OptType
 oVerbose = Option "v" ["verbose"]
            (NoArg (\ opts -> Ok opts { optVerbose = optVerbose opts + 1 }))
            "increase the verbosity level"
 
--- | Usage info
+-- * Functions
+
+-- | Usage info.
 usageHelp :: String -> [OptType] -> String
 usageHelp progname =
     usageInfo (printf "%s %s\nUsage: %s [OPTION...]"
                progname Version.version progname)
 
--- | Command line parser, using the 'options' structure.
+-- | Command line parser, using the 'Options' structure.
 parseOpts :: [String]               -- ^ The command line arguments
           -> String                 -- ^ The program name
           -> [OptType]              -- ^ The supported command line options