Implement “gnt-job archive” to archive jobs
[ganeti-local] / scripts / gnt-job
old mode 100644 (file)
new mode 100755 (executable)
index e98f637..698e868
@@ -33,52 +33,52 @@ from ganeti import utils
 from ganeti import errors
 
 
+_LIST_DEF_FIELDS = ["id", "status"]
+
+_USER_JOB_STATUS = {
+  constants.JOB_STATUS_QUEUED: "queued",
+  constants.JOB_STATUS_RUNNING: "running",
+  constants.JOB_STATUS_CANCELED: "canceled",
+  constants.JOB_STATUS_SUCCESS: "success",
+  constants.JOB_STATUS_ERROR: "error",
+  }
+
+
 def ListJobs(opts, args):
   """List the jobs
 
   """
   if opts.output is None:
-    selected_fields = ["id", "status"]
+    selected_fields = _LIST_DEF_FIELDS
+  elif opts.output.startswith("+"):
+    selected_fields = _LIST_DEF_FIELDS + opts.output[1:].split(",")
   else:
     selected_fields = opts.output.split(",")
 
-  query = {
-    "object": "jobs",
-    "fields": selected_fields,
-    "names": [],
-    }
-
-  output = SubmitQuery(query)
+  output = GetClient().QueryJobs(None, selected_fields)
   if not opts.no_headers:
+    # TODO: Implement more fields
     headers = {
       "id": "ID",
       "status": "Status",
-      "op_list": "OpCodes",
-      "op_status": "OpStatus",
-      "op_result": "OpResult",
+      "ops": "OpCodes",
+      "opresult": "OpCode_result",
+      "opstatus": "OpCode_status",
       }
   else:
     headers = None
 
   # we don't have yet unitfields here
   unitfields = None
-  numfields = ["id"]
+  numfields = None
 
   # change raw values to nicer strings
   for row in output:
     for idx, field in enumerate(selected_fields):
       val = row[idx]
       if field == "status":
-        if val == opcodes.Job.STATUS_PENDING:
-          val = "pending"
-        elif val == opcodes.Job.STATUS_RUNNING:
-          val = "running"
-        elif val == opcodes.Job.STATUS_SUCCESS:
-          val = "finished"
-        elif val == opcodes.Job.STATUS_FAIL:
-          val = "failed"
-        elif val == opcodes.Job.STATUS_ABORT:
-          val = "aborted"
+        if val in _USER_JOB_STATUS:
+          val = _USER_JOB_STATUS[val]
         else:
           raise errors.ProgrammerError("Unknown job status code '%s'" % val)
 
@@ -93,6 +93,15 @@ def ListJobs(opts, args):
   return 0
 
 
+def ArchiveJobs(opts, args):
+  client = GetClient()
+
+  for job_id in args:
+    client.ArchiveJob(job_id)
+
+  return 0
+
+
 commands = {
   'list': (ListJobs, ARGS_NONE,
             [DEBUG_OPT, NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT],
@@ -100,7 +109,11 @@ commands = {
            " (see the man page for details): id, status, op_list,"
            " op_status, op_result."
            " The default field"
-           " list is (in order): id, status."),
+           " list is (in order): %s." % ", ".join(_LIST_DEF_FIELDS)),
+  'archive': (ArchiveJobs, ARGS_ANY,
+              [DEBUG_OPT],
+              "<job-id> [<job-id> ...]",
+              "Archive specified jobs"),
   }