Revision 7f5443a0 lib/client/gnt_node.py

b/lib/client/gnt_node.py
31 31
from ganeti import opcodes
32 32
from ganeti import utils
33 33
from ganeti import constants
34
from ganeti import compat
35 34
from ganeti import errors
36 35
from ganeti import netutils
37 36

  
......
60 59
  ]
61 60

  
62 61

  
63
#: headers (and full field list) for L{ListNodes}
64
_LIST_HEADERS = {
65
  "name": "Node", "pinst_cnt": "Pinst", "sinst_cnt": "Sinst",
66
  "pinst_list": "PriInstances", "sinst_list": "SecInstances",
67
  "pip": "PrimaryIP", "sip": "SecondaryIP",
68
  "dtotal": "DTotal", "dfree": "DFree",
69
  "mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree",
70
  "bootid": "BootID",
71
  "ctotal": "CTotal", "cnodes": "CNodes", "csockets": "CSockets",
72
  "tags": "Tags",
73
  "serial_no": "SerialNo",
74
  "master_candidate": "MasterC",
75
  "master": "IsMaster",
76
  "offline": "Offline", "drained": "Drained",
77
  "role": "Role",
78
  "ctime": "CTime", "mtime": "MTime", "uuid": "UUID",
79
  "master_capable": "MasterCapable", "vm_capable": "VMCapable",
80
  "group": "Group", "group.uuid": "GroupUUID",
81
  }
82

  
83

  
84 62
#: headers (and full field list) for L{ListStorage}
85 63
_LIST_STOR_HEADERS = {
86 64
  constants.SF_NODE: "Node",
......
232 210
  """
233 211
  selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
234 212

  
235
  output = GetClient().QueryNodes(args, selected_fields, opts.do_locking)
213
  fmtoverride = dict.fromkeys(["pinst_list", "sinst_list", "tags"],
214
                              (lambda value: ",".join(value), False))
236 215

  
237
  if not opts.no_headers:
238
    headers = _LIST_HEADERS
239
  else:
240
    headers = None
216
  return GenericList(constants.QR_NODE, selected_fields, args, opts.units,
217
                     opts.separator, not opts.no_headers,
218
                     format_override=fmtoverride)
241 219

  
242
  unitfields = ["dtotal", "dfree", "mtotal", "mnode", "mfree"]
243 220

  
244
  numfields = ["dtotal", "dfree",
245
               "mtotal", "mnode", "mfree",
246
               "pinst_cnt", "sinst_cnt",
247
               "ctotal", "serial_no"]
221
def ListNodeFields(opts, args):
222
  """List node fields.
248 223

  
249
  list_type_fields = ("pinst_list", "sinst_list", "tags")
250
  # change raw values to nicer strings
251
  for row in output:
252
    for idx, field in enumerate(selected_fields):
253
      val = row[idx]
254
      if field in list_type_fields:
255
        val = ",".join(val)
256
      elif field in ('master', 'master_candidate', 'offline', 'drained',
257
                     'master_capable', 'vm_capable'):
258
        if val:
259
          val = 'Y'
260
        else:
261
          val = 'N'
262
      elif field == "ctime" or field == "mtime":
263
        val = utils.FormatTime(val)
264
      elif val is None:
265
        val = "?"
266
      elif opts.roman_integers and isinstance(val, int):
267
        val = compat.TryToRoman(val)
268
      row[idx] = str(val)
269

  
270
  data = GenerateTable(separator=opts.separator, headers=headers,
271
                       fields=selected_fields, unitfields=unitfields,
272
                       numfields=numfields, data=output, units=opts.units)
273
  for line in data:
274
    ToStdout(line)
224
  @param opts: the command line options selected by the user
225
  @type args: list
226
  @param args: fields to list, or empty for all
227
  @rtype: int
228
  @return: the desired exit code
275 229

  
276
  return 0
230
  """
231
  return GenericListFields(constants.QR_NODE, args, opts.separator,
232
                           not opts.no_headers)
277 233

  
278 234

  
279 235
def EvacuateNode(opts, args):
......
716 672
    "[<node_name>...]", "Show information about the node(s)"),
717 673
  'list': (
718 674
    ListNodes, ARGS_MANY_NODES,
719
    [NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, SYNC_OPT, ROMAN_OPT],
675
    [NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT],
720 676
    "[nodes...]",
721
    "Lists the nodes in the cluster. The available fields are (see the man"
722
    " page for details): %s. The default field list is (in order): %s." %
723
    (utils.CommaJoin(_LIST_HEADERS), utils.CommaJoin(_LIST_DEF_FIELDS))),
677
    "Lists the nodes in the cluster. The available fields can be shown using"
678
    " the \"list-fields\" command (see the man page for details)."
679
    " The default field list is (in order): %s." %
680
    utils.CommaJoin(_LIST_DEF_FIELDS)),
681
  "list-fields": (
682
    ListNodeFields, [ArgUnknown()],
683
    [NOHDR_OPT, SEP_OPT],
684
    "[fields...]",
685
    "Lists all available fields for nodes"),
724 686
  'modify': (
725 687
    SetNodeParams, ARGS_ONE_NODE,
726 688
    [FORCE_OPT, SUBMIT_OPT, MC_OPT, DRAINED_OPT, OFFLINE_OPT,

Also available in: Unified diff