diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py index 431bc17464e3774c86423eb94673be527fc8caab..56f2b851c3afdd399509848aba20e506fe50ba6c 100644 --- a/lib/client/gnt_instance.py +++ b/lib/client/gnt_instance.py @@ -245,97 +245,30 @@ def ListInstances(opts, args): """ selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS) - output = GetClient().QueryInstances(args, selected_fields, opts.do_locking) - - if not opts.no_headers: - headers = { - "name": "Instance", "os": "OS", "pnode": "Primary_node", - "snodes": "Secondary_Nodes", "admin_state": "Autostart", - "oper_state": "Running", - "oper_ram": "Memory", "disk_template": "Disk_template", - "oper_vcpus": "VCPUs", - "ip": "IP_address", "mac": "MAC_address", - "nic_mode": "NIC_Mode", "nic_link": "NIC_Link", - "bridge": "Bridge", - "sda_size": "Disk/0", "sdb_size": "Disk/1", - "disk_usage": "DiskUsage", - "status": "Status", "tags": "Tags", - "network_port": "Network_port", - "hv/kernel_path": "Kernel_path", - "hv/initrd_path": "Initrd_path", - "hv/boot_order": "Boot_order", - "hv/acpi": "ACPI", - "hv/pae": "PAE", - "hv/cdrom_image_path": "CDROM_image_path", - "hv/nic_type": "NIC_type", - "hv/disk_type": "Disk_type", - "hv/vnc_bind_address": "VNC_bind_address", - "serial_no": "SerialNo", "hypervisor": "Hypervisor", - "hvparams": "Hypervisor_parameters", - "be/memory": "Configured_memory", - "be/vcpus": "VCPUs", - "vcpus": "VCPUs", - "be/auto_balance": "Auto_balance", - "disk.count": "Disks", "disk.sizes": "Disk_sizes", - "nic.count": "NICs", "nic.ips": "NIC_IPs", - "nic.modes": "NIC_modes", "nic.links": "NIC_links", - "nic.bridges": "NIC_bridges", "nic.macs": "NIC_MACs", - "ctime": "CTime", "mtime": "MTime", "uuid": "UUID", - } - else: - headers = None - - unitfields = ["be/memory", "oper_ram", "sd(a|b)_size", "disk\.size/.*"] - numfields = ["be/memory", "oper_ram", "sd(a|b)_size", "be/vcpus", - "serial_no", "(disk|nic)\.count", "disk\.size/.*"] - - list_type_fields = ("tags", "disk.sizes", "nic.macs", "nic.ips", - "nic.modes", "nic.links", "nic.bridges") - # change raw values to nicer strings - for row in output: - for idx, field in enumerate(selected_fields): - val = row[idx] - if field == "snodes": - val = ",".join(val) or "-" - elif field == "admin_state": - if val: - val = "yes" - else: - val = "no" - elif field == "oper_state": - if val is None: - val = "(node down)" - elif val: # True - val = "running" - else: - val = "stopped" - elif field == "oper_ram": - if val is None: - val = "(node down)" - elif field == "oper_vcpus": - if val is None: - val = "(node down)" - elif field == "sda_size" or field == "sdb_size": - if val is None: - val = "N/A" - elif field == "ctime" or field == "mtime": - val = utils.FormatTime(val) - elif field in list_type_fields: - val = ",".join(str(item) for item in val) - elif val is None: - val = "-" - if opts.roman_integers and isinstance(val, int): - val = compat.TryToRoman(val) - row[idx] = str(val) - - data = GenerateTable(separator=opts.separator, headers=headers, - fields=selected_fields, unitfields=unitfields, - numfields=numfields, data=output, units=opts.units) - - for line in data: - ToStdout(line) + fmtoverride = dict.fromkeys(["tags", "disk.sizes", "nic.macs", "nic.ips", + "nic.modes", "nic.links", "nic.bridges", + "snodes"], + (lambda value: ",".join(str(item) + for item in value), + False)) - return 0 + return GenericList(constants.QR_INSTANCE, selected_fields, args, opts.units, + opts.separator, not opts.no_headers, + format_override=fmtoverride) + + +def ListInstanceFields(opts, args): + """List instance fields. + + @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 GenericListFields(constants.QR_INSTANCE, args, opts.separator, + not opts.no_headers) def AddInstance(opts, args): @@ -1421,21 +1354,18 @@ commands = { "Show information on the specified instance(s)"), 'list': ( ListInstances, ARGS_MANY_INSTANCES, - [NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, SYNC_OPT, ROMAN_OPT], + [NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT], "[<instance>...]", - "Lists the instances and their status. The available fields are" - " (see the man page for details): status, oper_state, oper_ram," - " oper_vcpus, name, os, pnode, snodes, admin_state, admin_ram," - " disk_template, ip, mac, nic_mode, nic_link, sda_size, sdb_size," - " vcpus, serial_no," - " nic.count, nic.mac/N, nic.ip/N, nic.mode/N, nic.link/N," - " nic.macs, nic.ips, nic.modes, nic.links," - " disk.count, disk.size/N, disk.sizes," - " hv/NAME, be/memory, be/vcpus, be/auto_balance," - " hypervisor." - " The default field" - " list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS), + "Lists the instances and their status. The available fields can be shown" + " using the \"list-fields\" command (see the man page for details)." + " The default field list is (in order): %s." % + utils.CommaJoin(_LIST_DEF_FIELDS), ), + "list-fields": ( + ListInstanceFields, [ArgUnknown()], + [NOHDR_OPT, SEP_OPT], + "[fields...]", + "Lists all available fields for instances"), 'reinstall': ( ReinstallInstance, [ArgInstance()], [FORCE_OPT, OS_OPT, FORCE_VARIANT_OPT, m_force_multi, m_node_opt, diff --git a/man/gnt-instance.rst b/man/gnt-instance.rst index ae5ce466cf4d2ceed4d9d7c448efe93467ee8330..3814a889dd998d7277137bcaca2fa899b998ca78 100644 --- a/man/gnt-instance.rst +++ b/man/gnt-instance.rst @@ -620,7 +620,7 @@ LIST | **list** | [--no-headers] [--separator=*SEPARATOR*] [--units=*UNITS*] -| [-o *[+]FIELD,...*] [--roman] [instance...] +| [-o *[+]FIELD,...*] [instance...] Shows the currently configured instances with memory usage, disk usage, the node they are running on, and their run status. @@ -637,9 +637,6 @@ option is given, then the values are shown in mebibytes to allow parsing by scripts. In both cases, the ``--units`` option can be used to enforce a given output unit. -The ``--roman`` option allows latin people to better understand the -cluster instances' status. - The ``-o`` option takes a comma-separated list of output fields. The available fields and their meaning are: @@ -816,6 +813,15 @@ a reduced set of output fields. The default output field list is: name, os, pnode, admin\_state, oper\_state, oper\_ram. + +LIST-FIELDS +~~~~~~~~~~ + +**list-fields** [field...] + +Lists available fields for instances. + + INFO ^^^^