Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / HTools / Program / Hinfo.hs @ c32c4e4d

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