X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/fd22ce8ef81cf23858a0446dcc0c4781a9427b65..844eff86e3fded35282073a3060dbc66f4e4b16f:/hn1.hs diff --git a/hn1.hs b/hn1.hs index adef634..d8bcf44 100644 --- a/hn1.hs +++ b/hn1.hs @@ -2,6 +2,27 @@ -} +{- + +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. + +-} + module Main (main) where import Data.List @@ -16,10 +37,9 @@ import Text.Printf (printf) import qualified Ganeti.HTools.Container as Container import qualified Ganeti.HTools.Instance as Instance +import qualified Ganeti.HTools.Node as Node import qualified Ganeti.HTools.Cluster as Cluster import qualified Ganeti.HTools.CLI as CLI -import Ganeti.HTools.Rapi -import Ganeti.HTools.Utils -- | Command line options structure. data Options = Options @@ -38,6 +58,18 @@ data Options = Options , optShowHelp :: Bool -- ^ Just show the help } deriving Show +instance CLI.CLIOptions Options where + showVersion = optShowVer + showHelp = optShowHelp + +instance CLI.EToolOptions Options where + nodeFile = optNodef + nodeSet = optNodeSet + instFile = optInstf + instSet = optInstSet + masterName = optMaster + silent _ = False + -- | Default values for the command line options. defaultOptions :: Options defaultOptions = Options @@ -60,7 +92,7 @@ defaultOptions = Options we find a valid solution or we exceed the maximum depth. -} -iterateDepth :: Cluster.NodeList +iterateDepth :: Node.List -> [Instance.Instance] -> Int -> Int @@ -128,42 +160,13 @@ main :: IO () main = do cmd_args <- System.getArgs (opts, args) <- CLI.parseOpts cmd_args "hn1" options - defaultOptions optShowHelp + defaultOptions unless (null args) $ do hPutStrLn stderr "Error: this program doesn't take any arguments." exitWith $ ExitFailure 1 - when (optShowVer opts) $ do - putStr $ CLI.showVersion "hn1" - exitWith ExitSuccess - - (env_node, env_inst) <- CLI.parseEnv () - let nodef = if optNodeSet opts then optNodef opts - else env_node - instf = if optInstSet opts then optInstf opts - else env_inst - min_depth = optMinDepth opts - (node_data, inst_data) = - case optMaster opts of - "" -> (readFile nodef, - readFile instf) - host -> (getNodes host >>= readData, - getInstances host >>= readData) - - ldresult <- liftM2 Cluster.loadData node_data inst_data - (loaded_nl, il, csf, ktn, kti) <- - (case ldresult of - Ok x -> return x - Bad s -> 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 - - unless (null fix_msgs) $ do - putStrLn "Warning: cluster has inconsistent data:" - putStrLn . unlines . map (\s -> printf " - %s" s) $ fix_msgs + (nl, il, csf) <- CLI.loadExternalData opts printf "Loaded %d nodes, %d instances\n" (Container.size nl) @@ -173,6 +176,8 @@ main = do printf "Note: Stripping common suffix of '%s' from names\n" csf let (bad_nodes, bad_instances) = Cluster.computeBadItems nl il + min_depth = optMinDepth opts + printf "Initial check done: %d bad nodes, %d bad instances.\n" (length bad_nodes) (length bad_instances) @@ -213,7 +218,7 @@ main = do (Cluster.printStats ns) printf "Solution (delta=%d):\n" $! min_d - let (sol_strs, cmd_strs) = Cluster.printSolution il ktn kti solution + let (sol_strs, cmd_strs) = Cluster.printSolution ns il solution putStr $ unlines $ sol_strs when (optShowCmds opts) $ do @@ -227,6 +232,6 @@ main = do (final_mem, final_disk) = Cluster.totalResources ns putStrLn "" putStrLn "Final cluster status:" - putStrLn $ Cluster.printNodes ktn ns + putStrLn $ Cluster.printNodes ns printf "Original: mem=%d disk=%d\n" orig_mem orig_disk printf "Final: mem=%d disk=%d\n" final_mem final_disk