Revision 3086220e lib/client/gnt_job.py
b/lib/client/gnt_job.py | ||
---|---|---|
31 | 31 |
from ganeti import errors |
32 | 32 |
from ganeti import utils |
33 | 33 |
from ganeti import cli |
34 |
from ganeti import qlang |
|
34 | 35 |
|
35 | 36 |
|
36 | 37 |
#: default list of fields for L{ListJobs} |
... | ... | |
49 | 50 |
} |
50 | 51 |
|
51 | 52 |
|
53 |
def _FormatStatus(value): |
|
54 |
"""Formats a job status. |
|
55 |
|
|
56 |
""" |
|
57 |
try: |
|
58 |
return _USER_JOB_STATUS[value] |
|
59 |
except KeyError: |
|
60 |
raise errors.ProgrammerError("Unknown job status code '%s'" % value) |
|
61 |
|
|
62 |
|
|
52 | 63 |
def ListJobs(opts, args): |
53 | 64 |
"""List the jobs |
54 | 65 |
|
... | ... | |
61 | 72 |
""" |
62 | 73 |
selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS) |
63 | 74 |
|
64 |
output = GetClient().QueryJobs(args, selected_fields) |
|
65 |
if not opts.no_headers: |
|
66 |
# TODO: Implement more fields |
|
67 |
headers = { |
|
68 |
"id": "ID", |
|
69 |
"status": "Status", |
|
70 |
"priority": "Prio", |
|
71 |
"ops": "OpCodes", |
|
72 |
"opresult": "OpCode_result", |
|
73 |
"opstatus": "OpCode_status", |
|
74 |
"oplog": "OpCode_log", |
|
75 |
"summary": "Summary", |
|
76 |
"opstart": "OpCode_start", |
|
77 |
"opexec": "OpCode_exec", |
|
78 |
"opend": "OpCode_end", |
|
79 |
"oppriority": "OpCode_prio", |
|
80 |
"start_ts": "Start", |
|
81 |
"end_ts": "End", |
|
82 |
"received_ts": "Received", |
|
83 |
} |
|
84 |
else: |
|
85 |
headers = None |
|
75 |
fmtoverride = { |
|
76 |
"status": (_FormatStatus, False), |
|
77 |
"summary": (lambda value: ",".join(str(item) for item in value), False), |
|
78 |
} |
|
79 |
fmtoverride.update(dict.fromkeys(["opstart", "opexec", "opend"], |
|
80 |
(lambda value: map(FormatTimestamp, value), None))) |
|
86 | 81 |
|
87 |
numfields = ["priority"] |
|
82 |
return GenericList(constants.QR_JOB, selected_fields, args, None, |
|
83 |
opts.separator, not opts.no_headers, |
|
84 |
format_override=fmtoverride, verbose=opts.verbose, |
|
85 |
force_filter=opts.force_filter, namefield="id") |
|
88 | 86 |
|
89 |
# change raw values to nicer strings |
|
90 |
for row_id, row in enumerate(output): |
|
91 |
if row is None: |
|
92 |
ToStderr("No such job: %s" % args[row_id]) |
|
93 |
continue |
|
94 | 87 |
|
95 |
for idx, field in enumerate(selected_fields): |
|
96 |
val = row[idx] |
|
97 |
if field == "status": |
|
98 |
if val in _USER_JOB_STATUS: |
|
99 |
val = _USER_JOB_STATUS[val] |
|
100 |
else: |
|
101 |
raise errors.ProgrammerError("Unknown job status code '%s'" % val) |
|
102 |
elif field == "summary": |
|
103 |
val = ",".join(val) |
|
104 |
elif field in ("start_ts", "end_ts", "received_ts"): |
|
105 |
val = FormatTimestamp(val) |
|
106 |
elif field in ("opstart", "opexec", "opend"): |
|
107 |
val = [FormatTimestamp(entry) for entry in val] |
|
108 |
|
|
109 |
row[idx] = str(val) |
|
110 |
|
|
111 |
data = GenerateTable(separator=opts.separator, headers=headers, |
|
112 |
fields=selected_fields, data=output, |
|
113 |
numfields=numfields) |
|
114 |
for line in data: |
|
115 |
ToStdout(line) |
|
88 |
def ListJobFields(opts, args): |
|
89 |
"""List job fields. |
|
116 | 90 |
|
117 |
return 0 |
|
91 |
@param opts: the command line options selected by the user |
|
92 |
@type args: list |
|
93 |
@param args: fields to list, or empty for all |
|
94 |
@rtype: int |
|
95 |
@return: the desired exit code |
|
96 |
|
|
97 |
""" |
|
98 |
return GenericListFields(constants.QR_JOB, args, opts.separator, |
|
99 |
not opts.no_headers) |
|
118 | 100 |
|
119 | 101 |
|
120 | 102 |
def ArchiveJobs(opts, args): |
... | ... | |
358 | 340 |
commands = { |
359 | 341 |
"list": ( |
360 | 342 |
ListJobs, [ArgJobId()], |
361 |
[NOHDR_OPT, SEP_OPT, FIELDS_OPT], |
|
343 |
[NOHDR_OPT, SEP_OPT, FIELDS_OPT, VERBOSE_OPT, FORCE_FILTER_OPT],
|
|
362 | 344 |
"[job_id ...]", |
363 |
"List the jobs and their status. The available fields are" |
|
364 |
" (see the man page for details): id, status, op_list," |
|
365 |
" op_status, op_result." |
|
366 |
" The default field" |
|
367 |
" list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)), |
|
345 |
"Lists the jobs and their status. The available fields can be shown" |
|
346 |
" using the \"list-fields\" command (see the man page for details)." |
|
347 |
" The default field list is (in order): %s." % |
|
348 |
utils.CommaJoin(_LIST_DEF_FIELDS)), |
|
349 |
"list-fields": ( |
|
350 |
ListJobFields, [ArgUnknown()], |
|
351 |
[NOHDR_OPT, SEP_OPT], |
|
352 |
"[fields...]", |
|
353 |
"Lists all available fields for jobs"), |
|
368 | 354 |
"archive": ( |
369 | 355 |
ArchiveJobs, [ArgJobId(min=1)], [], |
370 | 356 |
"<job-id> [<job-id> ...]", "Archive specified jobs"), |
Also available in: Unified diff