Revision 2fd5a116
b/Makefile.am | ||
---|---|---|
478 | 478 |
src/Ganeti/HTools/Loader.hs \ |
479 | 479 |
src/Ganeti/HTools/Node.hs \ |
480 | 480 |
src/Ganeti/HTools/PeerMap.hs \ |
481 |
src/Ganeti/HTools/Program.hs \ |
|
482 | 481 |
src/Ganeti/HTools/Program/Hail.hs \ |
483 | 482 |
src/Ganeti/HTools/Program/Hbal.hs \ |
484 | 483 |
src/Ganeti/HTools/Program/Hcheck.hs \ |
... | ... | |
486 | 485 |
src/Ganeti/HTools/Program/Hscan.hs \ |
487 | 486 |
src/Ganeti/HTools/Program/Hspace.hs \ |
488 | 487 |
src/Ganeti/HTools/Program/Hroller.hs \ |
488 |
src/Ganeti/HTools/Program/Main.hs \ |
|
489 | 489 |
src/Ganeti/HTools/Types.hs \ |
490 | 490 |
src/Ganeti/Hash.hs \ |
491 | 491 |
src/Ganeti/JQueue.hs \ |
/dev/null | ||
---|---|---|
1 |
{-| Small module holding program definitions. |
|
2 |
|
|
3 |
-} |
|
4 |
|
|
5 |
{- |
|
6 |
|
|
7 |
Copyright (C) 2011, 2012 Google Inc. |
|
8 |
|
|
9 |
This program is free software; you can redistribute it and/or modify |
|
10 |
it under the terms of the GNU General Public License as published by |
|
11 |
the Free Software Foundation; either version 2 of the License, or |
|
12 |
(at your option) any later version. |
|
13 |
|
|
14 |
This program is distributed in the hope that it will be useful, but |
|
15 |
WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
17 |
General Public License for more details. |
|
18 |
|
|
19 |
You should have received a copy of the GNU General Public License |
|
20 |
along with this program; if not, write to the Free Software |
|
21 |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
22 |
02110-1301, USA. |
|
23 |
|
|
24 |
-} |
|
25 |
|
|
26 |
module Ganeti.HTools.Program |
|
27 |
( personalities |
|
28 |
) where |
|
29 |
|
|
30 |
import Ganeti.Common (PersonalityList) |
|
31 |
import Ganeti.HTools.CLI (Options) |
|
32 |
|
|
33 |
import qualified Ganeti.HTools.Program.Hail as Hail |
|
34 |
import qualified Ganeti.HTools.Program.Hbal as Hbal |
|
35 |
import qualified Ganeti.HTools.Program.Hcheck as Hcheck |
|
36 |
import qualified Ganeti.HTools.Program.Hscan as Hscan |
|
37 |
import qualified Ganeti.HTools.Program.Hspace as Hspace |
|
38 |
import qualified Ganeti.HTools.Program.Hinfo as Hinfo |
|
39 |
import qualified Ganeti.HTools.Program.Hroller as Hroller |
|
40 |
|
|
41 |
-- | Supported binaries. |
|
42 |
personalities :: PersonalityList Options |
|
43 |
personalities = |
|
44 |
[ ("hail", (Hail.main, Hail.options, Hail.arguments, |
|
45 |
"Ganeti IAllocator plugin that implements the instance\ |
|
46 |
\ placement and movement using the same algorithm as\ |
|
47 |
\ hbal(1)")) |
|
48 |
, ("hbal", (Hbal.main, Hbal.options, Hbal.arguments, |
|
49 |
"cluster balancer that looks at the current state of\ |
|
50 |
\ the cluster and computes a series of steps designed\ |
|
51 |
\ to bring the cluster into a better state")) |
|
52 |
, ("hcheck", (Hcheck.main, Hcheck.options, Hcheck.arguments, |
|
53 |
"cluster checker; prints information about cluster's\ |
|
54 |
\ health and checks whether a rebalance done using\ |
|
55 |
\ hbal would help")) |
|
56 |
, ("hscan", (Hscan.main, Hscan.options, Hscan.arguments, |
|
57 |
"tool for scanning clusters via RAPI and saving their\ |
|
58 |
\ data in the input format used by hbal(1) and hspace(1)")) |
|
59 |
, ("hspace", (Hspace.main, Hspace.options, Hspace.arguments, |
|
60 |
"computes how many additional instances can be fit on a\ |
|
61 |
\ cluster, while maintaining N+1 status.")) |
|
62 |
, ("hinfo", (Hinfo.main, Hinfo.options, Hinfo.arguments, |
|
63 |
"cluster information printer; it prints information\ |
|
64 |
\ about the current cluster state and its residing\ |
|
65 |
\ nodes/instances")) |
|
66 |
, ("hroller", (Hroller.main, Hroller.options, Hroller.arguments, |
|
67 |
"cluster rolling maintenance helper; it helps scheduling\ |
|
68 |
\ node reboots in a manner that doesn't conflict with the\ |
|
69 |
\ instances' topology")) |
|
70 |
] |
b/src/Ganeti/HTools/Program/Main.hs | ||
---|---|---|
1 |
{-| Small module holding program definitions. |
|
2 |
|
|
3 |
-} |
|
4 |
|
|
5 |
{- |
|
6 |
|
|
7 |
Copyright (C) 2011, 2012 Google Inc. |
|
8 |
|
|
9 |
This program is free software; you can redistribute it and/or modify |
|
10 |
it under the terms of the GNU General Public License as published by |
|
11 |
the Free Software Foundation; either version 2 of the License, or |
|
12 |
(at your option) any later version. |
|
13 |
|
|
14 |
This program is distributed in the hope that it will be useful, but |
|
15 |
WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
17 |
General Public License for more details. |
|
18 |
|
|
19 |
You should have received a copy of the GNU General Public License |
|
20 |
along with this program; if not, write to the Free Software |
|
21 |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
22 |
02110-1301, USA. |
|
23 |
|
|
24 |
-} |
|
25 |
|
|
26 |
module Ganeti.HTools.Program.Main |
|
27 |
( personalities |
|
28 |
, main |
|
29 |
) where |
|
30 |
|
|
31 |
import Control.Exception |
|
32 |
import Control.Monad (guard) |
|
33 |
import Data.Char (toLower) |
|
34 |
import System.Environment |
|
35 |
import System.IO |
|
36 |
import System.IO.Error (isDoesNotExistError) |
|
37 |
|
|
38 |
import Ganeti.Common (formatCommands, PersonalityList) |
|
39 |
import Ganeti.HTools.CLI (Options, parseOpts, genericOpts) |
|
40 |
import qualified Ganeti.HTools.Program.Hail as Hail |
|
41 |
import qualified Ganeti.HTools.Program.Hbal as Hbal |
|
42 |
import qualified Ganeti.HTools.Program.Hcheck as Hcheck |
|
43 |
import qualified Ganeti.HTools.Program.Hscan as Hscan |
|
44 |
import qualified Ganeti.HTools.Program.Hspace as Hspace |
|
45 |
import qualified Ganeti.HTools.Program.Hinfo as Hinfo |
|
46 |
import qualified Ganeti.HTools.Program.Hroller as Hroller |
|
47 |
import Ganeti.Utils |
|
48 |
|
|
49 |
-- | Supported binaries. |
|
50 |
personalities :: PersonalityList Options |
|
51 |
personalities = |
|
52 |
[ ("hail", (Hail.main, Hail.options, Hail.arguments, |
|
53 |
"Ganeti IAllocator plugin that implements the instance\ |
|
54 |
\ placement and movement using the same algorithm as\ |
|
55 |
\ hbal(1)")) |
|
56 |
, ("hbal", (Hbal.main, Hbal.options, Hbal.arguments, |
|
57 |
"cluster balancer that looks at the current state of\ |
|
58 |
\ the cluster and computes a series of steps designed\ |
|
59 |
\ to bring the cluster into a better state")) |
|
60 |
, ("hcheck", (Hcheck.main, Hcheck.options, Hcheck.arguments, |
|
61 |
"cluster checker; prints information about cluster's\ |
|
62 |
\ health and checks whether a rebalance done using\ |
|
63 |
\ hbal would help")) |
|
64 |
, ("hscan", (Hscan.main, Hscan.options, Hscan.arguments, |
|
65 |
"tool for scanning clusters via RAPI and saving their\ |
|
66 |
\ data in the input format used by hbal(1) and hspace(1)")) |
|
67 |
, ("hspace", (Hspace.main, Hspace.options, Hspace.arguments, |
|
68 |
"computes how many additional instances can be fit on a\ |
|
69 |
\ cluster, while maintaining N+1 status.")) |
|
70 |
, ("hinfo", (Hinfo.main, Hinfo.options, Hinfo.arguments, |
|
71 |
"cluster information printer; it prints information\ |
|
72 |
\ about the current cluster state and its residing\ |
|
73 |
\ nodes/instances")) |
|
74 |
, ("hroller", (Hroller.main, Hroller.options, Hroller.arguments, |
|
75 |
"cluster rolling maintenance helper; it helps scheduling\ |
|
76 |
\ node reboots in a manner that doesn't conflict with the\ |
|
77 |
\ instances' topology")) |
|
78 |
] |
|
79 |
|
|
80 |
-- | Display usage and exit. |
|
81 |
usage :: String -> IO () |
|
82 |
usage name = do |
|
83 |
hPutStrLn stderr $ "Unrecognised personality '" ++ name ++ "'." |
|
84 |
hPutStrLn stderr "This program must be installed under one of the following\ |
|
85 |
\ names:" |
|
86 |
hPutStrLn stderr . unlines $ formatCommands personalities |
|
87 |
exitErr "Please either rename/symlink the program or set\n\ |
|
88 |
\the environment variable HTOOLS to the desired role." |
|
89 |
|
|
90 |
main :: IO () |
|
91 |
main = do |
|
92 |
binary <- catchJust (guard . isDoesNotExistError) |
|
93 |
(getEnv "HTOOLS") (const getProgName) |
|
94 |
let name = map toLower binary |
|
95 |
case name `lookup` personalities of |
|
96 |
Nothing -> usage name |
|
97 |
Just (fn, options, arguments, _) -> do |
|
98 |
cmd_args <- getArgs |
|
99 |
real_options <- options |
|
100 |
(opts, args) <- parseOpts cmd_args name (real_options ++ genericOpts) |
|
101 |
arguments |
|
102 |
fn opts args |
b/src/htools.hs | ||
---|---|---|
25 | 25 |
|
26 | 26 |
module Main (main) where |
27 | 27 |
|
28 |
import Control.Exception |
|
29 |
import Control.Monad (guard) |
|
30 |
import Data.Char (toLower) |
|
31 |
import System.Environment |
|
32 |
import System.IO |
|
33 |
import System.IO.Error (isDoesNotExistError) |
|
34 |
|
|
35 |
import Ganeti.Common (formatCommands) |
|
36 |
import Ganeti.HTools.CLI (parseOpts, genericOpts) |
|
37 |
import Ganeti.HTools.Program (personalities) |
|
38 |
import Ganeti.Utils |
|
39 |
|
|
40 |
-- | Display usage and exit. |
|
41 |
usage :: String -> IO () |
|
42 |
usage name = do |
|
43 |
hPutStrLn stderr $ "Unrecognised personality '" ++ name ++ "'." |
|
44 |
hPutStrLn stderr "This program must be installed under one of the following\ |
|
45 |
\ names:" |
|
46 |
hPutStrLn stderr . unlines $ formatCommands personalities |
|
47 |
exitErr "Please either rename/symlink the program or set\n\ |
|
48 |
\the environment variable HTOOLS to the desired role." |
|
49 |
|
|
50 |
main :: IO () |
|
51 |
main = do |
|
52 |
binary <- catchJust (guard . isDoesNotExistError) |
|
53 |
(getEnv "HTOOLS") (const getProgName) |
|
54 |
let name = map toLower binary |
|
55 |
case name `lookup` personalities of |
|
56 |
Nothing -> usage name |
|
57 |
Just (fn, options, arguments, _) -> do |
|
58 |
cmd_args <- getArgs |
|
59 |
real_options <- options |
|
60 |
(opts, args) <- parseOpts cmd_args name (real_options ++ genericOpts) |
|
61 |
arguments |
|
62 |
fn opts args |
|
28 |
import Ganeti.HTools.Program.Main (main) |
b/test/hs/Test/Ganeti/HTools/CLI.hs | ||
---|---|---|
41 | 41 |
|
42 | 42 |
import Ganeti.BasicTypes |
43 | 43 |
import Ganeti.HTools.CLI as CLI |
44 |
import qualified Ganeti.HTools.Program as Program |
|
44 |
import qualified Ganeti.HTools.Program.Main as Program
|
|
45 | 45 |
import qualified Ganeti.HTools.Types as Types |
46 | 46 |
|
47 | 47 |
{-# ANN module "HLint: ignore Use camelCase" #-} |
Also available in: Unified diff