Statistics
| Branch: | Tag: | Revision:

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

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 d66aa238 Iustin Pop
options :: IO [OptType]
52 2922d2c5 René Nussbaumer
options =
53 d66aa238 Iustin Pop
  return
54 d66aa238 Iustin Pop
    [ oPrintNodes
55 d66aa238 Iustin Pop
    , oPrintInsts
56 d66aa238 Iustin Pop
    , oDataFile
57 d66aa238 Iustin Pop
    , oRapiMaster
58 d66aa238 Iustin Pop
    , oLuxiSocket
59 d66aa238 Iustin Pop
    , oIAllocSrc
60 d66aa238 Iustin Pop
    , oVerbose
61 d66aa238 Iustin Pop
    , oQuiet
62 d66aa238 Iustin Pop
    , oOfflineNode
63 d66aa238 Iustin Pop
    ]
64 2922d2c5 René Nussbaumer
65 22278fa7 Iustin Pop
-- | The list of arguments supported by the program.
66 22278fa7 Iustin Pop
arguments :: [ArgCompletion]
67 22278fa7 Iustin Pop
arguments = []
68 22278fa7 Iustin Pop
69 da28218d Iustin Pop
-- | Group information data-type.
70 da28218d Iustin Pop
data GroupInfo = GroupInfo { giName      :: String
71 da28218d Iustin Pop
                           , giNodeCount :: Int
72 da28218d Iustin Pop
                           , giInstCount :: Int
73 da28218d Iustin Pop
                           , giBadNodes  :: Int
74 da28218d Iustin Pop
                           , giBadInsts  :: Int
75 da28218d Iustin Pop
                           , giN1Status  :: Bool
76 d1da5a45 Iustin Pop
                           , giScore     :: Double
77 da28218d Iustin Pop
                           }
78 da28218d Iustin Pop
79 d0a14556 René Nussbaumer
-- | Node group statistics.
80 d0a14556 René Nussbaumer
calcGroupInfo :: Group.Group
81 d0a14556 René Nussbaumer
              -> Node.List
82 d0a14556 René Nussbaumer
              -> Instance.List
83 da28218d Iustin Pop
              -> GroupInfo
84 d0a14556 René Nussbaumer
calcGroupInfo g nl il =
85 d0a14556 René Nussbaumer
  let nl_size                    = Container.size nl
86 d0a14556 René Nussbaumer
      il_size                    = Container.size il
87 d0a14556 René Nussbaumer
      (bad_nodes, bad_instances) = Cluster.computeBadItems nl il
88 d0a14556 René Nussbaumer
      bn_size                    = length bad_nodes
89 d0a14556 René Nussbaumer
      bi_size                    = length bad_instances
90 d0a14556 René Nussbaumer
      n1h                        = bn_size == 0
91 d1da5a45 Iustin Pop
      score                      = Cluster.compCV nl
92 d1da5a45 Iustin Pop
  in GroupInfo (Group.name g) nl_size il_size bn_size bi_size n1h score
93 d0a14556 René Nussbaumer
94 d0a14556 René Nussbaumer
-- | Helper to format one group row result.
95 da28218d Iustin Pop
groupRowFormatHelper :: GroupInfo -> [String]
96 da28218d Iustin Pop
groupRowFormatHelper gi =
97 da28218d Iustin Pop
  [ giName gi
98 da28218d Iustin Pop
  , printf "%d" $ giNodeCount gi
99 da28218d Iustin Pop
  , printf "%d" $ giInstCount gi
100 da28218d Iustin Pop
  , printf "%d" $ giBadNodes gi
101 da28218d Iustin Pop
  , printf "%d" $ giBadInsts gi
102 da28218d Iustin Pop
  , show $ giN1Status gi
103 d1da5a45 Iustin Pop
  , printf "%.8f" $ giScore gi
104 da28218d Iustin Pop
  ]
105 d0a14556 René Nussbaumer
106 d0a14556 René Nussbaumer
-- | Print node group information.
107 d0a14556 René Nussbaumer
showGroupInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
108 d0a14556 René Nussbaumer
showGroupInfo verbose gl nl il = do
109 d0a14556 René Nussbaumer
  let cgrs   = map (\(gdx, (gnl, gil)) ->
110 d0a14556 René Nussbaumer
                 calcGroupInfo (Container.find gdx gl) gnl gil) $
111 d0a14556 René Nussbaumer
                 Cluster.splitCluster nl il
112 da28218d Iustin Pop
      cn1h   = all giN1Status cgrs
113 d0a14556 René Nussbaumer
      grs    = map groupRowFormatHelper cgrs
114 d0a14556 René Nussbaumer
      header = ["Group", "Nodes", "Instances", "Bad_Nodes", "Bad_Instances",
115 d1da5a45 Iustin Pop
                "N+1", "Score"]
116 d0a14556 René Nussbaumer
117 d0a14556 René Nussbaumer
  when (verbose > 1) $
118 d0a14556 René Nussbaumer
    printf "Node group information:\n%s"
119 d1da5a45 Iustin Pop
           (printTable "  " header grs [False, True, True, True, True,
120 d1da5a45 Iustin Pop
                                        False, True])
