# 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 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( [ f"notify.email.{address}.on-{reason}" for address in email_config["emails"] for reason in email_config["on-reasons"] ] ) yield task