From 975c6fa7ac0a088249cc36e339c2c57b9eca4e12 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= <sybren@stuvel.eu>
Date: Tue, 31 Jan 2017 09:21:25 +0100
Subject: [PATCH] Server: separated task.priority into .job_priority and
 .priority

Now tasks can be sorted by job and task priority, and different tasks can
have different priorities within a job. This will allow for better control
over task ordering than just relying on parent relationships.
---
 packages/flamenco/flamenco/eve_settings.py   |  4 ++++
 packages/flamenco/flamenco/jobs/routes.py    |  2 +-
 packages/flamenco/flamenco/tasks/__init__.py | 12 +++++++++---
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/packages/flamenco/flamenco/eve_settings.py b/packages/flamenco/flamenco/eve_settings.py
index b7b637ff..0a457fb3 100644
--- a/packages/flamenco/flamenco/eve_settings.py
+++ b/packages/flamenco/flamenco/eve_settings.py
@@ -221,6 +221,10 @@ tasks_schema = {
         'default': 'queued'
     },
     'priority': {
+        'type': 'integer',
+        'default': 0
+    },
+    'job_priority': {
         'type': 'integer',
         'min': 1,
         'max': 100,
diff --git a/packages/flamenco/flamenco/jobs/routes.py b/packages/flamenco/flamenco/jobs/routes.py
index f4da8bd7..de4cadb7 100644
--- a/packages/flamenco/flamenco/jobs/routes.py
+++ b/packages/flamenco/flamenco/jobs/routes.py
@@ -91,7 +91,7 @@ def view_job_depsgraph(project, job_id):
         tid_to_idx = {task['_id']: tidx
                       for tidx, task in enumerate(tasks._items)}
 
-        for task in tasks._items:
+        for task in sorted(tasks._items, key=lambda task: task['priority']):
             task_id = tid_to_idx[task['_id']]
             nodes.append({
                 'id': task_id,
diff --git a/packages/flamenco/flamenco/tasks/__init__.py b/packages/flamenco/flamenco/tasks/__init__.py
index 81049d11..4c8333d6 100644
--- a/packages/flamenco/flamenco/tasks/__init__.py
+++ b/packages/flamenco/flamenco/tasks/__init__.py
@@ -27,7 +27,7 @@ REQUEABLE_TASK_STATES = {'completed', 'canceled', 'failed'}
 class TaskManager(object):
     _log = attrs_extra.log('%s.TaskManager' % __name__)
 
-    def api_create_task(self, job, commands, name, parents=None):
+    def api_create_task(self, job, commands, name, parents=None, priority=50):
         """Creates a task in MongoDB for the given job, executing commands.
 
         Returns the ObjectId of the created task.
@@ -43,7 +43,8 @@ class TaskManager(object):
             'status': 'queued',
             'job_type': job['job_type'],
             'commands': [cmd.to_dict() for cmd in commands],
-            'priority': job['priority'],
+            'job_priority': job['priority'],
+            'priority': priority,
             'project': job['project'],
         }
         # Insertion of None parents is not supported
@@ -68,7 +69,12 @@ class TaskManager(object):
         payload = {
             'where': {
                 'job': unicode(job_id),
-            }}
+            },
+            'sorted': [
+                ('priority', -1),
+                ('_id', 1),
+            ],
+        }
         if status:
             payload['where']['status'] = status
         tasks = Task.all(payload, api=api)
-- 
GitLab