X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/45f01962c4af012eb8c86916b239fe596a85f994..0a8dd21dd36b6083b539773fea19f88e360211ec:/hn1.hs diff --git a/hn1.hs b/hn1.hs index 65ab4bb..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,17 +37,18 @@ 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 { optShowNodes :: Bool , optShowCmds :: Bool , optNodef :: FilePath - , optInstf :: FilePath + , optNodeSet :: Bool -- ^ The nodes have been set by options + , optInstf :: FilePath -- ^ Path to the instances file + , optInstSet :: Bool -- ^ The insts have been set by options , optMinDepth :: Int , optMaxRemovals :: Int , optMinDelta :: Int @@ -36,27 +58,41 @@ 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 { optShowNodes = False , optShowCmds = False , optNodef = "nodes" + , optNodeSet = False , optInstf = "instances" + , optInstSet = False , optMinDepth = 1 , optMaxRemovals = -1 , optMinDelta = 0 , optMaxDelta = -1 - , optMaster = "" - , optShowVer = False - , optShowHelp = False + , optMaster = "" + , optShowVer = False + , optShowHelp = False } {- | Start computing the solution at the given depth and recurse until we find a valid solution or we exceed the maximum depth. -} -iterateDepth :: Cluster.NodeList +iterateDepth :: Node.List -> [Instance.Instance] -> Int -> Int @@ -91,10 +127,10 @@ options = (NoArg (\ opts -> opts { optShowCmds = True })) "print the ganeti command list for reaching the solution" , Option ['n'] ["nodes"] - (ReqArg (\ f opts -> opts { optNodef = f }) "FILE") + (ReqArg (\ f opts -> opts { optNodef = f, optNodeSet = True }) "FILE") "the node list FILE" , Option ['i'] ["instances"] - (ReqArg (\ f opts -> opts { optInstf = f }) "FILE") + (ReqArg (\ f opts -> opts { optInstf = f, optInstSet = True }) "FILE") "the instance list FILE" , Option ['d'] ["depth"] (ReqArg (\ i opts -> opts { optMinDepth = (read i)::Int }) "D") @@ -124,31 +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 - printf $ CLI.showVersion "hn1" - exitWith ExitSuccess - - let min_depth = optMinDepth opts - let (node_data, inst_data) = - case optMaster opts of - "" -> (readFile $ optNodef opts, - readFile $ optInstf opts) - host -> (readData getNodes host, - readData getInstances host) - - (loaded_nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data - - 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) @@ -158,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) @@ -198,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 @@ -212,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