Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / HTools / Program / Hinfo.hs @ 2d6bdcc5

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