Bug 1382911 - Custom action callback to trigger a bunch of jobs draft
authorHassan Ali <helfi92@gmail.com>
Mon, 24 Jul 2017 14:33:21 -0400
changeset 615495 7b2d8fa745a1b8f09d1adcea303dcd4dfa70cf1b
parent 615492 9eddb0a92820c6445f9d1e680e4c239e888e93f0
child 639201 f5e3ac58e0289166307a98286ba7cdf37b360054
push id70384
push userbmo:helfi92@gmail.com
push dateWed, 26 Jul 2017 03:23:43 +0000
bugs1382911
milestone56.0a1
Bug 1382911 - Custom action callback to trigger a bunch of jobs
taskcluster/actions/add-new-jobs.py
new file mode 100644
--- /dev/null
+++ b/taskcluster/actions/add-new-jobs.py
@@ -0,0 +1,49 @@
+from .registry import register_callback_action
+from slugid import nice as slugid
+
+from actions.util import create_task
+from taskgraph.util.taskcluster import get_artifact
+from taskgraph.util.parameterization import resolve_task_references
+from taskgraph.taskgraph import TaskGraph
+
+
+@register_callback_action(
+    name='add-new-jobs',
+    title='Add new jobs',
+    symbol='add-new',
+    description="Add new jobs using task labels",
+    order=10000,
+    context=[{}],
+    schema={
+        'type': 'object',
+        'properties': {
+            'tasks': {
+                'type': 'array',
+                'description': 'An array of task labels',
+                'items': {
+                    'type': 'string'
+                }
+            }
+        }
+    }
+)
+def add_new_jobs_action(parameters, input, task_group_id, task_id, task):
+    full_task_graph = get_artifact(task_id, "public/full-task-graph.json")
+    _, full_task_graph = TaskGraph.from_json(full_task_graph)
+    label_to_taskid = get_artifact(task_id, "public/label-to-taskid.json")
+
+    for elem in input['tasks']:
+        if elem in full_task_graph.tasks:
+            task = full_task_graph.tasks[elem]
+
+            # fix up the task's dependencies, similar to how optimization would
+            # have done in the decision
+            dependencies = {name: label_to_taskid[label]
+                            for name, label in task.dependencies.iteritems()}
+            task_def = resolve_task_references(task.label, task.task, dependencies)
+            task_def.setdefault('dependencies', []).extend(dependencies.itervalues())
+            task_def['schedulerId'] = 'gecko-level-{}'.format(parameters['level'])
+            # actually create the new task
+            create_task(slugid(), task_def)
+        else:
+            raise Exception('{} was not found in the task-graph'.format(elem))