diff --git a/jobs.py b/jobs.py index c5d6442f705f6bc0bb6f299109f529c02c166d8d..aff04af9758791c49ab5eccd0d75424d88131da2 100644 --- a/jobs.py +++ b/jobs.py @@ -1,6 +1,7 @@ from server import * import traceback import json +import random @app.route('/jobs/overview') @register_navbar('Jobs', iconlib='fa', icon='suitcase') @@ -31,11 +32,18 @@ def date_json_handler(obj): @app.route('/jobs/api/ping', methods=['GET', 'POST']) @jobs_api_token_required -def jobs_ping(): +def jobs_worker_ping(): hostname = request.values['host'] query('INSERT OR REPLACE INTO worker (hostname, last_ping) values (?, ?)',hostname,datetime.now()) return 'OK',200 +@app.route('/jobs/api/job/<id>/ping', methods=['GET', 'POST']) +@jobs_api_token_required +def jobs_ping(id): + hostname = request.values['host'] + query('UPDATE jobs SET worker = ?, last_ping = ? where id = ?',hostname,datetime.now(),id) + return 'OK',200 + @app.route('/jobs/api/schedule', methods=['POST']) @jobs_api_token_required def jobs_schedule(): @@ -43,9 +51,18 @@ def jobs_schedule(): print(hostdata) if not hostdata: return 'no data', 500 + job = None jobtypes = hostdata['jobtypes'] if 'jobtypes' in hostdata else [] - for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'): - if i['type'] in hostdata['jobtypes'].split(','): - job=i - break + while (not job): + query("BEGIN") + for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'): + if i['type'] in hostdata['jobtypes'].split(','): + job=i + break + modify('UPDATE jobs SET state="running", worker = ? WHERE id = ?', hostdata['host'], job['id']) + try: + query("COMMIT") + except: + job = None + sleep(random.randinti(0,50)) return Response(json.dumps(job, default=date_json_handler), mimetype='application/json')