diff --git a/htools/Ganeti/HTools/CLI.hs b/htools/Ganeti/HTools/CLI.hs index 442fd432616bf2cb3402264aa9f552f4d9e7788c..4e801fd3d04289ed689c8050a35be7d7981abee8 100644 --- a/htools/Ganeti/HTools/CLI.hs +++ b/htools/Ganeti/HTools/CLI.hs @@ -134,7 +134,7 @@ data Options = Options , optShowInsts :: Bool -- ^ Whether to show the instance map , optShowNodes :: Maybe [String] -- ^ Whether to show node status , optShowVer :: Bool -- ^ Just show the program version - , optStdSpec :: RSpec -- ^ Requested standard specs + , optStdSpec :: Maybe RSpec -- ^ Requested standard specs , optTieredSpec :: Maybe RSpec -- ^ Requested specs for tiered mode , optReplay :: Maybe String -- ^ Unittests: RNG state , optVerbose :: Int -- ^ Verbosity level @@ -173,7 +173,7 @@ defaultOptions = Options , optShowInsts = False , optShowNodes = Nothing , optShowVer = False - , optStdSpec = RSpec 1 4096 102400 + , optStdSpec = Nothing , optTieredSpec = Nothing , optReplay = Nothing , optVerbose = 1 @@ -383,7 +383,7 @@ oStdSpec :: OptType oStdSpec = Option "" ["standard-alloc"] (ReqArg (\ inp opts -> do tspec <- parseISpecString "standard" inp - return $ opts { optStdSpec = tspec } ) + return $ opts { optStdSpec = Just tspec } ) "STDSPEC") "enable standard specs allocation, given as 'disk,ram,cpu'" diff --git a/htools/Ganeti/HTools/Program/Hspace.hs b/htools/Ganeti/HTools/Program/Hspace.hs index e5185c3ec896653de23b4da73bf8ce3b2b430a21..f1f281bbd9b23f2f20c7c5e61eafd749efd1f97f 100644 --- a/htools/Ganeti/HTools/Program/Hspace.hs +++ b/htools/Ganeti/HTools/Program/Hspace.hs @@ -29,6 +29,7 @@ import Control.Monad import Data.Char (toUpper, isAlphaNum, toLower) import Data.Function (on) import Data.List +import Data.Maybe (fromMaybe) import Data.Ord (comparing) import System.Exit import System.IO @@ -398,12 +399,11 @@ main = do exitWith $ ExitFailure 1 let verbose = optVerbose opts - ispec = optStdSpec opts disk_template = optDiskTemplate opts req_nodes = Instance.requiredNodes disk_template machine_r = optMachineReadable opts - orig_cdata@(ClusterData gl fixed_nl il _ _) <- loadExternalData opts + orig_cdata@(ClusterData gl fixed_nl il _ ipol) <- loadExternalData opts nl <- setNodeStatus opts fixed_nl let num_instances = Container.size il @@ -431,21 +431,24 @@ main = do allocnodes <- exitIfBad $ Cluster.genAllocNodes gl nl req_nodes True - -- Run the tiered allocation, if enabled + -- Run the tiered allocation - case optTieredSpec opts of - Nothing -> return () - Just tspec -> do - (treason, trl_nl, _, spec_map) <- - runAllocation cdata stop_allocation - (Cluster.tieredAlloc nl il alloclimit - (instFromSpec tspec disk_template) allocnodes [] []) - tspec SpecTiered opts + let tspec = fromMaybe (rspecFromISpec (iPolicyMaxSpec ipol)) + (optTieredSpec opts) - printTiered machine_r spec_map (optMcpu opts) nl trl_nl treason + (treason, trl_nl, _, spec_map) <- + runAllocation cdata stop_allocation + (Cluster.tieredAlloc nl il alloclimit + (instFromSpec tspec disk_template) allocnodes [] []) + tspec SpecTiered opts + + printTiered machine_r spec_map (optMcpu opts) nl trl_nl treason -- Run the standard (avg-mode) allocation + let ispec = fromMaybe (rspecFromISpec (iPolicyStdSpec ipol)) + (optStdSpec opts) + (sreason, fin_nl, allocs, _) <- runAllocation cdata stop_allocation (Cluster.iterateAlloc nl il alloclimit @@ -454,4 +457,6 @@ main = do printResults machine_r nl fin_nl num_instances allocs sreason + -- Print final result + printFinal machine_r diff --git a/man/hspace.rst b/man/hspace.rst index 70f55c0e985230724762ad90f4b71bc256bc538d..a4878340933b9cfc97738a74e497c06514b95de0 100644 --- a/man/hspace.rst +++ b/man/hspace.rst @@ -44,7 +44,6 @@ Output options: DESCRIPTION ----------- - hspace computes how many additional instances can be fit on a cluster, while maintaining N+1 status. @@ -61,6 +60,10 @@ it is intended to interpreted as a shell fragment (or parsed as a output the additional information on stderr (such that the stdout is still parseable). +By default, the instance specifications will be read from the cluster; +the options ``--standard-alloc`` and ``--tiered-alloc`` can be used to +override them. + The following keys are available in the machine-readable output of the script (all prefixed with *HTS_*): @@ -132,14 +135,13 @@ INI_MNODE_DSK_AVAIL, FIN_MNODE_DSK_AVAIL Like the above but for disk. TSPEC - If the tiered allocation mode has been enabled, this parameter holds - the pairs of specifications and counts of instances that can be - created in this mode. The value of the key is a space-separated list - of values; each value is of the form *memory,disk,vcpu=count* where - the memory, disk and vcpu are the values for the current spec, and - count is how many instances of this spec can be created. A complete - value for this variable could be: **4096,102400,2=225 - 2560,102400,2=20 512,102400,2=21**. + This parameter holds the pairs of specifications and counts of + instances that can be created in the *tiered allocation* mode. The + value of the key is a space-separated list of values; each value is of + the form *memory,disk,vcpu=count* where the memory, disk and vcpu are + the values for the current spec, and count is how many instances of + this spec can be created. A complete value for this variable could be: + **4096,102400,2=225 2560,102400,2=20 512,102400,2=21**. KM_USED_CPU, KM_USED_NPU, KM_USED_MEM, KM_USED_DSK These represents the metrics of used resources at the start of the @@ -189,9 +191,8 @@ OK that the computation failed and any values present should not be relied upon. -If the tiered allocation mode is enabled, then many of the INI_/FIN_ -metrics will be also displayed with a TRL_ prefix, and denote the -cluster status at the end of the tiered allocation run. +Many of the INI_/FIN_ metrics will be also displayed with a TRL_ prefix, +and denote the cluster status at the end of the tiered allocation run. The human output format should be self-explanatory, so it is not described further. @@ -274,9 +275,9 @@ The options that can be passed to the program are as follows: about the description, see the man page **htools**(1). --standard-alloc *disk,ram,cpu* - This option specifies the instance size for the *standard* allocation - mode, where we simply allocate instances of the same, fixed size until - the cluster runs out of space. + This option overrides the instance size read from the cluster for the + *standard* allocation mode, where we simply allocate instances of the + same, fixed size until the cluster runs out of space. The specification given is similar to the *--simulate* option and it holds: @@ -289,19 +290,19 @@ The options that can be passed to the program are as follows: specification of 100GB of disk space, 4GiB of memory and 2 VCPUs. --tiered-alloc *disk,ram,cpu* - Besides the standard, fixed-size allocation, also do a tiered - allocation scheme where the algorithm starts from the given - specification and allocates until there is no more space; then it - decreases the specification and tries the allocation again. The - decrease is done on the metric that last failed during allocation. The - argument should have the same format as for ``-standard-alloc``. + This option overrides the instance size for the *tiered* allocation + mode. In this mode, the algorithm starts from the given specification + and allocates until there is no more space; then it decreases the + specification and tries the allocation again. The decrease is done on + the metric that last failed during allocation. The argument should + have the same format as for ``--standard-alloc``. Also note that the normal allocation and the tiered allocation are independent, and both start from the initial cluster state; as such, the instance count for these two modes are not related one to another. ---machines-readable[=*choice*] +--machine-readable[=*choice*] By default, the output of the program is in "human-readable" format, i.e. text descriptions. By passing this flag you can either enable (``--machine-readable`` or ``--machine-readable=yes``) or explicitly