Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / Program / Hinfo.hs @ ef3ad027

History | View | Annotate | Download (5.6 kB)

1 2922d2c5 René Nussbaumer
{-| Cluster information printer.
2 2922d2c5 René Nussbaumer
3 2922d2c5 René Nussbaumer
-}
4 2922d2c5 René Nussbaumer
5 2922d2c5 René Nussbaumer
{-
6 2922d2c5 René Nussbaumer
7 2922d2c5 René Nussbaumer
Copyright (C) 2012 Google Inc.
8 2922d2c5 René Nussbaumer
9 2922d2c5 René Nussbaumer
This program is free software; you can redistribute it and/or modify
10 2922d2c5 René Nussbaumer
it under the terms of the GNU General Public License as published by
11 2922d2c5 René Nussbaumer
the Free Software Foundation; either version 2 of the License, or
12 2922d2c5 René Nussbaumer
(at your option) any later version.
13 2922d2c5 René Nussbaumer
14 2922d2c5 René Nussbaumer
This program is distributed in the hope that it will be useful, but
15 2922d2c5 René Nussbaumer
WITHOUT ANY WARRANTY; without even the implied warranty of
16 2922d2c5 René Nussbaumer
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 2922d2c5 René Nussbaumer
General Public License for more details.
18 2922d2c5 René Nussbaumer
19 2922d2c5 René Nussbaumer
You should have received a copy of the GNU General Public License
20 2922d2c5 René Nussbaumer
along with this program; if not, write to the Free Software
21 2922d2c5 René Nussbaumer
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 2922d2c5 René Nussbaumer
02110-1301, USA.
23 2922d2c5 René Nussbaumer
24 2922d2c5 René Nussbaumer
-}
25 2922d2c5 René Nussbaumer
26 22278fa7 Iustin Pop
module Ganeti.HTools.Program.Hinfo
27 22278fa7 Iustin Pop
  ( main
28 22278fa7 Iustin Pop
  , options
29 22278fa7 Iustin Pop
  , arguments
30 22278fa7 Iustin Pop
  ) where
31 2922d2c5 René Nussbaumer
32 2922d2c5 René Nussbaumer
import Control.Monad
33 2922d2c5 René Nussbaumer
import Data.List
34 2922d2c5 René Nussbaumer
import System.IO
35 2922d2c5 René Nussbaumer
36 2922d2c5 René Nussbaumer
import Text.Printf (printf)
37 2922d2c5 René Nussbaumer
38 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Container as Container
39 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Cluster as Cluster
40 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Node as Node
41 19e310cc René Nussbaumer
import qualified Ganeti.HTools.Group as Group
42 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Instance as Instance
43 2922d2c5 René Nussbaumer
44 22278fa7 Iustin Pop
import Ganeti.Common
45 2922d2c5 René Nussbaumer
import Ganeti.HTools.CLI
46 2922d2c5 René Nussbaumer
import Ganeti.HTools.ExtLoader
47 2922d2c5 René Nussbaumer
import Ganeti.HTools.Loader
48 26d62e4c Iustin Pop
import Ganeti.Utils
49 2922d2c5 René Nussbaumer
50 2922d2c5 René Nussbaumer
-- | Options list and functions.
51 2922d2c5 René Nussbaumer
options :: [OptType]
52 2922d2c5 René Nussbaumer
options =
53 2922d2c5 René Nussbaumer
  [ oPrintNodes
54 2922d2c5 René Nussbaumer
  , oPrintInsts
55 2922d2c5 René Nussbaumer
  , oDataFile
56 2922d2c5 René Nussbaumer
  , oRapiMaster
57 2922d2c5 René Nussbaumer
  , oLuxiSocket
58 0547d608 René Nussbaumer
  , oIAllocSrc
59 2922d2c5 René Nussbaumer
  , oVerbose
60 2922d2c5 René Nussbaumer
  , oQuiet
61 2922d2c5 René Nussbaumer
  , oOfflineNode
62 2922d2c5 René Nussbaumer
  ]
