From 7981e0aebc859018177dcd1c55b93eb772ee555d Mon Sep 17 00:00:00 2001 From: simon987 Date: Sat, 30 Mar 2019 21:22:34 -0400 Subject: [PATCH] handle multiple projects --- src/drone.py | 28 ++++++++++++++++++++-------- src/tt_drone/api.py | 6 ++++++ src/tt_drone/worker.py | 4 ++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/drone.py b/src/drone.py index 2878fc8..7fb6439 100644 --- a/src/drone.py +++ b/src/drone.py @@ -33,14 +33,24 @@ signal.signal(signal.SIGTERM, cleanup) def drone(ctx: WorkerContext): global die + + sorted_projects = sorted(worker.get_project_list(), key=lambda p: p["priority"], reverse=True) + while not die: - task = worker.fetch_task(1) + task = None try: - if task is not None: - with lock: - current_tasks.add(task.id) - ctx.execute_task(task) - else: + ok = False + for project in sorted_projects: + task = worker.fetch_task(project["id"]) + if task is not None: + with lock: + current_tasks.add(task.id) + ctx.execute_task(task) + ok = True + break + + if not ok: + print("No tasks, waiting") time.sleep(10) finally: with lock: @@ -56,8 +66,10 @@ worker = Worker.from_file(api) if not worker: worker = api.make_worker("drone") worker.dump_to_file() - worker.request_access(1, True, False) - + projects = worker.get_project_list() + for project in projects: + r = worker.request_access(project["id"], assign=True, submit=False) + print("Request access for %d r=%s" % (project["id"], r.text)) print("Starting %d working contexts" % (THREAD_COUNT,)) for i in range(THREAD_COUNT): diff --git a/src/tt_drone/api.py b/src/tt_drone/api.py index 77113dd..cb93816 100644 --- a/src/tt_drone/api.py +++ b/src/tt_drone/api.py @@ -100,6 +100,9 @@ class Worker: "secret": self.secret_b64 }, out) + def get_project_list(self): + return self._api.get_project_list(self).json()["content"]["projects"] + @staticmethod def from_file(api): if os.path.exists("worker.json"): @@ -200,6 +203,9 @@ class TaskTrackerApi: if r.status_code == 200: return json.loads(r.text)["content"]["secret"] + def get_project_list(self, worker: Worker): + return self._http_get("/project/list", worker) + def _http_get(self, endpoint: str, worker: Worker = None): if worker is not None: headers = format_headers(secret=worker.secret_b64, wid=worker.id) diff --git a/src/tt_drone/worker.py b/src/tt_drone/worker.py index 2842a8b..174f0ac 100644 --- a/src/tt_drone/worker.py +++ b/src/tt_drone/worker.py @@ -3,6 +3,7 @@ import json import os import shutil import subprocess +import traceback from subprocess import Popen from tt_drone.api import (Project, Worker, Task) @@ -62,7 +63,10 @@ class WorkerContext: "verification"] if "verification" in json_result else 0).text + "for result" + result) except Exception as e: + print(str(e) + traceback.format_exc()) return + else: + print(path + "/run doesn't exist!") def _do_post_task_hooks(self, res):