summaryrefslogtreecommitdiffstats
path: root/taskcluster/taskgraph/transforms/iris.py
diff options
context:
space:
mode:
Diffstat (limited to 'taskcluster/taskgraph/transforms/iris.py')
-rw-r--r--taskcluster/taskgraph/transforms/iris.py125
1 files changed, 125 insertions, 0 deletions
diff --git a/taskcluster/taskgraph/transforms/iris.py b/taskcluster/taskgraph/transforms/iris.py
new file mode 100644
index 0000000000..799f7e63cf
--- /dev/null
+++ b/taskcluster/taskgraph/transforms/iris.py
@@ -0,0 +1,125 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+"""
+Take the base iris task definition and generate all of the actual test chunks
+for all combinations of test categories and test platforms.
+"""
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+from copy import deepcopy
+
+from taskgraph.transforms.base import TransformSequence
+from taskgraph.util.schema import resolve_keyed_by
+
+transforms = TransformSequence()
+
+
+@transforms.add
+def make_iris_tasks(config, jobs):
+ # Each platform will get a copy of the test categories
+ platforms = config.config.get("iris-build-platforms")
+
+ # The fields needing to be resolve_keyed_by'd
+ fields = [
+ "dependencies.build",
+ "fetches.build",
+ "run.command",
+ "run-on-projects",
+ "treeherder.platform",
+ "worker.docker-image",
+ "worker.artifacts",
+ "worker.env.PATH",
+ "worker.max-run-time",
+ "worker-type",
+ ]
+
+ for job in jobs:
+ for platform in platforms:
+ # Make platform-specific clones of each iris task
+ clone = deepcopy(job)
+
+ basename = clone["name"]
+ clone["description"] = clone["description"].format(basename)
+ clone["name"] = clone["name"] + "-" + platform
+
+ # resolve_keyed_by picks the correct values based on
+ # the `by-platform` keys in the task definitions
+ for field in fields:
+ resolve_keyed_by(
+ clone,
+ field,
+ clone["name"],
+ **{
+ "platform": platform,
+ }
+ )
+
+ # iris uses this to select the tests to run in this chunk
+ clone["worker"]["env"]["CURRENT_TEST_DIR"] = basename
+
+ # Clean up some entries when they aren't needed
+ if clone["worker"]["docker-image"] is None:
+ del clone["worker"]["docker-image"]
+ if clone["worker"]["env"]["PATH"] is None:
+ del clone["worker"]["env"]["PATH"]
+
+ yield clone
+
+
+@transforms.add
+def fill_email_data(config, tasks):
+ format_kwargs = {
+ "head_rev": config.params["head_rev"],
+ "project": config.params["project"],
+ "th_root": "https://treeherder.mozilla.org/#/",
+ "tiers": "&tier=1%2C2%2C3",
+ }
+
+ for task in tasks:
+ format_kwargs["task_name"] = task["name"]
+ format_kwargs["filterstring"] = "&searchStr=iris%20{}".format(task["name"])
+ format_kwargs["chunk"] = task["worker"]["env"]["CURRENT_TEST_DIR"]
+
+ resolve_keyed_by(
+ task,
+ "notify.email",
+ item_name=task["name"],
+ **{
+ "project": config.params["project"],
+ }
+ )
+
+ email = task["notify"].get("email")
+ if email:
+ email["link"]["href"] = email["link"]["href"].format(**format_kwargs)
+ email["subject"] = email["subject"].format(**format_kwargs)
+
+ yield task
+
+
+@transforms.add
+def add_notify_email(config, tasks):
+ for task in tasks:
+ notify = task.pop("notify", {})
+ email_config = notify.get("email")
+ if email_config:
+ extra = task.setdefault("extra", {})
+ notify = extra.setdefault("notify", {})
+ notify["email"] = {
+ "subject": email_config["subject"],
+ "content": email_config["message"],
+ "link": email_config.get("link", None),
+ }
+
+ routes = task.setdefault("routes", [])
+ routes.extend(
+ [
+ "notify.email.{}.on-{}".format(address, reason)
+ for address in email_config["emails"]
+ for reason in email_config["on-reasons"]
+ ]
+ )
+
+ yield task