Bug 1433459 - part 2: Move aliases tasks to scriptworker r=mtabara,rail draft
authorJohan Lorenzo <jlorenzo@mozilla.com>
Thu, 22 Feb 2018 15:15:19 +0000
changeset 758494 72e406715d2b79f594eab14e6e379b790c87e73f
parent 758493 752910f229e605dc0dcac14e81dc20dbc5946507
push id100073
push userbmo:jlorenzo@mozilla.com
push dateThu, 22 Feb 2018 15:25:38 +0000
reviewersmtabara, rail
bugs1433459
milestone60.0a1
Bug 1433459 - part 2: Move aliases tasks to scriptworker r=mtabara,rail MozReview-Commit-ID: Ld6ZQPBZYjX
taskcluster/ci/release-bouncer-aliases/kind.yml
taskcluster/ci/release-bouncer-sub/kind.yml
taskcluster/taskgraph/transforms/bouncer_aliases.py
taskcluster/taskgraph/transforms/bouncer_submission.py
taskcluster/taskgraph/transforms/task.py
--- a/taskcluster/ci/release-bouncer-aliases/kind.yml
+++ b/taskcluster/ci/release-bouncer-aliases/kind.yml
@@ -1,53 +1,44 @@
 # 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/.
 
 loader: taskgraph.loader.transform:loader
 
 transforms:
    - taskgraph.transforms.release_deps:transforms
-   - taskgraph.transforms.job:transforms
+   - taskgraph.transforms.bouncer_aliases:transforms
    - taskgraph.transforms.release_notifications:transforms
    - taskgraph.transforms.task:transforms
 
 kind-dependencies:
    - release-bouncer-check
 
 job-defaults:
    description: Update bouncer aliases job
-   worker-type: buildbot-bridge/buildbot-bridge
+   worker-type:
+      by-project:
+         mozilla-beta: scriptworker-prov-v1/bouncer-v1
+         mozilla-release: scriptworker-prov-v1/bouncer-v1
+         default: scriptworker-prov-v1/bouncer-dev
+   worker:
+      implementation: bouncer-aliases
+   scopes:
+      by-project:
+         mozilla-beta: ['project:releng:bouncer:server:production']
+         mozilla-release: ['project:releng:bouncer:server:production']
+         default: ['project:releng:bouncer:server:staging']
    run-on-projects: []
    shipping-phase: ship
-   run:
-      using: buildbot
-      release-promotion: true
-   worker:
-      properties:
-         tuxedo_server_url:
-            by-project:
-               mozilla-beta: https://bounceradmin.mozilla.com/api
-               mozilla-release: https://bounceradmin.mozilla.com/api
-               maple: https://admin-bouncer-releng.stage.mozaws.net/api
-               default: http://localhost/api
 
 jobs:
+   devedition:
+      bouncer-products: ['installer', 'installer-ssl', 'stub-installer']
+      shipping-product: devedition
+
    fennec:
-      name: fennec_release_bouncer_aliases
+      bouncer-products: ['apk']
       shipping-product: fennec
-      run:
-         product: fennec
-         buildername: release-{branch}-fennec_bouncer_aliases
 
    firefox:
-      name: firefox_release_bouncer_aliases
+      bouncer-products: ['installer', 'installer-ssl', 'stub-installer']
       shipping-product: firefox
-      run:
-         product: firefox
-         buildername: release-{branch}-firefox_bouncer_aliases
-
-   devedition:
-      name: devedition_release_bouncer_aliases
-      shipping-product: devedition
-      run:
-         product: devedition
-         buildername: release-{branch}-devedition_bouncer_aliases
--- a/taskcluster/ci/release-bouncer-sub/kind.yml
+++ b/taskcluster/ci/release-bouncer-sub/kind.yml
@@ -8,30 +8,28 @@ transforms:
    - taskgraph.transforms.bouncer_submission:transforms
    - taskgraph.transforms.release_notifications:transforms
    - taskgraph.transforms.task:transforms
 
 job-defaults:
    description: release bouncer submission job
    worker-type:
       by-project:
-         mozilla-central: scriptworker-prov-v1/bouncer-v1
          mozilla-beta: scriptworker-prov-v1/bouncer-v1
          mozilla-release: scriptworker-prov-v1/bouncer-v1
          default: scriptworker-prov-v1/bouncer-dev
    worker:
       implementation: bouncer-submission
    scopes:
       by-project:
          mozilla-beta: ['project:releng:bouncer:server:production']
          mozilla-release: ['project:releng:bouncer:server:production']
          default: ['project:releng:bouncer:server:staging']
    run-on-projects: []
    shipping-phase: promote
-   shipping-product: firefox
    locales-file: browser/locales/l10n-changesets.json
 
 jobs:
    devedition:
       bouncer-platforms: ['linux', 'linux64', 'osx', 'win', 'win64']
       bouncer-products: ['complete-mar', 'installer', 'installer-ssl', 'partial-mar', 'stub-installer']
       shipping-product: devedition
 
