Add two new node attributes
[ganeti-local] / hn1.hs
diff --git a/hn1.hs b/hn1.hs
index c452c95..d8bcf44 100644 (file)
--- 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")
@@ -123,21 +159,14 @@ options =
 main :: IO ()
 main = do
   cmd_args <- System.getArgs
-  (opts, _) <- CLI.parseOpts cmd_args "hn1" options defaultOptions optShowHelp
-
-  when (optShowVer opts) $ do
-         printf $ CLI.showVersion "hn1"
-         exitWith ExitSuccess
+  (opts, args) <- CLI.parseOpts cmd_args "hn1" options
+                  defaultOptions
 
-  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)
+  unless (null args) $ do
+         hPutStrLn stderr "Error: this program doesn't take any arguments."
+         exitWith $ ExitFailure 1
 
-  (nl, il, csf, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
+  (nl, il, csf) <- CLI.loadExternalData opts
 
   printf "Loaded %d nodes, %d instances\n"
              (Container.size nl)
@@ -147,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)
 
@@ -187,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
@@ -201,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