import sys
from ganeti.cli import *
+from ganeti import constants
from ganeti import opcodes
from ganeti import utils
return 0
+def ShowOSInfo(opts, args):
+ """List detailed information about OSes in the cluster.
+
+ @param opts: the command line options selected by the user
+ @type args: list
+ @param args: should be an empty list
+ @rtype: int
+ @return: the desired exit code
+
+ """
+ op = opcodes.OpDiagnoseOS(output_fields=["name", "valid", "variants",
+ "parameters", "api_versions"],
+ names=[])
+ result = SubmitOpCode(op, opts=opts)
+
+ if not result:
+ ToStderr("Can't get the OS list")
+ return 1
+
+ do_filter = bool(args)
+
+ for (name, valid, variants, parameters, api_versions) in result:
+ if do_filter:
+ if name not in args:
+ continue
+ else:
+ args.remove(name)
+ ToStdout("%s:", name)
+ ToStdout(" - valid: %s", valid)
+ if valid:
+ ToStdout(" - API versions:")
+ for version in sorted(api_versions):
+ ToStdout(" - %s", version)
+ ToStdout(" - variants:")
+ for vname in variants:
+ ToStdout(" - %s", vname)
+ ToStdout(" - parameters:")
+ for pname, pdesc in parameters:
+ ToStdout(" - %s: %s", pname, pdesc)
+ ToStdout("")
+
+ if args:
+ for name in args:
+ ToStdout("%s: ", name)
+ ToStdout("")
+
+ return 0
+
+
def _OsStatus(status, diagnose):
"""Beautifier function for OS status.
for node_name, node_info in node_data.iteritems():
nodes_hidden[node_name] = []
if node_info: # at least one entry in the per-node list
- (first_os_path, first_os_status, first_os_msg,
- first_os_variants, _, first_os_api) = node_info.pop(0)
- if not first_os_variants:
- first_os_variants = []
- first_os_msg = ("%s (path: %s) [variants: %s] [api: %s]" %
- (_OsStatus(first_os_status, first_os_msg),
- first_os_path, utils.CommaJoin(first_os_variants),
- utils.CommaJoin(first_os_api)))
- if first_os_status:
- nodes_valid[node_name] = first_os_msg
+ (fo_path, fo_status, fo_msg, fo_variants,
+ fo_params, fo_api) = node_info.pop(0)
+ fo_msg = "%s (path: %s)" % (_OsStatus(fo_status, fo_msg), fo_path)
+ if fo_api:
+ max_os_api = max(fo_api)
+ fo_msg += " [API versions: %s]" % utils.CommaJoin(fo_api)
+ else:
+ max_os_api = 0
+ fo_msg += " [no API versions declared]"
+ if max_os_api >= constants.OS_API_V15:
+ if fo_variants:
+ fo_msg += " [variants: %s]" % utils.CommaJoin(fo_variants)
+ else:
+ fo_msg += " [no variants]"
+ if max_os_api >= constants.OS_API_V20:
+ if fo_params:
+ fo_msg += (" [parameters: %s]" %
+ utils.CommaJoin([v[0] for v in fo_params]))
+ else:
+ fo_msg += " [no parameters]"
+ if fo_status:
+ nodes_valid[node_name] = fo_msg
else:
- nodes_bad[node_name] = first_os_msg
+ nodes_bad[node_name] = fo_msg
for hpath, hstatus, hmsg, _, _, _ in node_info:
nodes_hidden[node_name].append(" [hidden] path: %s, status: %s" %
(hpath, _OsStatus(hstatus, hmsg)))
" on the cluster"),
'diagnose': (
DiagnoseOS, ARGS_NONE, [], "", "Diagnose all operating systems"),
+ 'info': (
+ ShowOSInfo, [ArgOs()], [], "", "Show detailed information about "
+ "operating systems"),
'modify': (
ModifyOS, ARGS_ONE_OS, [HVLIST_OPT, OSPARAMS_OPT], "",
"Modify the OS parameters"),