diff --git a/Ganeti/HTools/Cluster.hs b/Ganeti/HTools/Cluster.hs index 33d523c693c9147d8316080807d04d94b1a85bb4..74f24d8896691be5e4bb1562b0d8cd875d165c67 100644 --- a/Ganeti/HTools/Cluster.hs +++ b/Ganeti/HTools/Cluster.hs @@ -31,8 +31,6 @@ module Ganeti.HTools.Cluster , checkMove , compCV , printStats - -- * Loading functions - , checkData ) where import Data.List @@ -681,50 +679,3 @@ printStats nl = let (mem_cv, dsk_cv, n1_score, res_cv, off_score) = compDetailedCV nl in printf "f_mem=%.8f, r_mem=%.8f, f_dsk=%.8f, n1=%.3f, uf=%.3f" mem_cv res_cv dsk_cv n1_score off_score - --- Balancing functions - --- Loading functions - --- | Compute the amount of memory used by primary instances on a node. -nodeImem :: Node.Node -> InstanceList -> Int -nodeImem node il = - let rfind = flip Container.find $ il - in sum . map Instance.mem . - map rfind $ Node.plist node - --- | Compute the amount of disk used by instances on a node (either primary --- or secondary). -nodeIdsk :: Node.Node -> InstanceList -> Int -nodeIdsk node il = - let rfind = flip Container.find $ il - in sum . map Instance.dsk . - map rfind $ (Node.plist node) ++ (Node.slist node) - --- | Check cluster data for consistency -checkData :: NodeList -> InstanceList -> NameList -> NameList - -> ([String], NodeList) -checkData nl il ktn _ = - Container.mapAccum - (\ msgs node -> - let nname = fromJust $ lookup (Node.idx node) ktn - nilst = map (flip Container.find $ il) (Node.plist node) - dilst = filter (not . Instance.running) nilst - adj_mem = sum . map Instance.mem $ dilst - delta_mem = (truncate $ Node.t_mem node) - - (Node.n_mem node) - - (Node.f_mem node) - - (nodeImem node il) - + adj_mem - delta_dsk = (truncate $ Node.t_dsk node) - - (Node.f_dsk node) - - (nodeIdsk node il) - newn = Node.setFmem (Node.setXmem node delta_mem) - (Node.f_mem node - adj_mem) - umsg1 = if delta_mem > 512 || delta_dsk > 1024 - then [printf "node %s is missing %d MB ram \ - \and %d GB disk" - nname delta_mem (delta_dsk `div` 1024)] - else [] - in (msgs ++ umsg1, newn) - ) [] nl diff --git a/Ganeti/HTools/Loader.hs b/Ganeti/HTools/Loader.hs index 4b9bc7b49bf12abd1d5bf5abeab5bb0e79795594..4f6359c6a605f3d8c4930f94a8d1a60449d5b703 100644 --- a/Ganeti/HTools/Loader.hs +++ b/Ganeti/HTools/Loader.hs @@ -5,10 +5,16 @@ This module holds the common code for loading the cluster state from external so -} module Ganeti.HTools.Loader - where + ( mergeData + , checkData + , assignIndices + , lookupNode + , swapPairs + ) where import Data.List -import Data.Maybe (isNothing, fromJust) +import Data.Maybe (fromJust) +import Text.Printf (printf) import qualified Ganeti.HTools.Container as Container import qualified Ganeti.HTools.Instance as Instance @@ -99,3 +105,46 @@ mergeData (ktn, nl, kti, il) = do stn = stripSuffix common_suffix xtn sti = stripSuffix common_suffix xti return (nl3, il3, common_suffix, stn, sti) + +-- | Check cluster data for consistency +checkData :: NodeList -> InstanceList -> NameList -> NameList + -> ([String], NodeList) +checkData nl il ktn _ = + Container.mapAccum + (\ msgs node -> + let nname = fromJust $ lookup (Node.idx node) ktn + nilst = map (flip Container.find $ il) (Node.plist node) + dilst = filter (not . Instance.running) nilst + adj_mem = sum . map Instance.mem $ dilst + delta_mem = (truncate $ Node.t_mem node) + - (Node.n_mem node) + - (Node.f_mem node) + - (nodeImem node il) + + adj_mem + delta_dsk = (truncate $ Node.t_dsk node) + - (Node.f_dsk node) + - (nodeIdsk node il) + newn = Node.setFmem (Node.setXmem node delta_mem) + (Node.f_mem node - adj_mem) + umsg1 = if delta_mem > 512 || delta_dsk > 1024 + then [printf "node %s is missing %d MB ram \ + \and %d GB disk" + nname delta_mem (delta_dsk `div` 1024)] + else [] + in (msgs ++ umsg1, newn) + ) [] nl + +-- | Compute the amount of memory used by primary instances on a node. +nodeImem :: Node.Node -> InstanceList -> Int +nodeImem node il = + let rfind = flip Container.find $ il + in sum . map Instance.mem . + map rfind $ Node.plist node + +-- | Compute the amount of disk used by instances on a node (either primary +-- or secondary). +nodeIdsk :: Node.Node -> InstanceList -> Int +nodeIdsk node il = + let rfind = flip Container.find $ il + in sum . map Instance.dsk . + map rfind $ (Node.plist node) ++ (Node.slist node) diff --git a/hbal.hs b/hbal.hs index ca3c6ae3c7adb05aabfa8ebed1c5f4a9863be122..5db69d3ad08b0bc70989e64d073a2115abf897f9 100644 --- a/hbal.hs +++ b/hbal.hs @@ -196,7 +196,7 @@ main = do printf "Error: failed to load data. Details:\n%s\n" s exitWith $ ExitFailure 1 ) - let (fix_msgs, fixed_nl) = Cluster.checkData loaded_nl il ktn kti + let (fix_msgs, fixed_nl) = Loader.checkData loaded_nl il ktn kti unless (null fix_msgs || verbose == 0) $ do putStrLn "Warning: cluster has inconsistent data:" diff --git a/hn1.hs b/hn1.hs index b55249f5e6a73a6e60155c16d7fbe1454a9fde42..926833859e35f9bdf07175bebe4b1917adf61f03 100644 --- a/hn1.hs +++ b/hn1.hs @@ -160,7 +160,7 @@ main = do printf "Error: failed to load data. Details:\n%s\n" s exitWith $ ExitFailure 1 ) - let (fix_msgs, nl) = Cluster.checkData loaded_nl il ktn kti + let (fix_msgs, nl) = Loader.checkData loaded_nl il ktn kti unless (null fix_msgs) $ do putStrLn "Warning: cluster has inconsistent data:" diff --git a/hscan.hs b/hscan.hs index 061e19eb9cac41e1d11027285b1ee8ae1546840f..fb9a89783458b0d4dce02aa8113254802536c772 100644 --- a/hscan.hs +++ b/hscan.hs @@ -166,7 +166,7 @@ main = do \Details:\n%s\n" err Ok x -> do let (nl, il, csf, ktn, kti) = x - (_, fix_nl) = Cluster.checkData nl il ktn kti + (_, fix_nl) = Loader.checkData nl il ktn kti putStrLn $ printCluster fix_nl il ktn kti when (optShowNodes opts) $ do putStr $ Cluster.printNodes ktn fix_nl