121 d0a14556 René Nussbaumer
122 d0a14556 René Nussbaumer
  printf "Cluster is N+1 %s\n" $ if cn1h then "happy" else "unhappy"
123 d0a14556 René Nussbaumer
124 d0a14556 René Nussbaumer
-- | Gather and print split instances.
125 19e310cc René Nussbaumer
splitInstancesInfo :: Int -> Node.List -> Instance.List -> IO ()
126 19e310cc René Nussbaumer
splitInstancesInfo verbose nl il = do
127 2922d2c5 René Nussbaumer
  let split_insts = Cluster.findSplitInstances nl il
128 5b11f8db Iustin Pop
  if null split_insts
129 19e310cc René Nussbaumer
    then
130 5b11f8db Iustin Pop
      when (verbose > 1) $
131 19e310cc René Nussbaumer
        putStrLn "No split instances found"::IO ()
132 19e310cc René Nussbaumer
    else do
133 19e310cc René Nussbaumer
      putStrLn "Found instances belonging to multiple node groups:"
134 19e310cc René Nussbaumer
      mapM_ (\i -> hPutStrLn stderr $ "  " ++ Instance.name i) split_insts
135 19e310cc René Nussbaumer
136 d0a14556 René Nussbaumer
-- | Print common (interesting) information.
137 19e310cc René Nussbaumer
commonInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
138 19e310cc René Nussbaumer
commonInfo verbose gl nl il = do
139 5b11f8db Iustin Pop
  when (Container.null il && verbose > 1) $
140 5b11f8db Iustin Pop
    printf "Cluster is empty.\n"::IO ()
141 19e310cc René Nussbaumer
142 5b11f8db Iustin Pop
  let nl_size = Container.size nl
143 5b11f8db Iustin Pop
      il_size = Container.size il
144 5b11f8db Iustin Pop
      gl_size = Container.size gl
145 19e310cc René Nussbaumer
  printf "Loaded %d %s, %d %s, %d %s\n"
146 19e310cc René Nussbaumer
             nl_size (plural nl_size "node" "nodes")
147 19e310cc René Nussbaumer
             il_size (plural il_size "instance" "instances")
148 19e310cc René Nussbaumer
             gl_size (plural gl_size "node group" "node groups")::IO ()
149 2922d2c5 René Nussbaumer
150 2922d2c5 René Nussbaumer
  let csf = commonSuffix nl il
151 14fbd75b René Nussbaumer
  when (not (null csf) && verbose > 2) $
152 2922d2c5 René Nussbaumer
       printf "Note: Stripping common suffix of '%s' from names\n" csf
153 2922d2c5 René Nussbaumer
154 2922d2c5 René Nussbaumer
-- | Main function.
155 2922d2c5 René Nussbaumer
main :: Options -> [String] -> IO ()
156 2922d2c5 René Nussbaumer
main opts args = do
157 707cd3d7 Helga Velroyen
  unless (null args) $ exitErr "This program doesn't take any arguments."
158 2922d2c5 René Nussbaumer
159 2922d2c5 René Nussbaumer
  let verbose = optVerbose opts
160 2922d2c5 René Nussbaumer
      shownodes = optShowNodes opts
161 2922d2c5 René Nussbaumer
      showinsts = optShowInsts opts
162 2922d2c5 René Nussbaumer
163 2922d2c5 René Nussbaumer
  (ClusterData gl fixed_nl ilf ctags ipol) <- loadExternalData opts
164 2922d2c5 René Nussbaumer
165 14fbd75b René Nussbaumer
  putStrLn $ "Loaded cluster tags: " ++ intercalate "," ctags
166 14fbd75b René Nussbaumer
167 5b11f8db Iustin Pop
  when (verbose > 2) .
168 2922d2c5 René Nussbaumer
       putStrLn $ "Loaded cluster ipolicy: " ++ show ipol
169 2922d2c5 René Nussbaumer
170 2922d2c5 René Nussbaumer
  nlf <- setNodeStatus opts fixed_nl
171 2922d2c5 René Nussbaumer
172 19e310cc René Nussbaumer
  commonInfo verbose gl nlf ilf
173 19e310cc René Nussbaumer
174 19e310cc René Nussbaumer
  splitInstancesInfo verbose nlf ilf
175 2922d2c5 René Nussbaumer
176 d0a14556 René Nussbaumer
  showGroupInfo verbose gl nlf ilf
177 d0a14556 René Nussbaumer
178 2922d2c5 René Nussbaumer
  maybePrintInsts showinsts "Instances" (Cluster.printInsts nlf ilf)
179 2922d2c5 René Nussbaumer
180 2922d2c5 René Nussbaumer
  maybePrintNodes shownodes "Cluster" (Cluster.printNodes nlf)
181 2922d2c5 René Nussbaumer
182 2922d2c5 René Nussbaumer
  printf "Cluster coefficients:\n%s" (Cluster.printStats "  " nlf)::IO ()
183 2922d2c5 René Nussbaumer
  printf "Cluster score: %.8f\n" (Cluster.compCV nlf)