58 |
58 |
, oMinDisk
|
59 |
59 |
, oDiskMoves
|
60 |
60 |
, oDynuFile
|
|
61 |
, oTieredSpec
|
61 |
62 |
, oShowVer
|
62 |
63 |
, oShowHelp
|
63 |
64 |
) where
|
... | ... | |
73 |
74 |
|
74 |
75 |
import qualified Ganeti.HTools.Version as Version(version)
|
75 |
76 |
import Ganeti.HTools.Types
|
|
77 |
import Ganeti.HTools.Utils
|
76 |
78 |
|
77 |
79 |
-- | The default value for the luxi socket
|
78 |
80 |
defaultLuxiSocket :: FilePath
|
... | ... | |
80 |
82 |
|
81 |
83 |
-- | Command line options structure.
|
82 |
84 |
data Options = Options
|
83 |
|
{ optShowNodes :: Bool -- ^ Whether to show node status
|
84 |
|
, optShowInsts :: Bool -- ^ Whether to show the instance map
|
85 |
|
, optShowCmds :: Maybe FilePath -- ^ Whether to show the command list
|
86 |
|
, optOneline :: Bool -- ^ Switch output to a single line
|
87 |
|
, optOutPath :: FilePath -- ^ Path to the output directory
|
88 |
|
, optNoHeaders :: Bool -- ^ Do not show a header line
|
89 |
|
, optNodeFile :: FilePath -- ^ Path to the nodes file
|
90 |
|
, optNodeSet :: Bool -- ^ The nodes have been set by options
|
91 |
|
, optInstFile :: FilePath -- ^ Path to the instances file
|
92 |
|
, optInstSet :: Bool -- ^ The insts have been set by options
|
93 |
|
, optNodeSim :: Maybe String -- ^ Cluster simulation mode
|
94 |
|
, optMaxLength :: Int -- ^ Stop after this many steps
|
95 |
|
, optMaster :: String -- ^ Collect data from RAPI
|
96 |
|
, optLuxi :: Maybe FilePath -- ^ Collect data from Luxi
|
97 |
|
, optExecJobs :: Bool -- ^ Execute the commands via Luxi
|
98 |
|
, optOffline :: [String] -- ^ Names of offline nodes
|
99 |
|
, optIMem :: Int -- ^ Instance memory
|
100 |
|
, optIDsk :: Int -- ^ Instance disk
|
101 |
|
, optIVCPUs :: Int -- ^ Instance VCPUs
|
102 |
|
, optINodes :: Int -- ^ Nodes required for an instance
|
103 |
|
, optMinScore :: Score -- ^ The minimum score we aim for
|
104 |
|
, optMcpu :: Double -- ^ Max cpu ratio for nodes
|
105 |
|
, optMdsk :: Double -- ^ Max disk usage ratio for nodes
|
106 |
|
, optDiskMoves :: Bool -- ^ Allow disk moves
|
107 |
|
, optDynuFile :: Maybe FilePath -- ^ Optional file with dynamic use data
|
108 |
|
, optVerbose :: Int -- ^ Verbosity level
|
109 |
|
, optShowVer :: Bool -- ^ Just show the program version
|
110 |
|
, optShowHelp :: Bool -- ^ Just show the help
|
|
85 |
{ optShowNodes :: Bool -- ^ Whether to show node status
|
|
86 |
, optShowInsts :: Bool -- ^ Whether to show the instance map
|
|
87 |
, optShowCmds :: Maybe FilePath -- ^ Whether to show the command list
|
|
88 |
, optOneline :: Bool -- ^ Switch output to a single line
|
|
89 |
, optOutPath :: FilePath -- ^ Path to the output directory
|
|
90 |
, optNoHeaders :: Bool -- ^ Do not show a header line
|
|
91 |
, optNodeFile :: FilePath -- ^ Path to the nodes file
|
|
92 |
, optNodeSet :: Bool -- ^ The nodes have been set by options
|
|
93 |
, optInstFile :: FilePath -- ^ Path to the instances file
|
|
94 |
, optInstSet :: Bool -- ^ The insts have been set by options
|
|
95 |
, optNodeSim :: Maybe String -- ^ Cluster simulation mode
|
|
96 |
, optMaxLength :: Int -- ^ Stop after this many steps
|
|
97 |
, optMaster :: String -- ^ Collect data from RAPI
|
|
98 |
, optLuxi :: Maybe FilePath -- ^ Collect data from Luxi
|
|
99 |
, optExecJobs :: Bool -- ^ Execute the commands via Luxi
|
|
100 |
, optOffline :: [String] -- ^ Names of offline nodes
|
|
101 |
, optINodes :: Int -- ^ Nodes required for an instance
|
|
102 |
, optISpec :: RSpec -- ^ Requested instance specs
|
|
103 |
, optTieredSpec :: Maybe RSpec -- ^ Requested specs for tiered mode
|
|
104 |
, optMinScore :: Score -- ^ The minimum score we aim for
|
|
105 |
, optMcpu :: Double -- ^ Max cpu ratio for nodes
|
|
106 |
, optMdsk :: Double -- ^ Max disk usage ratio for nodes
|
|
107 |
, optDiskMoves :: Bool -- ^ Allow disk moves
|
|
108 |
, optDynuFile :: Maybe FilePath -- ^ Optional file with dynamic use data
|
|
109 |
, optVerbose :: Int -- ^ Verbosity level
|
|
110 |
, optShowVer :: Bool -- ^ Just show the program version
|
|
111 |
, optShowHelp :: Bool -- ^ Just show the help
|
111 |
112 |
} deriving Show
|
112 |
113 |
|
113 |
114 |
-- | Default values for the command line options.
|
114 |
115 |
defaultOptions :: Options
|
115 |
116 |
defaultOptions = Options
|
116 |
|
{ optShowNodes = False
|
117 |
|
, optShowInsts = False
|
118 |
|
, optShowCmds = Nothing
|
119 |
|
, optOneline = False
|
120 |
|
, optNoHeaders = False
|
121 |
|
, optOutPath = "."
|
122 |
|
, optNodeFile = "nodes"
|
123 |
|
, optNodeSet = False
|
124 |
|
, optInstFile = "instances"
|
125 |
|
, optInstSet = False
|
126 |
|
, optNodeSim = Nothing
|
127 |
|
, optMaxLength = -1
|
128 |
|
, optMaster = ""
|
129 |
|
, optLuxi = Nothing
|
130 |
|
, optExecJobs = False
|
131 |
|
, optOffline = []
|
132 |
|
, optIMem = 4096
|
133 |
|
, optIDsk = 102400
|
134 |
|
, optIVCPUs = 1
|
135 |
|
, optINodes = 2
|
136 |
|
, optMinScore = 1e-9
|
137 |
|
, optMcpu = -1
|
138 |
|
, optMdsk = -1
|
139 |
|
, optDiskMoves = True
|
140 |
|
, optDynuFile = Nothing
|
141 |
|
, optVerbose = 1
|
142 |
|
, optShowVer = False
|
143 |
|
, optShowHelp = False
|
|
117 |
{ optShowNodes = False
|
|
118 |
, optShowInsts = False
|
|
119 |
, optShowCmds = Nothing
|
|
120 |
, optOneline = False
|
|
121 |
, optNoHeaders = False
|
|
122 |
, optOutPath = "."
|
|
123 |
, optNodeFile = "nodes"
|
|
124 |
, optNodeSet = False
|
|
125 |
, optInstFile = "instances"
|
|
126 |
, optInstSet = False
|
|
127 |
, optNodeSim = Nothing
|
|
128 |
, optMaxLength = -1
|
|
129 |
, optMaster = ""
|
|
130 |
, optLuxi = Nothing
|
|
131 |
, optExecJobs = False
|
|
132 |
, optOffline = []
|
|
133 |
, optINodes = 2
|
|
134 |
, optISpec = RSpec 1 4096 102400
|
|
135 |
, optTieredSpec = Nothing
|
|
136 |
, optMinScore = 1e-9
|
|
137 |
, optMcpu = -1
|
|
138 |
, optMdsk = -1
|
|
139 |
, optDiskMoves = True
|
|
140 |
, optDynuFile = Nothing
|
|
141 |
, optVerbose = 1
|
|
142 |
, optShowVer = False
|
|
143 |
, optShowHelp = False
|
144 |
144 |
}
|
145 |
145 |
|
146 |
146 |
-- | Abrreviation for the option type
|
... | ... | |
242 |
242 |
|
243 |
243 |
oIMem :: OptType
|
244 |
244 |
oIMem = Option "" ["memory"]
|
245 |
|
(ReqArg (\ m opts -> Ok opts { optIMem = read m }) "MEMORY")
|
|
245 |
(ReqArg (\ m opts ->
|
|
246 |
let ospec = optISpec opts
|
|
247 |
nspec = ospec { rspecMem = read m }
|
|
248 |
in Ok opts { optISpec = nspec }) "MEMORY")
|
246 |
249 |
"memory size for instances"
|
247 |
250 |
|
248 |
251 |
oIDisk :: OptType
|
249 |
252 |
oIDisk = Option "" ["disk"]
|
250 |
|
(ReqArg (\ d opts -> Ok opts { optIDsk = read d }) "DISK")
|
|
253 |
(ReqArg (\ d opts ->
|
|
254 |
let ospec = optISpec opts
|
|
255 |
nspec = ospec { rspecDsk = read d }
|
|
256 |
in Ok opts { optISpec = nspec }) "DISK")
|
251 |
257 |
"disk size for instances"
|
252 |
258 |
|
253 |
259 |
oIVcpus :: OptType
|
254 |
260 |
oIVcpus = Option "" ["vcpus"]
|
255 |
|
(ReqArg (\ p opts -> Ok opts { optIVCPUs = read p }) "NUM")
|
|
261 |
(ReqArg (\ p opts ->
|
|
262 |
let ospec = optISpec opts
|
|
263 |
nspec = ospec { rspecCpu = read p }
|
|
264 |
in Ok opts { optISpec = nspec }) "NUM")
|
256 |
265 |
"number of virtual cpus for instances"
|
257 |
266 |
|
258 |
267 |
oINodes :: OptType
|
... | ... | |
281 |
290 |
(ReqArg (\ f opts -> Ok opts { optDynuFile = Just f }) "FILE")
|
282 |
291 |
"Import dynamic utilisation data from the given FILE"
|
283 |
292 |
|
|
293 |
oTieredSpec :: OptType
|
|
294 |
oTieredSpec = Option "" ["tiered-alloc"]
|
|
295 |
(ReqArg (\ inp opts -> do
|
|
296 |
let sp = sepSplit ',' inp
|
|
297 |
prs <- mapM (tryRead "tiered specs") sp
|
|
298 |
tspec <-
|
|
299 |
case prs of
|
|
300 |
[cpu, ram, dsk] -> return $ RSpec cpu ram dsk
|
|
301 |
_ -> Bad $ "Invalid specification: " ++ inp
|
|
302 |
return $ opts { optTieredSpec = Just tspec } )
|
|
303 |
"TSPEC")
|
|
304 |
"enable tiered specs allocation, where we decrease the instance\
|
|
305 |
\ spec on failure to allocate and restart the allocation process"
|
|
306 |
|
284 |
307 |
oShowVer :: OptType
|
285 |
308 |
oShowVer = Option "V" ["version"]
|
286 |
309 |
(NoArg (\ opts -> Ok opts { optShowVer = True}))
|