63 2922d2c5 René Nussbaumer
64 22278fa7 Iustin Pop
-- | The list of arguments supported by the program.
65 22278fa7 Iustin Pop
arguments :: [ArgCompletion]
66 22278fa7 Iustin Pop
arguments = []
67 22278fa7 Iustin Pop
68 da28218d Iustin Pop
-- | Group information data-type.
69 da28218d Iustin Pop
data GroupInfo = GroupInfo { giName      :: String
70 da28218d Iustin Pop
                           , giNodeCount :: Int
71 da28218d Iustin Pop
                           , giInstCount :: Int
72 da28218d Iustin Pop
                           , giBadNodes  :: Int
73 da28218d Iustin Pop
                           , giBadInsts  :: Int
74 da28218d Iustin Pop
                           , giN1Status  :: Bool
75 d1da5a45 Iustin Pop
                           , giScore     :: Double
76 da28218d Iustin Pop
                           }
77 da28218d Iustin Pop
78 d0a14556 René Nussbaumer
-- | Node group statistics.
79 d0a14556 René Nussbaumer
calcGroupInfo :: Group.Group
80 d0a14556 René Nussbaumer
              -> Node.List
81 d0a14556 René Nussbaumer
              -> Instance.List
82 da28218d Iustin Pop
              -> GroupInfo
83 d0a14556 René Nussbaumer
calcGroupInfo g nl il =
84 d0a14556 René Nussbaumer
  let nl_size                    = Container.size nl
85 d0a14556 René Nussbaumer
      il_size                    = Container.size il
86 d0a14556 René Nussbaumer
      (bad_nodes, bad_instances) = Cluster.computeBadItems nl il
87 d0a14556 René Nussbaumer
      bn_size                    = length bad_nodes
88 d0a14556 René Nussbaumer
      bi_size                    = length bad_instances
89 d0a14556 René Nussbaumer
      n1h                        = bn_size == 0
90 d1da5a45 Iustin Pop
      score                      = Cluster.compCV nl
91 d1da5a45 Iustin Pop
  in GroupInfo (Group.name g) nl_size il_size bn_size bi_size n1h score
92 d0a14556 René Nussbaumer
93 d0a14556 René Nussbaumer
-- | Helper to format one group row result.
94 da28218d Iustin Pop
groupRowFormatHelper :: GroupInfo -> [String]
95 da28218d Iustin Pop
groupRowFormatHelper gi =
96 da28218d Iustin Pop
  [ giName gi
97 da28218d Iustin Pop
  , printf "%d" $ giNodeCount gi
98 da28218d Iustin Pop
  , printf "%d" $ giInstCount gi
99 da28218d Iustin Pop
  , printf "%d" $ giBadNodes gi
100 da28218d Iustin Pop
  , printf "%d" $ giBadInsts gi
101 da28218d Iustin Pop
  , show $ giN1Status gi
102 d1da5a45 Iustin Pop
  , printf "%.8f" $ giScore gi
103 da28218d Iustin Pop
  ]
104 d0a14556 René Nussbaumer
105 d0a14556 René Nussbaumer
-- | Print node group information.
106 d0a14556 René Nussbaumer
showGroupInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
107 d0a14556 René Nussbaumer
showGroupInfo verbose gl nl il = do
108 d0a14556 René Nussbaumer
  let cgrs   = map (\(gdx, (gnl, gil)) ->
109 d0a14556 René Nussbaumer
                 calcGroupInfo (Container.find gdx gl) gnl gil) $
110 d0a14556 René Nussbaumer
                 Cluster.splitCluster nl il
111 da28218d Iustin Pop
      cn1h   = all giN1Status cgrs
112 d0a14556 René Nussbaumer
      grs    = map groupRowFormatHelper cgrs
113 d0a14556 René Nussbaumer
      header = ["Group", "Nodes", "Instances", "Bad_Nodes", "Bad_Instances",
114 d1da5a45 Iustin Pop
                "N+1", "Score"]
115 d0a14556 René Nussbaumer
116 d0a14556 René Nussbaumer
  when (verbose > 1) $
117 d0a14556 René Nussbaumer
    printf "Node group information:\n%s"
118 d1da5a45 Iustin Pop
           (printTable "  " header grs [False, True, True, True, True,
119 d1da5a45 Iustin Pop
                                        False, True])
120 d0a14556 René Nussbaumer
121 d0a14556 René Nussbaumer
  printf "Cluster is N+1 %s\n" $ if cn1h then "happy" else "unhappy"
122 d0a14556 René Nussbaumer
123 d0a14556 René Nussbaumer
-- | Gather and print split instances.
124 19e310cc René Nussbaumer
splitInstancesInfo :: Int -> Node.List -> Instance.List -> IO ()
125 19e310cc René Nussbaumer
splitInstancesInfo verbose nl il = do
126 2922d2c5 René Nussbaumer
  let split_insts = Cluster.findSplitInstances nl il
