4 # Copyright (C) 2006, 2007 Google Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 from optparse import make_option
25 from ganeti.cli import *
26 from ganeti import opcodes
27 from ganeti import logger
28 from ganeti import objects
29 from ganeti import utils
30 from ganeti import errors
31 from ganeti import constants
34 def ListOS(opts, args):
35 """List the OSes existing on this node.
38 op = opcodes.OpDiagnoseOS(output_fields=["name", "valid"], names=[])
39 result = SubmitOpCode(op)
42 logger.ToStdout("Can't get the OS list")
45 if not opts.no_headers:
46 headers = {"name": "Name"}
50 data = GenerateTable(separator=None, headers=headers, fields=["name"],
51 data=[[row[0]] for row in result if row[1]])
59 def DiagnoseOS(opts, args):
60 """Analyse all OSes on this cluster.
63 op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "node_status"],
65 result = SubmitOpCode(op)
68 logger.ToStdout("Can't get the OS list")
73 for os_name, os_valid, node_data in result:
77 for node_name, node_info in node_data.iteritems():
78 nodes_hidden[node_name] = []
79 if node_info: # at least one entry in the per-node list
80 first_os_status, first_os_path = node_info.pop(0)
81 first_os_msg = ("%s (path: %s)" %
82 (first_os_status, first_os_path))
83 if first_os_status == constants.OS_VALID_STATUS:
84 nodes_valid[node_name] = first_os_msg
86 nodes_bad[node_name] = first_os_msg
87 for hstatus, hpath in node_info:
88 nodes_hidden[node_name].append(" [hidden] path: %s, status: %s" %
91 nodes_bad[node_name] = "OS not found"
93 if nodes_valid and not nodes_bad:
95 elif not nodes_valid and nodes_bad:
99 status = "partial valid"
102 def _OutputPerNodeOSStatus(msg_map):
103 map_k = utils.NiceSort(msg_map.keys())
104 for node_name in map_k:
105 logger.ToStdout(" Node: %s, status: %s" %
106 (node_name, msg_map[node_name]))
107 for msg in nodes_hidden[node_name]:
110 logger.ToStdout("OS: %s [global status: %s]" % (os_name, status))
111 _OutputPerNodeOSStatus(nodes_valid)
112 _OutputPerNodeOSStatus(nodes_bad)
119 'list': (ListOS, ARGS_NONE, [DEBUG_OPT, NOHDR_OPT], "",
120 "Lists all valid OSes on the master"),
121 'diagnose': (DiagnoseOS, ARGS_NONE, [DEBUG_OPT], "",
122 "Diagnose all OSes"),
125 if __name__ == '__main__':
126 sys.exit(GenericMain(commands))