[Pkg-ganeti-devel] [ganeti] 110/165: Make hcheck support --no-capacity-checks
Apollon Oikonomopoulos
apoikos at moszumanska.debian.org
Tue Aug 11 13:53:18 UTC 2015
This is an automated email from the git hooks/post-receive script.
apoikos pushed a commit to branch master
in repository ganeti.
commit 83ecda403776ec20004ba0d28e877299839f43c8
Author: Klaus Aehlig <aehlig at google.com>
Date: Wed Apr 15 14:34:10 2015 +0200
Make hcheck support --no-capacity-checks
...as the new global N+1 redundancy criterion is quite unlikely
to be repaired by a cluster rebalance. While there, also make
the list of checks to be done depend on the options.
Signed-off-by: Klaus Aehlig <aehlig at google.com>
Reviewed-by: Petr Pudlak <pudlak at google.com>
---
src/Ganeti/HTools/Program/Hcheck.hs | 78 +++++++++++++++++++------------------
1 file changed, 40 insertions(+), 38 deletions(-)
diff --git a/src/Ganeti/HTools/Program/Hcheck.hs b/src/Ganeti/HTools/Program/Hcheck.hs
index 9c93bd4..a2251ff 100644
--- a/src/Ganeti/HTools/Program/Hcheck.hs
+++ b/src/Ganeti/HTools/Program/Hcheck.hs
@@ -91,6 +91,7 @@ options = do
, oQuiet
, oRapiMaster
, oSelInst
+ , oNoCapacityChecks
, oVerbose
]
@@ -117,21 +118,22 @@ htcPrefix :: String
htcPrefix = "HCHECK"
-- | Data showed both per group and per cluster.
-commonData :: [(String, String)]
-commonData =[ ("N1_FAIL", "Nodes not N+1 happy")
- , ("CONFLICT_TAGS", "Nodes with conflicting instances")
- , ("OFFLINE_PRI", "Instances having the primary node offline")
- , ("OFFLINE_SEC", "Instances having a secondary node offline")
- , ("GN1_FAIL", "Nodes not directly evacuateable")
- ]
+commonData :: Options -> [(String, String)]
+commonData opts =
+ [ ("N1_FAIL", "Nodes not N+1 happy")
+ , ("CONFLICT_TAGS", "Nodes with conflicting instances")
+ , ("OFFLINE_PRI", "Instances having the primary node offline")
+ , ("OFFLINE_SEC", "Instances having a secondary node offline")
+ ]
+ ++ [ ("GN1_FAIL", "Nodes not directly evacuateable") | optCapacity opts ]
-- | Data showed per group.
-groupData :: [(String, String)]
-groupData = commonData ++ [("SCORE", "Group score")]
+groupData :: Options -> [(String, String)]
+groupData opts = commonData opts ++ [("SCORE", "Group score")]
-- | Data showed per cluster.
-clusterData :: [(String, String)]
-clusterData = commonData ++
+clusterData :: Options -> [(String, String)]
+clusterData opts = commonData opts ++
[ ("NEED_REBALANCE", "Cluster is not healthy") ]
-- | Phase-specific prefix for machine readable version.
@@ -145,9 +147,9 @@ levelPrefix GroupLvl {} = "GROUP"
levelPrefix ClusterLvl = "CLUSTER"
-- | Machine-readable keys to show depending on given level.
-keysData :: Level -> [String]
-keysData GroupLvl {} = map fst groupData
-keysData ClusterLvl = map fst clusterData
+keysData :: Options -> Level -> [String]
+keysData opts GroupLvl {} = map fst $ groupData opts
+keysData opts ClusterLvl = map fst $ clusterData opts
-- | Description of phases for human readable version.
phaseDescr :: Phase -> String
@@ -155,9 +157,9 @@ phaseDescr Initial = "initially"
phaseDescr Rebalanced = "after rebalancing"
-- | Description to show depending on given level.
-descrData :: Level -> [String]
-descrData GroupLvl {} = map snd groupData
-descrData ClusterLvl = map snd clusterData
+descrData :: Options -> Level -> [String]
+descrData opts GroupLvl {} = map snd $ groupData opts
+descrData opts ClusterLvl = map snd $ clusterData opts
-- | Human readable prefix for statistics.
phaseLevelDescr :: Phase -> Level -> String
@@ -195,20 +197,20 @@ prepareKey level@(GroupLvl idx) phase suffix =
printf "%s_%s_%s_%s" (phasePrefix phase) (levelPrefix level) idx suffix
-- | Print all the statistics for given level and phase.
-printStats :: Int -- ^ Verbosity level
+printStats :: Options
-> Bool -- ^ If the output should be machine readable
-> Level -- ^ Level on which we are printing
-> Phase -- ^ Current phase of simulation
-> [String] -- ^ Values to print
-> IO ()
-printStats _ True level phase values = do
- let keys = map (prepareKey level phase) (keysData level)
+printStats opts True level phase values = do
+ let keys = map (prepareKey level phase) (keysData opts level)
printKeysHTC $ zip keys values
-printStats verbose False level phase values = do
+printStats opts False level phase values = do
let prefix = phaseLevelDescr phase level
- descr = descrData level
- unless (verbose < 1) $ do
+ descr = descrData opts level
+ unless (optVerbose opts < 1) $ do
putStrLn ""
putStr prefix
mapM_ (uncurry (printf " %s: %s\n")) (zip descr values)
@@ -229,17 +231,17 @@ prepareClusterValues machineread stats bstats =
map show stats ++ map (printBool machineread) bstats
-- | Print all the statistics on a group level.
-printGroupStats :: Int -> Bool -> Phase -> GroupStats -> IO ()
-printGroupStats verbose machineread phase ((grp, score), stats) = do
+printGroupStats :: Options -> Bool -> Phase -> GroupStats -> IO ()
+printGroupStats opts machineread phase ((grp, score), stats) = do
let values = prepareGroupValues stats score
extradata = extractGroupData machineread grp
- printStats verbose machineread (GroupLvl extradata) phase values
+ printStats opts machineread (GroupLvl extradata) phase values
-- | Print all the statistics on a cluster (global) level.
-printClusterStats :: Int -> Bool -> Phase -> [Int] -> Bool -> IO ()
-printClusterStats verbose machineread phase stats needhbal = do
+printClusterStats :: Options -> Bool -> Phase -> [Int] -> Bool -> IO ()
+printClusterStats opts machineread phase stats needhbal = do
let values = prepareClusterValues machineread stats [needhbal]
- printStats verbose machineread ClusterLvl phase values
+ printStats opts machineread ClusterLvl phase values
-- | Check if any of cluster metrics is non-zero.
clusterNeedsRebalance :: [Int] -> Bool
@@ -249,8 +251,8 @@ clusterNeedsRebalance stats = sum stats > 0
instances residing on offline nodes.
-}
-perGroupChecks :: Group.List -> GroupInfo -> GroupStats
-perGroupChecks gl (gidx, (nl, il)) =
+perGroupChecks :: Options -> Group.List -> GroupInfo -> GroupStats
+perGroupChecks opts gl (gidx, (nl, il)) =
let grp = Container.find gidx gl
offnl = filter Node.offline (Container.elems nl)
n1violated = length . fst $ Cluster.computeBadItems nl il
@@ -265,8 +267,8 @@ perGroupChecks gl (gidx, (nl, il)) =
, conflicttags
, offline_pri
, offline_sec
- , gn1fail
]
+ ++ [ gn1fail | optCapacity opts ]
in ((grp, score), groupstats)
-- | Use Hbal's iterateDepth to simulate group rebalance.
@@ -323,7 +325,7 @@ main opts args = do
when machineread $ printGroupsMappings gl
- let groupsstats = map (perGroupChecks gl) splitcluster
+ let groupsstats = map (perGroupChecks opts gl) splitcluster
clusterstats = map sum . transpose . map snd $ groupsstats
needrebalance = clusterNeedsRebalance clusterstats
@@ -334,9 +336,9 @@ main opts args = do
then "Cluster needs rebalancing."
else "No need to rebalance cluster, no problems found."
- mapM_ (printGroupStats verbose machineread Initial) groupsstats
+ mapM_ (printGroupStats opts machineread Initial) groupsstats
- printClusterStats verbose machineread Initial clusterstats needrebalance
+ printClusterStats opts machineread Initial clusterstats needrebalance
let exitOK = nosimulation || not needrebalance
simulate = not nosimulation && needrebalance
@@ -344,13 +346,13 @@ main opts args = do
rebalancedcluster <- maybeSimulateRebalance simulate opts splitcluster
when (simulate || machineread) $ do
- let newgroupstats = map (perGroupChecks gl) rebalancedcluster
+ let newgroupstats = map (perGroupChecks opts gl) rebalancedcluster
newclusterstats = map sum . transpose . map snd $ newgroupstats
newneedrebalance = clusterNeedsRebalance clusterstats
- mapM_ (printGroupStats verbose machineread Rebalanced) newgroupstats
+ mapM_ (printGroupStats opts machineread Rebalanced) newgroupstats
- printClusterStats verbose machineread Rebalanced newclusterstats
+ printClusterStats opts machineread Rebalanced newclusterstats
newneedrebalance
printFinalHTC machineread
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ganeti/ganeti.git
More information about the Pkg-ganeti-devel
mailing list