Statistics
| Branch: | Tag: | Revision:

root / scripts / gnt-os @ 5661b908

History | View | Annotate | Download (3.9 kB)

1 a8083063 Iustin Pop
#!/usr/bin/python
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 a8083063 Iustin Pop
# Copyright (C) 2006, 2007 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 2f79bd34 Iustin Pop
# pylint: disable-msg=W0401,W0614
23 2f79bd34 Iustin Pop
# W0401: Wildcard import ganeti.cli
24 2f79bd34 Iustin Pop
# W0614: Unused import %s from wildcard import (since we need cli)
25 2f79bd34 Iustin Pop
26 a8083063 Iustin Pop
import sys
27 a8083063 Iustin Pop
from optparse import make_option
28 a8083063 Iustin Pop
29 a8083063 Iustin Pop
from ganeti.cli import *
30 a8083063 Iustin Pop
from ganeti import opcodes
31 a8083063 Iustin Pop
from ganeti import utils
32 1f9430d6 Iustin Pop
from ganeti import constants
33 216fe2f3 Guido Trotter
34 fbdb07b9 Guido Trotter
35 a8083063 Iustin Pop
def ListOS(opts, args):
36 6099bfcf Iustin Pop
  """List the valid OSes in the cluster.
37 6099bfcf Iustin Pop
38 6099bfcf Iustin Pop
  @param opts: the command line options selected by the user
39 6099bfcf Iustin Pop
  @type args: list
40 6099bfcf Iustin Pop
  @param args: should be an empty list
41 6099bfcf Iustin Pop
  @rtype: int
42 6099bfcf Iustin Pop
  @return: the desired exit code
43 a8083063 Iustin Pop
44 a8083063 Iustin Pop
  """
45 1f9430d6 Iustin Pop
  op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
46 a8083063 Iustin Pop
  result = SubmitOpCode(op)
47 a8083063 Iustin Pop
48 a8083063 Iustin Pop
  if not result:
49 3a24c527 Iustin Pop
    ToStderr("Can't get the OS list")
50 a8083063 Iustin Pop
    return 1
51 a8083063 Iustin Pop
52 a8083063 Iustin Pop
  if not opts.no_headers:
53 606d909d Michael Hanselmann
    headers = {"name": "Name"}
54 606d909d Michael Hanselmann
  else:
55 606d909d Michael Hanselmann
    headers = None
56 a8083063 Iustin Pop
57 16be8703 Iustin Pop
  data = GenerateTable(separator=None, headers=headers, fields=["name"],
58 9fbfbb7b Iustin Pop
                       data=[[row[0]] for row in result if row[1]],
59 9fbfbb7b Iustin Pop
                       units=None)
60 16be8703 Iustin Pop
61 16be8703 Iustin Pop
  for line in data:
62 3a24c527 Iustin Pop
    ToStdout(line)
63 a8083063 Iustin Pop
64 a8083063 Iustin Pop
  return 0
65 a8083063 Iustin Pop
66 b07a9f05 Guido Trotter
67 a8083063 Iustin Pop
def DiagnoseOS(opts, args):
68 a8083063 Iustin Pop
  """Analyse all OSes on this cluster.
69 a8083063 Iustin Pop
70 6099bfcf Iustin Pop
  @param opts: the command line options selected by the user
71 6099bfcf Iustin Pop
  @type args: list
72 6099bfcf Iustin Pop
  @param args: should be an empty list
73 6099bfcf Iustin Pop
  @rtype: int
74 6099bfcf Iustin Pop
  @return: the desired exit code
75 6099bfcf Iustin Pop
76 a8083063 Iustin Pop
  """
77 1f9430d6 Iustin Pop
  op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "node_status"],
78 1f9430d6 Iustin Pop
                            names=[])
79 a8083063 Iustin Pop
  result = SubmitOpCode(op)
80 a8083063 Iustin Pop
81 a8083063 Iustin Pop
  if not result:
82 3a24c527 Iustin Pop
    ToStderr("Can't get the OS list")
83 a8083063 Iustin Pop
    return 1
84 a8083063 Iustin Pop
85 a2656173 Michael Hanselmann
  has_bad = False
