# 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/. """ Add from parameters.yml into bouncer submission tasks. """ from __future__ import absolute_import, print_function, unicode_literals import logging from taskgraph.transforms.base import TransformSequence from taskgraph.transforms.bouncer_submission import ( FTP_PLATFORMS_PER_BOUNCER_PLATFORM, CONFIG_PER_BOUNCER_PRODUCT as CONFIG_PER_BOUNCER_PRODUCT_VANILLA, _craft_ftp_product, _craft_filename_product, ) from taskgraph.util.partners import ( check_if_partners_enabled, get_partners_to_be_published, ) from taskgraph.util.schema import resolve_keyed_by from taskgraph.util.scriptworker import get_release_config logger = logging.getLogger(__name__) PARTNER_PLATFORMS_TO_BOUNCER = { "linux-shippable": "linux", "linux64-shippable": "linux64", "macosx64-shippable": "osx", "win32-shippable": "win", "win64-shippable": "win64", "win64-aarch64-shippable": "win64-aarch64" } # :lang is interpolated by bouncer at runtime RELEASES_PARTNERS_PATH_TEMPLATE = '/{ftp_product}/releases/partners/{partner}/{sub_config}/\ {version}/{ftp_platform}/:lang/{file}' CONFIG_PER_BOUNCER_PRODUCT = { 'installer': { 'name_postfix': "-{partner}-{sub_config}", 'path_template': RELEASES_PARTNERS_PATH_TEMPLATE, 'file_names': CONFIG_PER_BOUNCER_PRODUCT_VANILLA['installer']['file_names'] }, 'stub-installer': { 'name_postfix': "-{partner}-{sub_config}-stub", # We currently have a sole win32 stub installer that is to be used # in all windows platforms to toggle between full installers 'path_template': RELEASES_PARTNERS_PATH_TEMPLATE.replace('{ftp_platform}', 'win32'), 'file_names': CONFIG_PER_BOUNCER_PRODUCT_VANILLA['stub-installer']['file_names'] } } transforms = TransformSequence() transforms.add(check_if_partners_enabled) @transforms.add def make_task_worker(config, jobs): for job in jobs: resolve_keyed_by( job, 'worker-type', item_name=job['name'], **{'release-level': config.params.release_level()} ) resolve_keyed_by( job, 'scopes', item_name=job['name'], **{'release-level': config.params.release_level()} ) resolve_keyed_by( job, 'bouncer-products', item_name=job['name'], **{'release-type': config.params['release_type']} ) # the schema requires at least one locale but this will not be used job['worker']['locales'] = ["fake"] job['worker']['entries'] = craft_bouncer_entries(config, job) del job['locales-file'] del job['bouncer-platforms'] del job['bouncer-products'] if job['worker']['entries']: yield job def craft_bouncer_entries(config, job): release_config = get_release_config(config) product = job['shipping-product'] current_version = release_config['version'] bouncer_products = job['bouncer-products'] partners = get_partners_to_be_published(config) entries = {} for partner, sub_config_name, platforms in partners: platforms = [PARTNER_PLATFORMS_TO_BOUNCER[p] for p in platforms] entries.update({ craft_partner_bouncer_product_name(product, bouncer_product, current_version, partner, sub_config_name): { 'options': { 'add_locales': False, # partners may use different sets of locales 'ssl_only': craft_ssl_only(bouncer_product), }, 'paths_per_bouncer_platform': craft_paths_per_bouncer_platform( product, bouncer_product, platforms, current_version, partner, sub_config_name ), } for bouncer_product in bouncer_products }) return entries def craft_paths_per_bouncer_platform(product, bouncer_product, bouncer_platforms, current_version, partner, sub_config): paths_per_bouncer_platform = {} for bouncer_platform in bouncer_platforms: file_names_per_platform = CONFIG_PER_BOUNCER_PRODUCT[bouncer_product]['file_names'] file_name_template = file_names_per_platform.get( bouncer_platform, file_names_per_platform.get('default', None) ) if not file_name_template: # Some bouncer product like stub-installer are only meant to be on Windows. # Thus no default value is defined there continue file_name_product = _craft_filename_product(product) file_name = file_name_template.format( product=file_name_product, pretty_product=file_name_product.capitalize(), version=current_version, ) path_template = CONFIG_PER_BOUNCER_PRODUCT[bouncer_product]['path_template'] file_relative_location = path_template.format( ftp_product=_craft_ftp_product(product), version=current_version, ftp_platform=FTP_PLATFORMS_PER_BOUNCER_PLATFORM[bouncer_platform], partner=partner, sub_config=sub_config, file=file_name, ) paths_per_bouncer_platform[bouncer_platform] = file_relative_location return paths_per_bouncer_platform def craft_partner_bouncer_product_name(product, bouncer_product, current_version, partner, sub_config): postfix = CONFIG_PER_BOUNCER_PRODUCT[bouncer_product].get('name_postfix', '').format( partner=partner, sub_config=sub_config, ) return '{product}-{version}{postfix}'.format( product=product.capitalize(), version=current_version, postfix=postfix ) def craft_ssl_only(bouncer_product): return bouncer_product == "stub-installer"