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