86 a2656173 Michael Hanselmann
87 1f9430d6 Iustin Pop
  for os_name, os_valid, node_data in result:
88 b07a9f05 Guido Trotter
    nodes_valid = {}
89 a8083063 Iustin Pop
    nodes_bad = {}
90 1f9430d6 Iustin Pop
    nodes_hidden = {}
91 1f9430d6 Iustin Pop
    for node_name, node_info in node_data.iteritems():
92 1f9430d6 Iustin Pop
      nodes_hidden[node_name] = []
93 1f9430d6 Iustin Pop
      if node_info: # at least one entry in the per-node list
94 1f9430d6 Iustin Pop
        first_os_status, first_os_path = node_info.pop(0)
95 48f85f75 Guido Trotter
        first_os_msg = ("%s (path: %s)" %
96 1f9430d6 Iustin Pop
                        (first_os_status, first_os_path))
97 1f9430d6 Iustin Pop
        if first_os_status == constants.OS_VALID_STATUS:
98 48f85f75 Guido Trotter
          nodes_valid[node_name] = first_os_msg
99 b07a9f05 Guido Trotter
        else:
100 48f85f75 Guido Trotter
          nodes_bad[node_name] = first_os_msg
101 1f9430d6 Iustin Pop
        for hstatus, hpath in node_info:
102 1f9430d6 Iustin Pop
          nodes_hidden[node_name].append("    [hidden] path: %s, status: %s" %
103 1f9430d6 Iustin Pop
                                         (hpath, hstatus))
104 a8083063 Iustin Pop
      else:
105 b07a9f05 Guido Trotter
        nodes_bad[node_name] = "OS not found"
106 a8083063 Iustin Pop
107 a8083063 Iustin Pop
    if nodes_valid and not nodes_bad:
108 a8083063 Iustin Pop
      status = "valid"
109 a8083063 Iustin Pop
    elif not nodes_valid and nodes_bad:
110 a8083063 Iustin Pop
      status = "invalid"
111 a2656173 Michael Hanselmann
      has_bad = True
112 a8083063 Iustin Pop
    else:
113 a8083063 Iustin Pop
      status = "partial valid"
114 a2656173 Michael Hanselmann
      has_bad = True
115 694e2444 Guido Trotter
116 48f85f75 Guido Trotter
    def _OutputPerNodeOSStatus(msg_map):
117 48f85f75 Guido Trotter
      map_k = utils.NiceSort(msg_map.keys())
118 b07a9f05 Guido Trotter
      for node_name in map_k:
119 3a24c527 Iustin Pop
        ToStdout("  Node: %s, status: %s", node_name, msg_map[node_name])
120 1f9430d6 Iustin Pop
        for msg in nodes_hidden[node_name]:
121 3a24c527 Iustin Pop
          ToStdout(msg)
122 b07a9f05 Guido Trotter
123 3a24c527 Iustin Pop
    ToStdout("OS: %s [global status: %s]", os_name, status)
124 b07a9f05 Guido Trotter
    _OutputPerNodeOSStatus(nodes_valid)
125 b07a9f05 Guido Trotter
    _OutputPerNodeOSStatus(nodes_bad)
126 3a24c527 Iustin Pop
    ToStdout("")
127 a8083063 Iustin Pop
128 a2656173 Michael Hanselmann
  return int(has_bad)
129 a2656173 Michael Hanselmann
130 a8083063 Iustin Pop
131 a8083063 Iustin Pop
commands = {
132 9a033156 Iustin Pop
  'list': (ListOS, ARGS_NONE, [DEBUG_OPT, NOHDR_OPT], "",
133 a8083063 Iustin Pop
           "Lists all valid OSes on the master"),
134 9a033156 Iustin Pop
  'diagnose': (DiagnoseOS, ARGS_NONE, [DEBUG_OPT], "",
135 a8083063 Iustin Pop
               "Diagnose all OSes"),
136 a8083063 Iustin Pop
  }
137 a8083063 Iustin Pop
138 a8083063 Iustin Pop
if __name__ == '__main__':
139 3ecf6786 Iustin Pop
  sys.exit(GenericMain(commands))