Revision 137161c9

b/lib/cli.py
37 37
                      Option, OptionValueError, SUPPRESS_HELP)
38 38

  
39 39
__all__ = ["DEBUG_OPT", "NOHDR_OPT", "SEP_OPT", "GenericMain", "SubmitOpCode",
40
           "cli_option",
40
           "cli_option", "OutputTable",
41 41
           "ARGS_NONE", "ARGS_FIXED", "ARGS_ATLEAST", "ARGS_ANY", "ARGS_ONE",
42 42
           "USEUNITS_OPT", "FIELDS_OPT"]
43 43

  
......
49 49
                        action="store_true", dest="no_headers",
50 50
                        help="Don't display column headers")
51 51

  
52
SEP_OPT = make_option("--separator", default=" ",
52
SEP_OPT = make_option("--separator", default=None,
53 53
                      action="store", dest="separator",
54 54
                      help="Separator between output fields"
55 55
                      " (defaults to one space)")
......
274 274
    utils.LockCleanup()
275 275

  
276 276
  return result
277

  
278

  
279
def OutputTable(headers, fields, separator, data,
280
                numfields=None, unitfields=None):
281
  """Prints a table with headers and different fields.
282

  
283
  Args:
284
    headers: Dict of header titles or None if no headers should be shown
285
    fields: List of fields to show
286
    separator: String used to separate fields or None for spaces
287
    data: Data to be printed
288
    numfields: List of fields to be aligned to right
289
    unitfields: List of fields to be formatted as units
290

  
291
  """
292
  if numfields is None:
293
    numfields = []
294
  if unitfields is None:
295
    unitfields = []
296

  
297
  format_fields = []
298
  for field in fields:
299
    if separator is not None:
300
      format_fields.append("%s")
301
    elif field in numfields:
302
      format_fields.append("%*s")
303
    else:
304
      format_fields.append("%-*s")
305

  
306
  if separator is None:
307
    mlens = [0 for name in fields]
308
    format = ' '.join(format_fields)
309
  else:
310
    format = separator.replace("%", "%%").join(format_fields)
311

  
312
  for row in data:
313
    for idx, val in enumerate(row):
314
      if fields[idx] in unitfields:
315
        try:
316
          val = int(val)
317
        except ValueError:
318
          pass
319
        else:
320
          val = row[idx] = utils.FormatUnit(val)
321
      if separator is None:
322
        mlens[idx] = max(mlens[idx], len(val))
323

  
324
  if headers:
325
    args = []
326
    for idx, name in enumerate(fields):
327
      hdr = headers[name]
328
      if separator is None:
329
        mlens[idx] = max(mlens[idx], len(hdr))
330
        args.append(mlens[idx])
331
      args.append(hdr)
332
    logger.ToStdout(format % tuple(args))
333

  
334
  for line in data:
335
    args = []
336
    for idx in xrange(len(fields)):
337
      if separator is None:
338
        args.append(mlens[idx])
339
      args.append(line[idx])
340
    logger.ToStdout(format % tuple(args))
b/scripts/gnt-instance
45 45
  op = opcodes.OpQueryInstances(output_fields=selected_fields)
46 46
  output = SubmitOpCode(op)
47 47

  
48
  mlens = [0 for name in selected_fields]
48
  if not opts.no_headers:
49
    headers = {"name": "Instance", "os": "OS", "pnode": "Primary_node",
50
               "snodes": "Secondary_Nodes", "admin_state": "Autostart",
51
               "oper_state": "Status", "admin_ram": "Configured_memory",
52
               "oper_ram": "Memory", "disk_template": "Disk_template",
53
               "ip": "IP Address", "mac": "MAC Address",
54
               "bridge": "Bridge"}
55
  else:
56
    headers = None
49 57

  
50
  format_fields = []
51
  unitformat_fields = ("admin_ram", "oper_ram")
52
  for field in selected_fields:
53
    if field in ("admin_ram", "oper_ram"):
54
      format_fields.append("%*s")
55
    else:
56
      format_fields.append("%-*s")
57
  separator = opts.separator
58
  if "%" in separator:
59
    separator = separator.replace("%", "%%")
60
  format = separator.join(format_fields)
61

  
62
  for row in output:
63
    for idx, val in enumerate(row):
64
      if opts.human_readable and selected_fields[idx] in unitformat_fields:
65
        try:
66
          val = int(val)
67
        except ValueError:
68
          pass
69
        else:
70
          val = row[idx] = utils.FormatUnit(val)
71
      mlens[idx] = max(mlens[idx], len(val))
58
  if opts.human_readable:
59
    unitfields = ["admin_ram", "oper_ram"]
60
  else:
61
    unitfields = None
72 62

  
73
  if not opts.no_headers:
74
    header_list = {"name": "Instance", "os": "OS", "pnode": "Primary_node",
75
                   "snodes": "Secondary_Nodes", "admin_state": "Autostart",
76
                   "oper_state": "Status", "admin_ram": "Configured_memory",
77
                   "oper_ram": "Memory", "disk_template": "Disk_template",
78
                   "ip": "IP Address", "mac": "MAC Address",
79
                   "bridge": "Bridge"}
80
    args = []
81
    for idx, name in enumerate(selected_fields):
82
      hdr = header_list[name]
83
      mlens[idx] = max(mlens[idx], len(hdr))
84
      args.append(mlens[idx])
85
      args.append(hdr)
86
    logger.ToStdout(format % tuple(args))
87

  
88
  for line in output:
89
    args = []
90
    for idx in range(len(selected_fields)):
91
      args.append(mlens[idx])
92
      args.append(line[idx])
93
    logger.ToStdout(format % tuple(args))
63
  numfields = ["admin_ram", "oper_ram"]
64

  
65
  OutputTable(separator=opts.separator, headers=headers,
66
      fields=selected_fields, unitfields=unitfields,
67
      numfields=numfields, data=output)
94 68

  
95 69
  return 0
96 70

  
b/scripts/gnt-node
48 48
  op = opcodes.OpQueryNodes(output_fields=selected_fields)
49 49
  output = SubmitOpCode(op)
50 50

  
51
  mlens = [0 for name in selected_fields]
52
  format_fields = []
53
  unitformat_fields = ("dtotal", "dfree", "mtotal", "mnode", "mfree")
54
  for field in selected_fields:
55
    if field in ("dtotal", "dfree", "mtotal", "mnode",
56
                 "mfree", "pinst", "sinst"):
57
      format_fields.append("%*s")
58
    else:
59
      format_fields.append("%-*s")
60

  
61
  separator = opts.separator
62
  if "%" in separator:
63
    separator = separator.replace("%", "%%")
64
  format = separator.join(format_fields)
65

  
66
  for row in output:
67
    for idx, val in enumerate(row):
68
      if opts.human_readable and selected_fields[idx] in unitformat_fields:
69
        try:
70
          val = int(val)
71
        except ValueError:
72
          pass
73
        else:
74
          val = row[idx] = utils.FormatUnit(val)
75
      mlens[idx] = max(mlens[idx], len(val))
76

  
77 51
  if not opts.no_headers:
78
    header_list = {"name": "Node", "pinst": "Pinst", "sinst": "Sinst",
79
                   "pip": "PrimaryIP", "sip": "SecondaryIP",
80
                   "dtotal": "DTotal", "dfree": "DFree",
81
                   "mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree"}
82
    args = []
83
    for idx, name in enumerate(selected_fields):
84
      hdr = header_list[name]
85
      mlens[idx] = max(mlens[idx], len(hdr))
86
      args.append(mlens[idx])
87
      args.append(hdr)
88
    logger.ToStdout(format % tuple(args))
89

  
90
  for row in output:
91
    args = []
92
    for idx, val in enumerate(row):
93
      args.append(mlens[idx])
94
      args.append(val)
95
    logger.ToStdout(format % tuple(args))
52
    headers = {"name": "Node", "pinst": "Pinst", "sinst": "Sinst",
53
               "pip": "PrimaryIP", "sip": "SecondaryIP",
54
               "dtotal": "DTotal", "dfree": "DFree",
55
               "mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree"}
56
  else:
57
    headers = None
58

  
59
  if opts.human_readable:
60
    unitfields = ["dtotal", "dfree", "mtotal", "mnode", "mfree"]
61
  else:
62
    unitfields = None
63

  
64
  numfields = ["dtotal", "dfree", "mtotal", "mnode", "mfree", "pinst", "sinst"]
65

  
66
  OutputTable(separator=opts.separator, headers=headers,
67
      fields=selected_fields, unitfields=unitfields,
68
      numfields=numfields, data=output)
96 69

  
97 70
  return 0
98 71

  
......
143 116
  op = opcodes.OpQueryNodeVolumes(nodes=args, output_fields=selected_fields)
144 117
  output = SubmitOpCode(op)
145 118

  
146
  mlens = [0 for name in selected_fields]
147
  format_fields = []
148
  unitformat_fields = ("size",)
149
  for field in selected_fields:
150
    if field in unitformat_fields:
151
      format_fields.append("%*s")
152
    else:
153
      format_fields.append("%-*s")
154

  
155
  separator = opts.separator
156
  if "%" in separator:
157
    separator = separator.replace("%", "%%")
158
  format = separator.join(format_fields)
159

  
160
  for row in output:
161
    for idx, val in enumerate(row):
162
      if opts.human_readable and selected_fields[idx] in unitformat_fields:
163
        try:
164
          val = int(val)
165
        except ValueError:
166
          pass
167
        else:
168
          val = row[idx] = utils.FormatUnit(val)
169
      mlens[idx] = max(mlens[idx], len(val))
170

  
171 119
  if not opts.no_headers:
172
    header_list = {"node": "Node", "phys": "PhysDev",
173
                   "vg": "VG", "name": "Name",
174
                   "size": "Size", "instance": "Instance"}
175
    args = []
176
    for idx, name in enumerate(selected_fields):
177
      hdr = header_list[name]
178
      mlens[idx] = max(mlens[idx], len(hdr))
179
      args.append(mlens[idx])
180
      args.append(hdr)
181
    logger.ToStdout(format % tuple(args))
182

  
183
  for row in output:
184
    args = []
185
    for idx, val in enumerate(row):
186
      args.append(mlens[idx])
187
      args.append(val)
188
    logger.ToStdout(format % tuple(args))
120
    headers = {"node": "Node", "phys": "PhysDev",
121
               "vg": "VG", "name": "Name",
122
               "size": "Size", "instance": "Instance"}
123
  else:
124
    headers = None
125

  
126
  if opts.human_readable:
127
    unitfields = ["size"]
128
  else:
129
    unitfields = None
130

  
131
  numfields = ["size"]
132

  
133
  OutputTable(separator=opts.separator, headers=headers,
134
      fields=selected_fields, unitfields=unitfields,
135
      numfields=numfields, data=output)
189 136

  
190 137
  return 0
191 138

  

Also available in: Unified diff