Option, OptionValueError, SUPPRESS_HELP)
__all__ = ["DEBUG_OPT", "NOHDR_OPT", "SEP_OPT", "GenericMain",
- "SubmitOpCode", "SubmitJob", "SubmitQuery",
+ "SubmitOpCode",
"cli_option", "GenerateTable", "AskUser",
"ARGS_NONE", "ARGS_FIXED", "ARGS_ATLEAST", "ARGS_ANY", "ARGS_ONE",
"USEUNITS_OPT", "FIELDS_OPT", "FORCE_OPT",
"\n%(bin)s <command> --help to see details, or"
" man %(bin)s\n" % {"bin": binary})
# compute the max line length for cmd + usage
- mlen = max([len(" %s %s" % (cmd, commands[cmd][3])) for cmd in commands])
+ mlen = max([len(" %s" % cmd) for cmd in commands])
mlen = min(60, mlen) # should not get here...
# and format a nice command list
print "Commands:"
for cmd in sortedcmds:
- cmdstr = " %s %s" % (cmd, commands[cmd][3])
+ cmdstr = " %s" % (cmd,)
help_text = commands[cmd][4]
help_lines = textwrap.wrap(help_text, 79-3-mlen)
- print "%-*s - %s" % (mlen, cmdstr,
- help_lines.pop(0))
+ print "%-*s - %s" % (mlen, cmdstr, help_lines.pop(0))
for line in help_lines:
print "%-*s %s" % (mlen, "", line)
print
def SubmitOpCode(op, proc=None, feedback_fn=None):
- """Function to submit an opcode.
+ """Legacy function to submit an opcode.
This is just a simple wrapper over the construction of the processor
instance. It should be extended to better handle feedback and
interaction functions.
"""
+ # TODO: Fix feedback_fn situation.
cl = luxi.Client()
- job = opcodes.Job(op_list=[op])
- jid = SubmitJob(job)
- query = {
- "object": "jobs",
- "fields": ["status"],
- "names": [jid],
- }
+ job_id = cl.SubmitJob([op])
while True:
- jdata = SubmitQuery(query)
- if not jdata:
+ jobs = cl.QueryJobs([job_id], ["status"])
+ if not jobs:
# job not found, go away!
- raise errors.JobLost("Job with id %s lost" % jid)
+ raise errors.JobLost("Job with id %s lost" % job_id)
- status = jdata[0][0]
- if status in (opcodes.Job.STATUS_SUCCESS, opcodes.Job.STATUS_FAIL):
+ # TODO: Handle canceled and archived jobs
+ status = jobs[0][0]
+ if status in (constants.JOB_STATUS_SUCCESS, constants.JOB_STATUS_ERROR):
break
time.sleep(1)
- query["fields"].extend(["op_list", "op_status", "op_result"])
- jdata = SubmitQuery(query)
- if not jdata:
- raise errors.JobLost("Job with id %s lost" % jid)
- status, op_list, op_status, op_result = jdata[0]
- if status != opcodes.Job.STATUS_SUCCESS:
- raise errors.OpExecError(op_result[0])
- return op_result[0]
+ jobs = cl.QueryJobs([job_id], ["status", "result"])
+ if not jobs:
+ raise errors.JobLost("Job with id %s lost" % job_id)
- if feedback_fn is None:
- feedback_fn = logger.ToStdout
- if proc is None:
- proc = mcpu.Processor(feedback=feedback_fn)
- return proc.ExecOpCode(op)
-
-
-def SubmitJob(job, cl=None):
- if cl is None:
- cl = luxi.Client()
- return cl.SubmitJob(job)
-
-
-def SubmitQuery(data, cl=None):
- if cl is None:
- cl = luxi.Client()
- return cl.Query(data)
+ status, result = jobs[0]
+ if status == constants.JOB_STATUS_SUCCESS:
+ return result[0]
+ else:
+ raise errors.OpExecError(result)
def FormatError(err):
obuf.write("Failure: invalid tag(s) given:\n%s" % msg)
elif isinstance(err, errors.GenericError):
obuf.write("Unhandled Ganeti error: %s" % msg)
+ elif isinstance(err, luxi.NoMasterError):
+ obuf.write("Cannot communicate with the master daemon.\nIs it running"
+ " and listening on '%s'?" % err.args[0])
+ elif isinstance(err, luxi.TimeoutError):
+ obuf.write("Timeout while talking to the master daemon. Error:\n"
+ "%s" % msg)
+ elif isinstance(err, luxi.ProtocolError):
+ obuf.write("Unhandled protocol error while talking to the master daemon:\n"
+ "%s" % msg)
else:
obuf.write("Unhandled exception: %s" % msg)
return retcode, obuf.getvalue().rstrip('\n')
for key, val in override.iteritems():
setattr(options, key, val)
- logger.SetupLogging(debug=options.debug, program=binary)
+ logger.SetupLogging(program=binary, debug=options.debug)
utils.debug = options.debug
try:
result = func(options, args)
- except errors.GenericError, err:
+ except (errors.GenericError, luxi.ProtocolError), err:
result, err_msg = FormatError(err)
logger.ToStderr(err_msg)