Commit e19ee6e4 authored by Iustin Pop's avatar Iustin Pop
Browse files

Remove the oneline output option in hbal



This was, AFAIK, never used, and complicates the output code enough
that it's better to remove it.
Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarMichael Hanselmann <hansmi@google.com>
parent 5dad2589
......@@ -61,7 +61,6 @@ module Ganeti.HTools.CLI
, oNoHeaders
, oNodeSim
, oOfflineNode
, oOneline
, oOutputDir
, oPrintCommands
, oPrintInsts
......@@ -127,7 +126,6 @@ data Options = Options
, optNoHeaders :: Bool -- ^ Do not show a header line
, optNodeSim :: [String] -- ^ Cluster simulation mode
, optOffline :: [String] -- ^ Names of offline nodes
, optOneline :: Bool -- ^ Switch output to a single line
, optOutPath :: FilePath -- ^ Path to the output directory
, optSaveCluster :: Maybe FilePath -- ^ Save cluster state to this file
, optShowCmds :: Maybe FilePath -- ^ Whether to show the command list
......@@ -167,7 +165,6 @@ defaultOptions = Options
, optNoHeaders = False
, optNodeSim = []
, optOffline = []
, optOneline = False
, optOutPath = "."
, optSaveCluster = Nothing
, optShowCmds = Nothing
......@@ -337,11 +334,6 @@ oOfflineNode = Option "O" ["offline"]
(ReqArg (\ n o -> Ok o { optOffline = n:optOffline o }) "NODE")
"set node as offline"
oOneline :: OptType
oOneline = Option "o" ["oneline"]
(NoArg (\ opts -> Ok opts { optOneline = True }))
"print the ganeti command list for reaching the solution"
oOutputDir :: OptType
oOutputDir = Option "d" ["output-dir"]
(ReqArg (\ d opts -> Ok opts { optOutPath = d }) "PATH")
......
......@@ -60,7 +60,6 @@ options =
[ oPrintNodes
, oPrintInsts
, oPrintCommands
, oOneline
, oDataFile
, oEvacMode
, oRapiMaster
......@@ -98,7 +97,6 @@ iterateDepth :: Cluster.Table -- ^ The starting table
-> Int -- ^ Max node name len
-> Int -- ^ Max instance name len
-> [MoveJob] -- ^ Current command list
-> Bool -- ^ Whether to be silent
-> Score -- ^ Score at which to stop
-> Score -- ^ Min gain limit
-> Score -- ^ Min score gain
......@@ -106,7 +104,7 @@ iterateDepth :: Cluster.Table -- ^ The starting table
-> IO (Cluster.Table, [MoveJob]) -- ^ The resulting table
-- and commands
iterateDepth ini_tbl max_rounds disk_moves inst_moves nmlen imlen
cmd_strs oneline min_score mg_limit min_gain evac_mode =
cmd_strs min_score mg_limit min_gain evac_mode =
let Cluster.Table ini_nl ini_il _ _ = ini_tbl
allowed_next = Cluster.doNextBalance ini_tbl max_rounds min_score
m_fin_tbl = if allowed_next
......@@ -125,20 +123,13 @@ iterateDepth ini_tbl max_rounds disk_moves inst_moves nmlen imlen
nmlen imlen cur_plc fin_plc_len
afn = Cluster.involvedNodes ini_il cur_plc
upd_cmd_strs = (afn, idx, move, cmds):cmd_strs
unless oneline $ do
putStrLn sol_line
hFlush stdout
putStrLn sol_line
hFlush stdout
iterateDepth fin_tbl max_rounds disk_moves inst_moves
nmlen imlen upd_cmd_strs oneline min_score
nmlen imlen upd_cmd_strs min_score
mg_limit min_gain evac_mode
Nothing -> return (ini_tbl, cmd_strs)
-- | Formats the solution for the oneline display.
formatOneline :: Double -> Int -> Double -> String
formatOneline ini_cv plc_len fin_cv =
printf "%.8f %d %.8f %8.3f" ini_cv plc_len fin_cv
(if fin_cv == 0 then 1 else ini_cv / fin_cv)
-- | Displays the cluster stats.
printStats :: Node.List -> Node.List -> IO ()
printStats ini_nl fin_nl = do
......@@ -324,12 +315,11 @@ selectGroup opts gl nlf ilf = do
Just cdata -> return (Group.name grp, cdata)
-- | Do a few checks on the cluster data.
checkCluster :: Bool -> Int -> Node.List -> Instance.List -> IO ()
checkCluster oneline verbose nl il = do
checkCluster :: Int -> Node.List -> Instance.List -> IO ()
checkCluster verbose nl il = do
-- nothing to do on an empty cluster
when (Container.null il) $ do
(if oneline then putStrLn $ formatOneline 0 0 0
else printf "Cluster is empty, exiting.\n")
printf "Cluster is empty, exiting.\n"::IO ()
exitWith ExitSuccess
-- hbal doesn't currently handle split clusters
......@@ -340,25 +330,25 @@ checkCluster oneline verbose nl il = do
hPutStrLn stderr "Aborting."
exitWith $ ExitFailure 1
unless oneline $ printf "Loaded %d nodes, %d instances\n"
printf "Loaded %d nodes, %d instances\n"
(Container.size nl)
(Container.size il)
(Container.size il)::IO ()
let csf = commonSuffix nl il
when (not (null csf) && not oneline && verbose > 1) $
when (not (null csf) && verbose > 1) $
printf "Note: Stripping common suffix of '%s' from names\n" csf
-- | Do a few checks on the selected group data.
checkGroup :: Bool -> Int -> String -> Node.List -> Instance.List -> IO ()
checkGroup oneline verbose gname nl il = do
unless oneline $ printf "Group size %d nodes, %d instances\n"
checkGroup :: Int -> String -> Node.List -> Instance.List -> IO ()
checkGroup verbose gname nl il = do
printf "Group size %d nodes, %d instances\n"
(Container.size nl)
(Container.size il)
(Container.size il)::IO ()
putStrLn $ "Selected node group: " ++ gname
let (bad_nodes, bad_instances) = Cluster.computeBadItems nl il
unless (oneline || verbose == 0) $ printf
unless (verbose == 0) $ printf
"Initial check done: %d bad nodes, %d bad instances.\n"
(length bad_nodes) (length bad_instances)
......@@ -370,13 +360,10 @@ checkGroup oneline verbose gname nl il = do
checkNeedRebalance :: Options -> Score -> IO ()
checkNeedRebalance opts ini_cv = do
let min_cv = optMinScore opts
oneline = optOneline opts
when (ini_cv < min_cv) $ do
(if oneline then
putStrLn $ formatOneline ini_cv 0 ini_cv
else printf "Cluster is already well balanced (initial score %.6g,\n\
\minimum score %.6g).\nNothing to do, exiting\n"
ini_cv min_cv)
printf "Cluster is already well balanced (initial score %.6g,\n\
\minimum score %.6g).\nNothing to do, exiting\n"
ini_cv min_cv:: IO ()
exitWith ExitSuccess
-- | Main function.
......@@ -389,24 +376,23 @@ main = do
hPutStrLn stderr "Error: this program doesn't take any arguments."
exitWith $ ExitFailure 1
let oneline = optOneline opts
verbose = optVerbose opts
let verbose = optVerbose opts
shownodes = optShowNodes opts
showinsts = optShowInsts opts
ini_cdata@(ClusterData gl fixed_nl ilf ctags) <- loadExternalData opts
when (not oneline && verbose > 1) $
when (verbose > 1) $
putStrLn $ "Loaded cluster tags: " ++ intercalate "," ctags
nlf <- setNodesStatus opts fixed_nl
checkCluster oneline verbose nlf ilf
checkCluster verbose nlf ilf
maybeSaveData (optSaveCluster opts) "original" "before balancing" ini_cdata
(gname, (nl, il)) <- selectGroup opts gl nlf ilf
checkGroup oneline verbose gname nl il
checkGroup verbose gname nl il
maybePrintInsts showinsts "Initial" (Cluster.printInsts nl il)
......@@ -418,20 +404,19 @@ main = do
checkNeedRebalance opts ini_cv
unless oneline (if verbose > 2 then
printf "Initial coefficients: overall %.8f, %s\n"
ini_cv (Cluster.printStats nl)
else
printf "Initial score: %.8f\n" ini_cv)
(if verbose > 2
then printf "Initial coefficients: overall %.8f, %s\n"
ini_cv (Cluster.printStats nl)::IO ()
else printf "Initial score: %.8f\n" ini_cv)
unless oneline $ putStrLn "Trying to minimize the CV..."
putStrLn "Trying to minimize the CV..."
let imlen = maximum . map (length . Instance.alias) $ Container.elems il
nmlen = maximum . map (length . Node.alias) $ Container.elems nl
(fin_tbl, cmd_strs) <- iterateDepth ini_tbl (optMaxLength opts)
(optDiskMoves opts)
(optInstMoves opts)
nmlen imlen [] oneline min_cv
nmlen imlen [] min_cv
(optMinGainLim opts) (optMinGain opts)
(optEvacMode opts)
let (Cluster.Table fin_nl fin_il fin_cv fin_plc) = fin_tbl
......@@ -445,9 +430,9 @@ main = do
printf "Cluster score improved from %.8f to %.8f\n"
ini_cv fin_cv ::String
unless oneline $ putStr sol_msg
putStr sol_msg
unless (oneline || verbose == 0) $
unless (verbose == 0) $
printf "Solution length=%d\n" (length ord_plc)
let cmd_jobs = Cluster.splitJobs cmd_strs
......@@ -464,7 +449,5 @@ main = do
when (verbose > 3) $ printStats nl fin_nl
when oneline $ putStrLn $ formatOneline ini_cv (length ord_plc) fin_cv
eval <- maybeExecJobs opts ord_plc fin_nl il cmd_jobs
unless eval (exitWith (ExitFailure 1))
......@@ -225,18 +225,6 @@ The options that can be passed to the program are as follows:
Prints the before and after instance map. This is less useful as the
node status, but it can help in understanding instance moves.
-o, --oneline
Only shows a one-line output from the program, designed for the case
when one wants to look at multiple clusters at once and check their
status.
The line will contain four fields:
- initial cluster score
- number of steps in the solution
- final cluster score
- improvement in the cluster score
-O *name*
This option (which can be given multiple times) will mark nodes as
being *offline*. This means a couple of things:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment