Statistics
| Branch: | Tag: | Revision:

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

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