X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/262a08a2d2cd645032016de106af6eb9c20849d9..0c936d24dccef20cdca0b5fb96c786731e284173:/hbal.hs diff --git a/hbal.hs b/hbal.hs index 5f0f28b..8eb6ee0 100644 --- a/hbal.hs +++ b/hbal.hs @@ -1,4 +1,25 @@ -{-| Solver for N+1 cluster errors +{-| Cluster rebalancer + +-} + +{- + +Copyright (C) 2009 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 +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. -} @@ -36,6 +57,8 @@ data Options = Options , optVerbose :: Int -- ^ Verbosity level , optOffline :: [String] -- ^ Names of offline nodes , optMinScore :: Cluster.Score -- ^ The minimum score we aim for + , optMcpu :: Double -- ^ Max cpu ratio for nodes + , optMdsk :: Double -- ^ Max disk usage ratio for nodes , optShowVer :: Bool -- ^ Just show the program version , optShowHelp :: Bool -- ^ Just show the help } deriving Show @@ -67,6 +90,8 @@ defaultOptions = Options , optVerbose = 1 , optOffline = [] , optMinScore = 1e-9 + , optMcpu = -1 + , optMdsk = -1 , optShowVer = False , optShowHelp = False } @@ -111,6 +136,12 @@ options = , Option ['e'] ["min-score"] (ReqArg (\ e opts -> opts { optMinScore = read e }) "EPSILON") " mininum score to aim for" + , Option [] ["max-cpu"] + (ReqArg (\ n opts -> opts { optMcpu = read n }) "RATIO") + "maximum virtual-to-physical cpu ratio for nodes" + , Option [] ["min-disk"] + (ReqArg (\ n opts -> opts { optMdsk = read n }) "RATIO") + "minimum free disk space for nodes (between 0 and 1)" , Option ['V'] ["version"] (NoArg (\ opts -> opts { optShowVer = True})) "show the version of the program" @@ -189,15 +220,19 @@ main = do offline_indices = map Node.idx $ filter (\n -> elem (Node.name n) offline_names) all_nodes + m_cpu = optMcpu opts + m_dsk = optMdsk opts when (length offline_wrong > 0) $ do printf "Wrong node name(s) set as offline: %s\n" (commaJoin offline_wrong) exitWith $ ExitFailure 1 - let nl = Container.map (\n -> if elem (Node.idx n) offline_indices + let nm = Container.map (\n -> if elem (Node.idx n) offline_indices then Node.setOffline n True else n) fixed_nl + nl = Container.map (flip Node.setMdsk m_dsk . flip Node.setMcpu m_cpu) + nm when (Container.size il == 0) $ do (if oneline then putStrLn $ formatOneline 0 0 0 @@ -251,14 +286,14 @@ main = do nmlen imlen [] oneline min_cv let (Cluster.Table fin_nl _ fin_cv fin_plc) = fin_tbl ord_plc = reverse fin_plc - sol_msg = if null fin_plc - then printf "No solution found\n" - else (if verbose > 2 - then printf "Final coefficients: overall %.8f, %s\n" - fin_cv (Cluster.printStats fin_nl) - else printf "Cluster score improved from %.8f to %.8f\n" - ini_cv fin_cv - ) + sol_msg = (if null fin_plc + then printf "No solution found\n" + else (if verbose > 2 + then printf "Final coefficients: overall %.8f, %s\n" + fin_cv (Cluster.printStats fin_nl) + else printf "Cluster score improved from %.8f to %.8f\n" + ini_cv fin_cv + ))::String unless oneline $ putStr sol_msg