1# This Source Code Form is subject to the terms of the Mozilla Public
2# License, v. 2.0. If a copy of the MPL was not distributed with this
3# file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5from __future__ import absolute_import, print_function, unicode_literals
6import json
7from pipes import quote as shell_quote
8
9import six
10from taskgraph.transforms.base import TransformSequence
11from taskgraph.util.scriptworker import get_release_config
12from taskgraph.util.schema import resolve_keyed_by
13
14import logging
15
16logger = logging.getLogger(__name__)
17
18transforms = TransformSequence()
19
20
21@transforms.add
22def add_command(config, jobs):
23    for job in jobs:
24        command = [
25            "python",
26            "testing/mozharness/scripts/release/bouncer_check.py",
27        ]
28        job["run"].update(
29            {
30                "using": "mach",
31                "mach": command,
32            }
33        )
34        yield job
35
36
37@transforms.add
38def add_previous_versions(config, jobs):
39    release_config = get_release_config(config)
40    if not release_config.get("partial_versions"):
41        for job in jobs:
42            yield job
43    else:
44        extra_params = []
45        for partial in release_config["partial_versions"].split(","):
46            extra_params.append(
47                "--previous-version={}".format(partial.split("build")[0].strip())
48            )
49
50        for job in jobs:
51            job["run"]["mach"].extend(extra_params)
52            yield job
53
54
55@transforms.add
56def handle_keyed_by(config, jobs):
57    """Resolve fields that can be keyed by project, etc."""
58    fields = [
59        "run.config",
60        "run.product-field",
61        "run.extra-config",
62    ]
63
64    release_config = get_release_config(config)
65    version = release_config["version"]
66
67    for job in jobs:
68        for field in fields:
69            resolve_keyed_by(
70                item=job,
71                field=field,
72                item_name=job["name"],
73                **{
74                    "project": config.params["project"],
75                    "release-level": config.params.release_level(),
76                    "release-type": config.params["release_type"],
77                }
78            )
79
80        for cfg in job["run"]["config"]:
81            job["run"]["mach"].extend(["--config", cfg])
82
83        if config.kind == "cron-bouncer-check":
84            job["run"]["mach"].extend(
85                [
86                    "--product-field={}".format(job["run"]["product-field"]),
87                    "--products-url={}".format(job["run"]["products-url"]),
88                ]
89            )
90            del job["run"]["product-field"]
91            del job["run"]["products-url"]
92        elif config.kind == "release-bouncer-check":
93            job["run"]["mach"].append("--version={}".format(version))
94
95        del job["run"]["config"]
96
97        if "extra-config" in job["run"]:
98            env = job["worker"].setdefault("env", {})
99            env["EXTRA_MOZHARNESS_CONFIG"] = six.ensure_text(
100                json.dumps(job["run"]["extra-config"], sort_keys=True)
101            )
102            del job["run"]["extra-config"]
103
104        yield job
105
106
107@transforms.add
108def command_to_string(config, jobs):
109    """Convert command to string to make it work properly with run-task"""
110    for job in jobs:
111        job["run"]["mach"] = " ".join(map(shell_quote, job["run"]["mach"]))
112        yield job
113