127 5b11f8db Iustin Pop
  if null split_insts
128 19e310cc René Nussbaumer
    then
129 5b11f8db Iustin Pop
      when (verbose > 1) $
130 19e310cc René Nussbaumer
        putStrLn "No split instances found"::IO ()
131 19e310cc René Nussbaumer
    else do
132 19e310cc René Nussbaumer
      putStrLn "Found instances belonging to multiple node groups:"
133 19e310cc René Nussbaumer
      mapM_ (\i -> hPutStrLn stderr $ "  " ++ Instance.name i) split_insts
134 19e310cc René Nussbaumer
135 d0a14556 René Nussbaumer
-- | Print common (interesting) information.
136 19e310cc René Nussbaumer
commonInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
137 19e310cc René Nussbaumer
commonInfo verbose gl nl il = do
138 5b11f8db Iustin Pop
  when (Container.null il && verbose > 1) $
139 5b11f8db Iustin Pop
    printf "Cluster is empty.\n"::IO ()
140 19e310cc René Nussbaumer
141 5b11f8db Iustin Pop
  let nl_size = Container.size nl
142 5b11f8db Iustin Pop
      il_size = Container.size il
143 5b11f8db Iustin Pop
      gl_size = Container.size gl
144 19e310cc René Nussbaumer
  printf "Loaded %d %s, %d %s, %d %s\n"
145 19e310cc René Nussbaumer
             nl_size (plural nl_size "node" "nodes")
146 19e310cc René Nussbaumer
             il_size (plural il_size "instance" "instances")
147 19e310cc René Nussbaumer
             gl_size (plural gl_size "node group" "node groups")::IO ()
148 2922d2c5 René Nussbaumer
149 2922d2c5 René Nussbaumer
  let csf = commonSuffix nl il
150 14fbd75b René Nussbaumer
  when (not (null csf) && verbose > 2) $
151 2922d2c5 René Nussbaumer
       printf "Note: Stripping common suffix of '%s' from names\n" csf
152 2922d2c5 René Nussbaumer
153 2922d2c5 René Nussbaumer
-- | Main function.
154 2922d2c5 René Nussbaumer
main :: Options -> [String] -> IO ()
155 2922d2c5 René Nussbaumer
main opts args = do
156 707cd3d7 Helga Velroyen
  unless (null args) $ exitErr "This program doesn't take any arguments."
157 2922d2c5 René Nussbaumer
158 2922d2c5 René Nussbaumer
  let verbose = optVerbose opts
159 2922d2c5 René Nussbaumer
      shownodes = optShowNodes opts
160 2922d2c5 René Nussbaumer
      showinsts = optShowInsts opts
161 2922d2c5 René Nussbaumer
162 2922d2c5 René Nussbaumer
  (ClusterData gl fixed_nl ilf ctags ipol) <- loadExternalData opts
163 2922d2c5 René Nussbaumer
164 14fbd75b René Nussbaumer
  putStrLn $ "Loaded cluster tags: " ++ intercalate "," ctags
165 14fbd75b René Nussbaumer
166 5b11f8db Iustin Pop
  when (verbose > 2) .
167 2922d2c5 René Nussbaumer
       putStrLn $ "Loaded cluster ipolicy: " ++ show ipol
168 2922d2c5 René Nussbaumer
169 2922d2c5 René Nussbaumer
  nlf <- setNodeStatus opts fixed_nl
170 2922d2c5 René Nussbaumer
171 19e310cc René Nussbaumer
  commonInfo verbose gl nlf ilf
172 19e310cc René Nussbaumer
173 19e310cc René Nussbaumer
  splitInstancesInfo verbose nlf ilf
174 2922d2c5 René Nussbaumer
175 d0a14556 René Nussbaumer
  showGroupInfo verbose gl nlf ilf
176 d0a14556 René Nussbaumer
177 2922d2c5 René Nussbaumer
  maybePrintInsts showinsts "Instances" (Cluster.printInsts nlf ilf)
178 2922d2c5 René Nussbaumer
179 2922d2c5 René Nussbaumer
  maybePrintNodes shownodes "Cluster" (Cluster.printNodes nlf)
180 2922d2c5 René Nussbaumer
181 2922d2c5 René Nussbaumer
  printf "Cluster coefficients:\n%s" (Cluster.printStats "  " nlf)::IO ()
182 2922d2c5 René Nussbaumer
  printf "Cluster score: %.8f\n" (Cluster.compCV nlf)