# 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/. """ This transform constructs tasks generate conditioned profiles from the condprof/kind.yml file """ from typing import Optional from taskgraph.transforms.base import TransformSequence from taskgraph.util.copy import deepcopy from taskgraph.util.schema import Schema from gecko_taskgraph.transforms.job import JobDescriptionSchema from gecko_taskgraph.transforms.task import TaskDescriptionSchema class DiffDescriptionSchema(Schema, kw_only=True): # default is settled, but add 'full' to get both scenarios: Optional[list[str]] = None description: TaskDescriptionSchema.__annotations__["description"] = None dependencies: TaskDescriptionSchema.__annotations__["dependencies"] = None fetches: JobDescriptionSchema.__annotations__["fetches"] = None index: TaskDescriptionSchema.__annotations__["index"] = None task_from: Optional[str] = None name: Optional[str] = None run: JobDescriptionSchema.__annotations__["run"] = None run_on_projects: TaskDescriptionSchema.__annotations__["run_on_projects"] = None run_on_repo_type: TaskDescriptionSchema.__annotations__["run_on_repo_type"] = None scopes: TaskDescriptionSchema.__annotations__["scopes"] = None treeherder: TaskDescriptionSchema.__annotations__["treeherder"] = None use_python: JobDescriptionSchema.__annotations__["use_python"] = None worker: JobDescriptionSchema.__annotations__["worker"] = None worker_type: TaskDescriptionSchema.__annotations__["worker_type"] = None transforms = TransformSequence() transforms.add_validate(DiffDescriptionSchema) @transforms.add def generate_scenarios(config, tasks): for task in tasks: cmds = task["run"]["command"] symbol = task["treeherder"]["symbol"].split(")")[0] index = task["index"] jobname = index["job-name"] label = task["name"] run_as_root = task["run"].get("run-as-root", False) for scenario in set(task["scenarios"]): extra_args = "" if scenario == "settled": extra_args = " --force-new " tcmd = cmds.replace("${EXTRA_ARGS}", extra_args) tcmd = tcmd.replace("${SCENARIO}", scenario) index["job-name"] = "%s-%s" % (jobname, scenario) taskdesc = { "name": "%s-%s" % (label, scenario), "description": task["description"], "treeherder": { "symbol": "%s-%s)" % (symbol, scenario), "platform": task["treeherder"]["platform"], "kind": task["treeherder"]["kind"], "tier": task["treeherder"]["tier"], }, "worker-type": deepcopy(task["worker-type"]), "worker": deepcopy(task["worker"]), "index": deepcopy(index), "run": { "using": "run-task", "cwd": task["run"]["cwd"], "checkout": task["run"]["checkout"], "tooltool-downloads": deepcopy(task["run"]["tooltool-downloads"]), "command": tcmd, "run-as-root": run_as_root, }, "run-on-projects": deepcopy(task["run-on-projects"]), "run-on-repo-type": task.get("run-on-repo-type", ["git", "hg"]), "scopes": deepcopy(task["scopes"]), "dependencies": deepcopy(task["dependencies"]), "fetches": deepcopy(task["fetches"]), } use_taskcluster_python = task.get("use-python", "system") if use_taskcluster_python != "system": taskdesc["use-python"] = use_taskcluster_python yield taskdesc