import Data.List
import Data.Either
+import System
+import System.IO
+import Monad
import Debug.Trace
-- | Coefficient of variation.
varianceCoeff :: Floating a => [a] -> a
varianceCoeff lst = (stdDev lst) / (fromIntegral $ length lst)
+
+-- | Get a Right result or print the error and exit
+readData :: (String -> IO (Either String String)) -> String -> IO String
+readData fn host = do
+ nd <- fn host
+ when (isLeft nd) $
+ do
+ putStrLn $ fromLeft nd
+ exitWith $ ExitFailure 1
+ return $ fromRight nd
ioError (userError (concat errs ++ usageInfo header options))
where header = "Usage: hbal [OPTION...]"
--- | Get a Right result or print the error and exit
-readData :: (String -> IO (Either String String)) -> String -> IO String
-readData fn host = do
- nd <- fn host
- when (isLeft nd) $
- do
- putStrLn $ fromLeft nd
- exitWith $ ExitFailure 1
- return $ fromRight nd
-
-- | Main function.
main :: IO ()
main = do
import qualified Container
import qualified Instance
import qualified Cluster
+import Utils
+import Rapi
-- | Command line options structure.
data Options = Options
, optMaxRemovals :: Int
, optMinDelta :: Int
, optMaxDelta :: Int
+ , optMaster :: String
} deriving Show
-- | Default values for the command line options.
, optMaxRemovals = -1
, optMinDelta = 0
, optMaxDelta = -1
+ , optMaster = ""
}
{- | Start computing the solution at the given depth and recurse until
, Option ['l'] ["min-delta"]
(ReqArg (\ i opts -> opts { optMinDelta = (read i)::Int }) "L")
"return once a solution with delta L or lower has been found"
+ , Option ['m'] ["master"]
+ (ReqArg (\ m opts -> opts { optMaster = m }) "ADDRESS")
+ "collect data via RAPI at the given ADDRESS"
]
-- | Command line parser, using the 'options' structure.
cmd_args <- System.getArgs
(opts, _) <- parseOpts cmd_args
let min_depth = optMinDepth opts
- (nl, il, ktn, kti) <- liftM2 Cluster.loadData
- (readFile $ optNodef opts)
- (readFile $ optInstf opts)
+ let (node_data, inst_data) =
+ case optMaster opts of
+ "" -> (readFile $ optNodef opts,
+ readFile $ optInstf opts)
+ host -> (readData getNodes host,
+ readData getInstances host)
+
+ (nl, il, ktn, kti) <- liftM2 Cluster.loadData node_data inst_data
+
printf "Loaded %d nodes, %d instances\n"
(Container.size nl)
(Container.size il)