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"