Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / Program / Hinfo.hs @ 5b11f8db

History | View | Annotate | Download (5.1 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 2922d2c5 René Nussbaumer
module Ganeti.HTools.Program.Hinfo (main, options) where
27 2922d2c5 René Nussbaumer
28 2922d2c5 René Nussbaumer
import Control.Monad
29 2922d2c5 René Nussbaumer
import Data.List
30 2922d2c5 René Nussbaumer
import System.Exit
31 2922d2c5 René Nussbaumer
import System.IO
32 2922d2c5 René Nussbaumer
33 2922d2c5 René Nussbaumer
import Text.Printf (printf)
34 2922d2c5 René Nussbaumer
35 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Container as Container
36 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Cluster as Cluster
37 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Node as Node
38 19e310cc René Nussbaumer
import qualified Ganeti.HTools.Group as Group
39 2922d2c5 René Nussbaumer
import qualified Ganeti.HTools.Instance as Instance
40 2922d2c5 René Nussbaumer
41 19e310cc René Nussbaumer
import Ganeti.HTools.Utils
42 2922d2c5 René Nussbaumer
import Ganeti.HTools.CLI
43 2922d2c5 René Nussbaumer
import Ganeti.HTools.ExtLoader
44 2922d2c5 René Nussbaumer
import Ganeti.HTools.Loader
45 2922d2c5 René Nussbaumer
46 2922d2c5 René Nussbaumer
-- | Options list and functions.
47 2922d2c5 René Nussbaumer
options :: [OptType]
48 2922d2c5 René Nussbaumer
options =
49 2922d2c5 René Nussbaumer
  [ oPrintNodes
50 2922d2c5 René Nussbaumer
  , oPrintInsts
51 2922d2c5 René Nussbaumer
  , oDataFile
52 2922d2c5 René Nussbaumer
  , oRapiMaster
53 2922d2c5 René Nussbaumer
  , oLuxiSocket
54 0547d608 René Nussbaumer
  , oIAllocSrc
55 2922d2c5 René Nussbaumer
  , oVerbose
56 2922d2c5 René Nussbaumer
  , oQuiet
57 2922d2c5 René Nussbaumer
  , oOfflineNode
58 2922d2c5 René Nussbaumer
  , oShowVer
59 2922d2c5 René Nussbaumer
  , oShowHelp
60 2922d2c5 René Nussbaumer
  ]
61 2922d2c5 René Nussbaumer
62 d0a14556 René Nussbaumer
-- | Node group statistics.
63 d0a14556 René Nussbaumer
calcGroupInfo :: Group.Group
64 d0a14556 René Nussbaumer
              -> Node.List
65 d0a14556 René Nussbaumer
              -> Instance.List
66 d0a14556 René Nussbaumer
              -> (String, (Int, Int), (Int, Int), Bool)
67 d0a14556 René Nussbaumer
calcGroupInfo g nl il =
68 d0a14556 René Nussbaumer
  let nl_size                    = Container.size nl
69 d0a14556 René Nussbaumer
      il_size                    = Container.size il
70 d0a14556 René Nussbaumer
      (bad_nodes, bad_instances) = Cluster.computeBadItems nl il
71 d0a14556 René Nussbaumer
      bn_size                    = length bad_nodes
72 d0a14556 René Nussbaumer
      bi_size                    = length bad_instances
73 d0a14556 René Nussbaumer
      n1h                        = bn_size == 0
74 d0a14556 René Nussbaumer
  in (Group.name g, (nl_size, il_size), (bn_size, bi_size), n1h)
75 d0a14556 René Nussbaumer
76 d0a14556 René Nussbaumer
-- | Helper to format one group row result.
77 d0a14556 René Nussbaumer
groupRowFormatHelper :: (String, (Int, Int), (Int, Int), Bool) -> [String]
78 d0a14556 René Nussbaumer
groupRowFormatHelper (gname, (nl_size, il_size), (bn_size, bi_size), n1h) =
79 d0a14556 René Nussbaumer
  [ gname
80 d0a14556 René Nussbaumer
  , printf "%d" nl_size
81 d0a14556 René Nussbaumer
  , printf "%d" il_size
82 d0a14556 René Nussbaumer
  , printf "%d" bn_size
83 d0a14556 René Nussbaumer
  , printf "%d" bi_size
84 d0a14556 René Nussbaumer
  , show n1h ]
85 d0a14556 René Nussbaumer
86 d0a14556 René Nussbaumer
-- | Print node group information.
87 d0a14556 René Nussbaumer
showGroupInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
88 d0a14556 René Nussbaumer
showGroupInfo verbose gl nl il = do
89 d0a14556 René Nussbaumer
  let cgrs   = map (\(gdx, (gnl, gil)) ->
90 d0a14556 René Nussbaumer
                 calcGroupInfo (Container.find gdx gl) gnl gil) $
91 d0a14556 René Nussbaumer
                 Cluster.splitCluster nl il
92 d0a14556 René Nussbaumer
      cn1h   = all (\(_, _, _, n1h) -> n1h) cgrs
93 d0a14556 René Nussbaumer
      grs    = map groupRowFormatHelper cgrs
94 d0a14556 René Nussbaumer
      header = ["Group", "Nodes", "Instances", "Bad_Nodes", "Bad_Instances",
95 d0a14556 René Nussbaumer
                "N+1"]
96 d0a14556 René Nussbaumer
97 d0a14556 René Nussbaumer
  when (verbose > 1) $
98 d0a14556 René Nussbaumer
    printf "Node group information:\n%s"
99 d0a14556 René Nussbaumer
           (printTable "  " header grs [False, True, True, True, True, False])
100 d0a14556 René Nussbaumer
101 d0a14556 René Nussbaumer
  printf "Cluster is N+1 %s\n" $ if cn1h then "happy" else "unhappy"
102 d0a14556 René Nussbaumer
103 d0a14556 René Nussbaumer
-- | Gather and print split instances.
104 19e310cc René Nussbaumer
splitInstancesInfo :: Int -> Node.List -> Instance.List -> IO ()
105 19e310cc René Nussbaumer
splitInstancesInfo verbose nl il = do
106 2922d2c5 René Nussbaumer
  let split_insts = Cluster.findSplitInstances nl il
107 5b11f8db Iustin Pop
  if null split_insts
108 19e310cc René Nussbaumer
    then
109 5b11f8db Iustin Pop
      when (verbose > 1) $
110 19e310cc René Nussbaumer
        putStrLn "No split instances found"::IO ()
111 19e310cc René Nussbaumer
    else do
112 19e310cc René Nussbaumer
      putStrLn "Found instances belonging to multiple node groups:"
113 19e310cc René Nussbaumer
      mapM_ (\i -> hPutStrLn stderr $ "  " ++ Instance.name i) split_insts
114 19e310cc René Nussbaumer
115 d0a14556 René Nussbaumer
-- | Print common (interesting) information.
116 19e310cc René Nussbaumer
commonInfo :: Int -> Group.List -> Node.List -> Instance.List -> IO ()
117 19e310cc René Nussbaumer
commonInfo verbose gl nl il = do
118 5b11f8db Iustin Pop
  when (Container.null il && verbose > 1) $
119 5b11f8db Iustin Pop
    printf "Cluster is empty.\n"::IO ()
120 19e310cc René Nussbaumer
121 5b11f8db Iustin Pop
  let nl_size = Container.size nl
122 5b11f8db Iustin Pop
      il_size = Container.size il
123 5b11f8db Iustin Pop
      gl_size = Container.size gl
124 19e310cc René Nussbaumer
  printf "Loaded %d %s, %d %s, %d %s\n"
125 19e310cc René Nussbaumer
             nl_size (plural nl_size "node" "nodes")
126 19e310cc René Nussbaumer
             il_size (plural il_size "instance" "instances")
127 19e310cc René Nussbaumer
             gl_size (plural gl_size "node group" "node groups")::IO ()
128 2922d2c5 René Nussbaumer
129 2922d2c5 René Nussbaumer
  let csf = commonSuffix nl il
130 14fbd75b René Nussbaumer
  when (not (null csf) && verbose > 2) $
131 2922d2c5 René Nussbaumer
       printf "Note: Stripping common suffix of '%s' from names\n" csf
132 2922d2c5 René Nussbaumer
133 2922d2c5 René Nussbaumer
-- | Main function.
134 2922d2c5 René Nussbaumer
main :: Options -> [String] -> IO ()
135 2922d2c5 René Nussbaumer
main opts args = do
136 2922d2c5 René Nussbaumer
  unless (null args) $ do
137 2922d2c5 René Nussbaumer
         hPutStrLn stderr "Error: this program doesn't take any arguments."
138 2922d2c5 René Nussbaumer
         exitWith $ ExitFailure 1
139 2922d2c5 René Nussbaumer
140 2922d2c5 René Nussbaumer
  let verbose = optVerbose opts
141 2922d2c5 René Nussbaumer
      shownodes = optShowNodes opts
142 2922d2c5 René Nussbaumer
      showinsts = optShowInsts opts
143 2922d2c5 René Nussbaumer
144 2922d2c5 René Nussbaumer
  (ClusterData gl fixed_nl ilf ctags ipol) <- loadExternalData opts
145 2922d2c5 René Nussbaumer
146 14fbd75b René Nussbaumer
  putStrLn $ "Loaded cluster tags: " ++ intercalate "," ctags
147 14fbd75b René Nussbaumer
148 5b11f8db Iustin Pop
  when (verbose > 2) .
149 2922d2c5 René Nussbaumer
       putStrLn $ "Loaded cluster ipolicy: " ++ show ipol
150 2922d2c5 René Nussbaumer
151 2922d2c5 René Nussbaumer
  nlf <- setNodeStatus opts fixed_nl
152 2922d2c5 René Nussbaumer
153 19e310cc René Nussbaumer
  commonInfo verbose gl nlf ilf
154 19e310cc René Nussbaumer
155 19e310cc René Nussbaumer
  splitInstancesInfo verbose nlf ilf
156 2922d2c5 René Nussbaumer
157 d0a14556 René Nussbaumer
  showGroupInfo verbose gl nlf ilf
158 d0a14556 René Nussbaumer
159 2922d2c5 René Nussbaumer
  maybePrintInsts showinsts "Instances" (Cluster.printInsts nlf ilf)
160 2922d2c5 René Nussbaumer
161 2922d2c5 René Nussbaumer
  maybePrintNodes shownodes "Cluster" (Cluster.printNodes nlf)
162 2922d2c5 René Nussbaumer
163 2922d2c5 René Nussbaumer
  printf "Cluster coefficients:\n%s" (Cluster.printStats "  " nlf)::IO ()
164 2922d2c5 René Nussbaumer
  printf "Cluster score: %.8f\n" (Cluster.compCV nlf)