ceph/teuthology/schedule.py
Zack Cerza 78dbc36931 Refactor teuthology.schedule...
... to separate the assembling of the job config from the scheduling of
the job. Also port its argument parsing to docopt.

Signed-off-by: Zack Cerza <zack.cerza@inktank.com>
2014-06-09 18:31:01 -05:00

81 lines
2.5 KiB
Python

import yaml
import teuthology.beanstalk
from teuthology.misc import config_file, deep_merge, get_user
from teuthology import report
def main(args):
if not args['--last-in-suite']:
if args['--email']:
raise ValueError(
'--email is only applicable to the last job in a suite')
if args['--timeout']:
raise ValueError(
'--timeout is only applicable to the last job in a suite')
job_config = build_config(args)
schedule_job(job_config, args['--num'])
def build_config(args):
"""
Given a dict of arguments, build a job config
"""
config_paths = args.get('<conf_file>', list())
conf_dict = dict()
for conf_path in config_paths:
conf_dict = deep_merge(conf_dict, config_file(conf_path))
# strip out targets; the worker will allocate new ones when we run
# the job with --lock.
if 'targets' in conf_dict:
del conf_dict['targets']
args['config'] = conf_dict
owner = args['--owner']
if owner is None:
owner = 'scheduled_{user}'.format(user=get_user())
job_config = dict(
name=args['--name'],
last_in_suite=args['--last-in-suite'],
email=args['--email'],
description=args['--description'],
owner=owner,
verbose=args['--verbose'],
machine_type=args['--worker'],
tube=args['--worker'],
priority=int(args['--priority']),
)
# Update the dict we just created, and not the other way around, to let
# settings in the yaml override what's passed on the command line. This is
# primarily to accommodate jobs with multiple machine types.
job_config.update(conf_dict)
if args['--timeout'] is not None:
job_config['results_timeout'] = args['--timeout']
return job_config
def schedule_job(job_config, num=1):
"""
Schedule a job.
:param job_config: The complete job dict
:param num: The number of times to schedule the job
"""
num = int(num)
job = yaml.safe_dump(job_config)
tube = job_config.pop('tube')
beanstalk = teuthology.beanstalk.connect()
beanstalk.use(tube)
while num > 0:
jid = beanstalk.put(
job,
ttr=60 * 60 * 24,
priority=job_config['priority'],
)
print 'Job scheduled with name {name} and ID {jid}'.format(
name=job_config['name'], jid=jid)
job_config['job_id'] = str(jid)
report.try_push_job_info(job_config, dict(status='queued'))
num -= 1