Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / Program / Hinfo.hs @ 14fbd75b

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