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
9from taskgraph.transforms.base import TransformSequence
10from taskgraph.util.scriptworker import get_release_config
11from taskgraph.util.schema import (
12    resolve_keyed_by,
13)
14
15import logging
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", "testing/mozharness/scripts/release/bouncer_check.py",
26        ]
27        job['run'].update({
28            'using': 'mach',
29            'mach': command,
30        })
31        yield job
32
33
34@transforms.add
35def add_previous_versions(config, jobs):
36    release_config = get_release_config(config)
37    if not release_config.get("partial_versions"):
38        for job in jobs:
39            yield job
40    else:
41        extra_params = []
42        for partial in release_config["partial_versions"].split(","):
43            extra_params.append("--previous-version={}".format(partial.split("build")[0].strip()))
44
45        for job in jobs:
46            job["run"]["mach"].extend(extra_params)
47            yield job
48
49
50@transforms.add
51def handle_keyed_by(config, jobs):
52    """Resolve fields that can be keyed by project, etc."""
53    fields = [
54        "run.config",
55        "run.product-field",
56        "run.extra-config",
57    ]
58
59    release_config = get_release_config(config)
60    version = release_config["version"]
61
62    for job in jobs:
63        for field in fields:
64            resolve_keyed_by(item=job, field=field, item_name=job['name'],
65                             project=config.params['project'])
66
67        for cfg in job["run"]["config"]:
68            job["run"]["mach"].extend(["--config", cfg])
69
70        if config.kind == "cron-bouncer-check":
71            job["run"]["mach"].extend([
72                "--product-field={}".format(job["run"]["product-field"]),
73                "--products-url={}".format(job["run"]["products-url"]),
74            ])
75            del job["run"]["product-field"]
76            del job["run"]["products-url"]
77        elif config.kind == "release-bouncer-check":
78            job["run"]["mach"].append("--version={}".format(version))
79
80        del job["run"]["config"]
81
82        if 'extra-config' in job['run']:
83            env = job['worker'].setdefault('env', {})
84            env['EXTRA_MOZHARNESS_CONFIG'] = json.dumps(job['run']['extra-config'])
85            del job["run"]["extra-config"]
86
87        yield job
88
89
90@transforms.add
91def command_to_string(config, jobs):
92    """Convert command to string to make it work properly with run-task"""
93    for job in jobs:
94        job["run"]["mach"] = ' '.join(map(shell_quote, job["run"]["mach"]))
95        yield job
96