Statistics
| Branch: | Tag: | Revision:

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

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