tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

bouncer_submission_partners.py (6208B)


      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 """
      5 Add from parameters.yml into bouncer submission tasks.
      6 """
      7 
      8 import logging
      9 
     10 from taskgraph.transforms.base import TransformSequence
     11 from taskgraph.util.schema import resolve_keyed_by
     12 
     13 from gecko_taskgraph.transforms.bouncer_submission import (
     14    CONFIG_PER_BOUNCER_PRODUCT as CONFIG_PER_BOUNCER_PRODUCT_VANILLA,
     15 )
     16 from gecko_taskgraph.transforms.bouncer_submission import (
     17    FTP_PLATFORMS_PER_BOUNCER_PLATFORM,
     18    _craft_filename_product,
     19    _craft_ftp_product,
     20 )
     21 from gecko_taskgraph.util.attributes import release_level
     22 from gecko_taskgraph.util.partners import (
     23    check_if_partners_enabled,
     24    get_partners_to_be_published,
     25 )
     26 from gecko_taskgraph.util.scriptworker import get_release_config
     27 
     28 logger = logging.getLogger(__name__)
     29 
     30 
     31 PARTNER_PLATFORMS_TO_BOUNCER = {
     32    "linux64-shippable": "linux64",
     33    "macosx64-shippable": "osx",
     34    "win32-shippable": "win",
     35    "win64-shippable": "win64",
     36    "win64-aarch64-shippable": "win64-aarch64",
     37 }
     38 
     39 # :lang is interpolated by bouncer at runtime
     40 RELEASES_PARTNERS_PATH_TEMPLATE = (
     41    "/{ftp_product}/releases/partners/{partner}/{sub_config}/\
     42 {version}/{ftp_platform}/:lang/{file}"
     43 )
     44 
     45 CONFIG_PER_BOUNCER_PRODUCT = {
     46    "installer": {
     47        "name_postfix": "-{partner}-{sub_config}",
     48        "path_template": RELEASES_PARTNERS_PATH_TEMPLATE,
     49        "file_names": CONFIG_PER_BOUNCER_PRODUCT_VANILLA["installer"]["file_names"],
     50    },
     51    "stub-installer": {
     52        "name_postfix": "-{partner}-{sub_config}-stub",
     53        # We currently have a sole win32 stub installer that is to be used
     54        # in all windows platforms to toggle between full installers
     55        "path_template": RELEASES_PARTNERS_PATH_TEMPLATE.replace(
     56            "{ftp_platform}", "win32"
     57        ),
     58        "file_names": CONFIG_PER_BOUNCER_PRODUCT_VANILLA["stub-installer"][
     59            "file_names"
     60        ],
     61    },
     62 }
     63 
     64 transforms = TransformSequence()
     65 transforms.add(check_if_partners_enabled)
     66 
     67 
     68 @transforms.add
     69 def make_task_worker(config, jobs):
     70    for job in jobs:
     71        resolve_keyed_by(
     72            job,
     73            "worker-type",
     74            item_name=job["name"],
     75            **{"release-level": release_level(config.params)},
     76        )
     77        resolve_keyed_by(
     78            job,
     79            "scopes",
     80            item_name=job["name"],
     81            **{"release-level": release_level(config.params)},
     82        )
     83        resolve_keyed_by(
     84            job,
     85            "bouncer-products",
     86            item_name=job["name"],
     87            **{"release-type": config.params["release_type"]},
     88        )
     89 
     90        # the schema requires at least one locale but this will not be used
     91        job["worker"]["locales"] = ["fake"]
     92        job["worker"]["entries"] = craft_bouncer_entries(config, job)
     93 
     94        del job["locales-file"]
     95        del job["bouncer-platforms"]
     96        del job["bouncer-products"]
     97 
     98        if job["worker"]["entries"]:
     99            yield job
    100 
    101 
    102 def craft_bouncer_entries(config, job):
    103    release_config = get_release_config(config)
    104 
    105    product = job["shipping-product"]
    106    current_version = release_config["version"]
    107    bouncer_products = job["bouncer-products"]
    108 
    109    partners = get_partners_to_be_published(config)
    110    entries = {}
    111    for partner, sub_config_name, platforms in partners:
    112        platforms = [PARTNER_PLATFORMS_TO_BOUNCER[p] for p in platforms]
    113        entries.update({
    114            craft_partner_bouncer_product_name(
    115                product, bouncer_product, current_version, partner, sub_config_name
    116            ): {
    117                "options": {
    118                    "add_locales": False,  # partners may use different sets of locales
    119                    "ssl_only": craft_ssl_only(bouncer_product),
    120                },
    121                "paths_per_bouncer_platform": craft_paths_per_bouncer_platform(
    122                    product,
    123                    bouncer_product,
    124                    platforms,
    125                    current_version,
    126                    partner,
    127                    sub_config_name,
    128                ),
    129            }
    130            for bouncer_product in bouncer_products
    131        })
    132    return entries
    133 
    134 
    135 def craft_paths_per_bouncer_platform(
    136    product, bouncer_product, bouncer_platforms, current_version, partner, sub_config
    137 ):
    138    paths_per_bouncer_platform = {}
    139    for bouncer_platform in bouncer_platforms:
    140        file_names_per_platform = CONFIG_PER_BOUNCER_PRODUCT[bouncer_product][
    141            "file_names"
    142        ]
    143        file_name_template = file_names_per_platform.get(
    144            bouncer_platform, file_names_per_platform.get("default", None)
    145        )
    146        if not file_name_template:
    147            # Some bouncer product like stub-installer are only meant to be on Windows.
    148            # Thus no default value is defined there
    149            continue
    150 
    151        file_name_product = _craft_filename_product(product)
    152        file_name = file_name_template.format(
    153            product=file_name_product,
    154            pretty_product=file_name_product.capitalize(),
    155            version=current_version,
    156        )
    157 
    158        path_template = CONFIG_PER_BOUNCER_PRODUCT[bouncer_product]["path_template"]
    159        file_relative_location = path_template.format(
    160            ftp_product=_craft_ftp_product(product),
    161            version=current_version,
    162            ftp_platform=FTP_PLATFORMS_PER_BOUNCER_PLATFORM[bouncer_platform],
    163            partner=partner,
    164            sub_config=sub_config,
    165            file=file_name,
    166        )
    167 
    168        paths_per_bouncer_platform[bouncer_platform] = file_relative_location
    169 
    170    return paths_per_bouncer_platform
    171 
    172 
    173 def craft_partner_bouncer_product_name(
    174    product, bouncer_product, current_version, partner, sub_config
    175 ):
    176    postfix = (
    177        CONFIG_PER_BOUNCER_PRODUCT[bouncer_product]
    178        .get("name_postfix", "")
    179        .format(
    180            partner=partner,
    181            sub_config=sub_config,
    182        )
    183    )
    184 
    185    return f"{product.capitalize()}-{current_version}{postfix}"
    186 
    187 
    188 def craft_ssl_only(bouncer_product):
    189    return bouncer_product == "stub-installer"