diff --git a/lib/client/gnt_group.py b/lib/client/gnt_group.py index d3b477becf6c557f2c265fce76bfceb6eb36eafe..f4578aac8f4908a171afa44b32bfd9e198d8041d 100644 --- a/lib/client/gnt_group.py +++ b/lib/client/gnt_group.py @@ -25,7 +25,7 @@ # W0614: Unused import %s from wildcard import (since we need cli) from ganeti.cli import * -from ganeti import compat +from ganeti import constants from ganeti import opcodes from ganeti import utils @@ -34,15 +34,6 @@ from ganeti import utils _LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy"] -#: headers (and full field list) for L{ListGroups} -_LIST_HEADERS = { - "name": "Group", "uuid": "UUID", "alloc_policy": "AllocPolicy", - "node_cnt": "Nodes", "node_list": "NodeList", - "pinst_cnt": "Instances", "pinst_list": "InstanceList", - "ctime": "CTime", "mtime": "MTime", "serial_no": "SerialNo", -} - - def AddGroup(opts, args): """Add a node group to the cluster. @@ -70,40 +61,25 @@ def ListGroups(opts, args): """ desired_fields = ParseFields(opts.output, _LIST_DEF_FIELDS) + fmtoverride = dict.fromkeys(["node_list", "pinst_list"], (",".join, False)) - output = GetClient().QueryGroups(args, desired_fields, opts.do_locking) - - if opts.no_headers: - headers = None - else: - headers = _LIST_HEADERS - - int_type_fields = frozenset(["node_cnt", "pinst_cnt", "serial_no"]) - list_type_fields = frozenset(["node_list", "pinst_list"]) - date_type_fields = frozenset(["mtime", "ctime"]) - - for row in output: - for idx, field in enumerate(desired_fields): - val = row[idx] - - if field in list_type_fields: - val = ",".join(val) - elif opts.roman_integers and field in int_type_fields: - val = compat.TryToRoman(val) - elif field in date_type_fields: - val = utils.FormatTime(val) - elif val is None: - val = "?" + return GenericList(constants.QR_GROUP, desired_fields, args, None, + opts.separator, not opts.no_headers, + format_override=fmtoverride) - row[idx] = str(val) - data = GenerateTable(separator=opts.separator, headers=headers, - fields=desired_fields, data=output) +def ListGroupFields(opts, args): + """List node fields. - for line in data: - ToStdout(line) + @param opts: the command line options selected by the user + @type args: list + @param args: fields to list, or empty for all + @rtype: int + @return: the desired exit code - return 0 + """ + return GenericListFields(constants.QR_GROUP, args, opts.separator, + not opts.no_headers) def SetGroupParams(opts, args): @@ -174,11 +150,14 @@ commands = { "<group_name>", "Add a new node group to the cluster"), "list": ( ListGroups, ARGS_MANY_GROUPS, - [NOHDR_OPT, SEP_OPT, FIELDS_OPT, SYNC_OPT, ROMAN_OPT], + [NOHDR_OPT, SEP_OPT, FIELDS_OPT], "[<group_name>...]", - "Lists the node groups in the cluster. The available fields are (see" - " the man page for details): %s. The default list is (in order): %s." % - (utils.CommaJoin(_LIST_HEADERS), utils.CommaJoin(_LIST_DEF_FIELDS))), + "Lists the node groups in the cluster. The available fields can be shown" + " using the \"list-fields\" command (see the man page for details)." + " The default list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)), + "list-fields": ( + ListGroupFields, [ArgUnknown()], [NOHDR_OPT, SEP_OPT], "[fields...]", + "Lists all available fields for node groups"), "modify": ( SetGroupParams, ARGS_ONE_GROUP, [DRY_RUN_OPT, SUBMIT_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT], diff --git a/man/gnt-group.rst b/man/gnt-group.rst index 6d71f4b051a9f7d9307666df13636aedba3ecb19..712d38cda75158cd9363469d911a8314794f8767 100644 --- a/man/gnt-group.rst +++ b/man/gnt-group.rst @@ -135,6 +135,13 @@ serial_no If no group names are given, then all groups are included. Otherwise, only the named groups will be listed. +LIST-FIELDS +~~~~~~~~~~~ + +**list-fields** [field...] + +List available fields for node groups. + RENAME ~~~~~~