new file mode 100644
--- /dev/null
+++ b/taskcluster/taskgraph/transforms/bouncer_aliases.py
@@ -0,0 +1,97 @@
+# 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 craft_bouncer_product_name
+from taskgraph.util.schema import resolve_keyed_by
+from taskgraph.util.scriptworker import get_release_config
+
+logger = logging.getLogger(__name__)
+
+transforms = TransformSequence()
+
+
+@transforms.add
+def make_task_worker(config, jobs):
+    for job in jobs:
+        resolve_keyed_by(
+            job, 'worker-type', item_name=job['name'], project=config.params['project']
+        )
+        resolve_keyed_by(
+            job, 'scopes', item_name=job['name'], project=config.params['project']
+        )
+
+        job['scopes'].append('project:releng:bouncer:action:aliases')
+        job['worker']['entries'] = craft_bouncer_entries(config, job)
+
+        del job['bouncer-products']
+
+        if job['worker']['entries']:
+            yield job
+        else:
+            logger.warn('No bouncer entries defined in bouncer submission task for "{}". \
+Job deleted.'.format(job['name']))
+
+
+def craft_bouncer_entries(config, job):
+    release_config = get_release_config(config)
+
+    product = job['shipping-product']
+    release_type = config.params['release_type']
+    # The release_type is defined but may point to None.
+    if not release_type:
+        release_type = ''
+    current_version = release_config['version']
+    bouncer_products = job['bouncer-products']
+
+    return {
+        craft_bouncer_alias(product, bouncer_product, release_type): craft_bouncer_product_name(
+            product, bouncer_product, current_version,
+        )
+        for bouncer_product in bouncer_products
+    }
+
+
+def craft_bouncer_alias(product, bouncer_product, release_type):
+    return '{product}{channel}{postfix}'.format(
+        product=_craft_product(product),
+        channel=_craft_channel_string_of_alias(product, release_type),
+        postfix=_craft_alias_postfix(bouncer_product)
+    )
+
+
+def _craft_product(product):
+    # XXX devedition is provided in the channel function
+    return 'firefox' if product == 'devedition' else product
+
+
+def _craft_channel_string_of_alias(product, release_type):
+    if product == 'devedition':
+        return '-devedition'
+    elif release_type == 'beta':
+        return '-beta'
+    elif 'esr' in release_type:
+        return '-esr'
+
+    return ''
+
+
+def _craft_alias_postfix(bouncer_product):
+    if 'stub' in bouncer_product:
+        postfix = '-stub'
+    elif 'installer' in bouncer_product or bouncer_product == 'apk':
+        postfix = '-latest'
+        if 'ssl' in bouncer_product:
+            postfix = '{}-ssl'.format(postfix)
+    else:
+        raise Exception('Unknown bouncer product "{}"'.format(bouncer_product))
+
+    return postfix
--- a/taskcluster/taskgraph/transforms/bouncer_submission.py
+++ b/taskcluster/taskgraph/transforms/bouncer_submission.py
@@ -11,18 +11,16 @@ import logging
 
 from taskgraph.transforms.base import TransformSequence
 from taskgraph.transforms.l10n import parse_locales_file
 from taskgraph.util.schema import resolve_keyed_by
 from taskgraph.util.scriptworker import get_release_config
 
 logger = logging.getLogger(__name__)
 
-transforms = TransformSequence()
-
 
 FTP_PLATFORMS_PER_BOUNCER_PLATFORM = {
     'android': 'android-api-16',
     'android-x86': 'android-x86',
     'linux': 'linux-i686',
     'linux64': 'linux-x86_64',
     'osx': 'mac',
     'win': 'win32',
@@ -183,29 +181,33 @@ def craft_paths_per_bouncer_platform(pro
             file=file_name,
         )
 
         paths_per_bouncer_platform[bouncer_platform] = file_relative_location
 
     return paths_per_bouncer_platform
 
 
-def craft_bouncer_product_name(product, bouncer_product, current_version, current_build_number,
-                               previous_version=None):
+def craft_bouncer_product_name(product, bouncer_product, current_version,
+                               current_build_number=None, previous_version=None):
     if '-ssl' in bouncer_product:
         postfix = '-SSL'
     elif 'stub-' in bouncer_product:
         postfix = '-stub'
     elif 'complete-' in bouncer_product:
         postfix = '-Complete'
     elif 'partial-' in bouncer_product:
         if not previous_version:
             raise Exception('Partial is being processed, but no previous version defined.')
 
         if '-candidates' in bouncer_product:
+            if not current_build_number:
+                raise Exception('Partial in candidates directory is being processed, \
+but no current build number defined.')
+
             postfix = 'build{build_number}-Partial-{previous_version_with_build_number}'.format(
                 build_number=current_build_number,
                 previous_version_with_build_number=previous_version,
             )
         else:
             postfix = '-Partial-{previous_version}'.format(
                 previous_version=strip_build_data(previous_version)
             )
--- a/taskcluster/taskgraph/transforms/task.py
+++ b/taskcluster/taskgraph/transforms/task.py
@@ -543,16 +543,19 @@ task_description_schema = Schema({
 
             # type of signing task (for CoT)
             Required('taskType'): basestring,
 
             # Paths to the artifacts to sign
             Required('paths'): [basestring],
         }],
     }, {
+        Required('implementation'): 'bouncer-aliases',
+        Required('entries'): object,
+    }, {
         Required('implementation'): 'bouncer-submission',
         Required('locales'): [basestring],
         Required('entries'): object,
     }, {
         Required('implementation'): 'push-apk-breakpoint',
         Required('payload'): object,
     }, {
         Required('implementation'): 'invalid',
@@ -1045,16 +1048,25 @@ def build_beetmover_cdns_payload(config,
 def build_balrog_payload(config, task, task_def):
     worker = task['worker']
 
     task_def['payload'] = {
         'upstreamArtifacts':  worker['upstream-artifacts']
     }
 
 
+@payload_builder('bouncer-aliases')
+def build_bouncer_aliases_payload(config, task, task_def):
+    worker = task['worker']
+
+    task_def['payload'] = {
+        'aliases_entries': worker['entries']
+    }
+
+
 @payload_builder('bouncer-submission')
 def build_bouncer_submission_payload(config, task, task_def):
     worker = task['worker']
 
     task_def['payload'] = {
         'locales':  worker['locales'],
         'submission_entries': worker['entries']
     }