Bug 1382911 - Custom action callback to trigger a bunch of jobs r=bstack,dustin
authorHassan Ali <helfi92@gmail.com>
Mon, 24 Jul 2017 14:33:21 -0400
changeset 371177 36df21c0cba7b5ce6940d86a8efc7b10ab44be13
parent 371176 319bc66e5d3a6599a61b686bc58ee399dac77b65
child 371178 c2d1e7ed4349390606179ff79ff880deedad9700
push id93039
push userkwierso@gmail.com
push dateThu, 27 Jul 2017 01:33:28 +0000
treeherdermozilla-inbound@35b0bdaacb0d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbstack, dustin
bugs1382911
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1382911 - Custom action callback to trigger a bunch of jobs r=bstack,dustin
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))