Bug 1160385 - Generate beetmover checksums r=jlund a=release DONTBUILD draft
authorRail Aliiev <rail@mozilla.com>
Thu, 28 Apr 2016 08:25:31 -0400
changeset 357281 1d2b8dd0fb12d90b681b40fcb860c2ef5f4ba74c
parent 357050 67daee81b5155f7c539106313619ac5a394d6793
child 519615 44a77ad34e30e65773fc12e0ce39af4e367a058c
push id16748
push userbmo:rail@mozilla.com
push dateThu, 28 Apr 2016 12:26:28 +0000
reviewersjlund, release
bugs1160385
milestone49.0a1
Bug 1160385 - Generate beetmover checksums r=jlund a=release DONTBUILD MozReview-Commit-ID: 6FmsshqCHJA
testing/mozharness/configs/beetmover/en_us.yml.tmpl
testing/mozharness/configs/beetmover/l10n_changesets.tmpl
testing/mozharness/configs/beetmover/partials.yml.tmpl
testing/mozharness/configs/beetmover/repacks.yml.tmpl
testing/mozharness/configs/beetmover/source.yml.tmpl
testing/mozharness/configs/beetmover/source_checksums.yml.tmpl
testing/mozharness/scripts/release/beet_mover.py
testing/mozharness/scripts/release/generate-checksums.py
testing/mozharness/scripts/release/push-candidate-to-releases.py
--- a/testing/mozharness/configs/beetmover/en_us.yml.tmpl
+++ b/testing/mozharness/configs/beetmover/en_us.yml.tmpl
@@ -5,149 +5,149 @@ metadata:
     owner: "release@mozilla.com"
 
 mapping:
 {% for locale in locales %}
   # common deliverables
   {{ locale }}:
     complete_mar:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.complete.mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/update/{{ platform }}/{{ locale }}/firefox-{{ version }}.complete.mar
+      s3_key: {{ s3_prefix }}update/{{ platform }}/{{ locale }}/firefox-{{ version }}.complete.mar
     checksum:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.checksums
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums
     checksum_sig:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.checksums.asc
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums.asc
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums.asc
     buildinfo:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.json
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.json
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.json
     mozinfo:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.mozinfo.json
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.mozinfo.json
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.mozinfo.json
     socorroinfo:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.txt
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.txt
     jsshell:
       artifact: {{ artifact_base_url }}/jsshell-{{ platform }}.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/jsshell-{{ platform }}.zip
+      s3_key: {{ s3_prefix }}jsshell-{{ platform }}.zip
     mozharness_package:
       artifact: {{ artifact_base_url }}/mozharness.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/mozharness.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/mozharness.zip
     xpi:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.langpack.xpi
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/xpi/{{ locale }}.xpi
+      s3_key: {{ s3_prefix }}{{ platform }}/xpi/{{ locale }}.xpi
 
   {% if platform == "win32" %}
     full_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
     stub_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer-stub.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup Stub {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup Stub {{ version }}.exe
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
     symbols:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.crashreporter-symbols.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
     buildid_info:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}_info.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/win32_info.txt
+      s3_key: {{ s3_prefix }}win32_info.txt
     sdk:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.sdk.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/firefox-{{ version }}.{{ platform }}.sdk.zip
+      s3_key: {{ s3_prefix }}firefox-{{ version }}.{{ platform }}.sdk.zip
     mar_tools_mar:
       artifact: {{ artifact_base_url }}/mar.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/win32/mar.exe
+      s3_key: {{ s3_prefix }}mar-tools/win32/mar.exe
     mar_tools_mbdiff:
       artifact: {{ artifact_base_url }}/mbsdiff.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/win32/mbsdiff.exe
+      s3_key: {{ s3_prefix }}mar-tools/win32/mbsdiff.exe
   {% endif %}
 
   {% if platform == "win64" %}
     full_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
     symbols:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.crashreporter-symbols.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
     buildid_info:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}_info.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/win64_info.txt
+      s3_key: {{ s3_prefix }}win64_info.txt
     sdk:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.sdk.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/firefox-{{ version }}.{{ platform }}.sdk.zip
+      s3_key: {{ s3_prefix }}firefox-{{ version }}.{{ platform }}.sdk.zip
     mar_tools_mar:
       artifact: {{ artifact_base_url }}/mar.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/win64/mar.exe
+      s3_key: {{ s3_prefix }}mar-tools/win64/mar.exe
     mar_tools_mbdiff:
       artifact: {{ artifact_base_url }}/mbsdiff.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/win64/mbsdiff.exe
+      s3_key: {{ s3_prefix }}mar-tools/win64/mbsdiff.exe
   {% endif %}
 
   {% if platform == "linux-i686" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
     symbols:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.crashreporter-symbols.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
     buildid_info:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}_info.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/linux_info.txt
+      s3_key: {{ s3_prefix }}linux_info.txt
     sdk:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.sdk.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/firefox-{{ version }}.{{ platform }}.sdk.tar.bz2
+      s3_key: {{ s3_prefix }}firefox-{{ version }}.{{ platform }}.sdk.tar.bz2
     mar_tools_mar:
       artifact: {{ artifact_base_url }}/mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/linux/mar
+      s3_key: {{ s3_prefix }}mar-tools/linux/mar
     mar_tools_mbdiff:
       artifact: {{ artifact_base_url }}/mbsdiff
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/linux/mbsdiff
+      s3_key: {{ s3_prefix }}mar-tools/linux/mbsdiff
   {% endif %}
 
   {% if platform == "linux-x86_64" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
     symbols:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.crashreporter-symbols.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.crashreporter-symbols.zip
     buildid_info:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}_info.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/linux64_info.txt
+      s3_key: {{ s3_prefix }}linux64_info.txt
     sdk:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.sdk.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/firefox-{{ version }}.{{ platform }}.sdk.tar.bz2
+      s3_key: {{ s3_prefix }}firefox-{{ version }}.{{ platform }}.sdk.tar.bz2
     mar_tools_mar:
       artifact: {{ artifact_base_url }}/mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/linux64/mar
+      s3_key: {{ s3_prefix }}mar-tools/linux64/mar
     mar_tools_mbdiff:
       artifact: {{ artifact_base_url }}/mbsdiff
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/linux64/mbsdiff
+      s3_key: {{ s3_prefix }}mar-tools/linux64/mbsdiff
   {% endif %}
 
   {% if platform == "mac" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.dmg
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox {{ version }}.dmg
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox {{ version }}.dmg
     symbols:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.crashreporter-symbols.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox {{ version }}.crashreporter-symbols.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox {{ version }}.crashreporter-symbols.zip
     buildid_info:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}_info.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/macosx64_info.txt
+      s3_key: {{ s3_prefix }}macosx64_info.txt
     sdk:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}-x86_64.sdk.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/firefox-{{ version }}.{{ platform }}-x86_64.sdk.tar.bz2
+      s3_key: {{ s3_prefix }}firefox-{{ version }}.{{ platform }}-x86_64.sdk.tar.bz2
     mar_tools_mar:
       artifact: {{ artifact_base_url }}/mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/macosx64/mar
+      s3_key: {{ s3_prefix }}mar-tools/macosx64/mar
     mar_tools_mbdiff:
       artifact: {{ artifact_base_url }}/mbsdiff
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/mar-tools/macosx64/mbsdiff
+      s3_key: {{ s3_prefix }}mar-tools/macosx64/mbsdiff
   {% endif %}
 
 {% endfor %}
--- a/testing/mozharness/configs/beetmover/l10n_changesets.tmpl
+++ b/testing/mozharness/configs/beetmover/l10n_changesets.tmpl
@@ -3,9 +3,9 @@ metadata:
     name: "Beet Mover L10N Changesets"
     description: "Maps artifact locations to s3 key names for L10N changesets"
     owner: "release@mozilla.com"
 
 mapping:
   all:
     l10n_changesets:
       artifact: {{ artifact_base_url }}/l10n_changesets.txt
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/l10n_changesets.txt
+      s3_key: {{ s3_prefix }}l10n_changesets.txt
--- a/testing/mozharness/configs/beetmover/partials.yml.tmpl
+++ b/testing/mozharness/configs/beetmover/partials.yml.tmpl
@@ -4,13 +4,13 @@ metadata:
     description: "Maps artifact locations to s3 key names for partials"
     owner: "release@mozilla.com"
 
 mapping:
 {% for locale in locales %}
   {{ locale }}:
     partial_mar:
       artifact: {{ artifact_base_url }}/firefox-{{ partial_version }}-{{ version }}.{{ locale }}.{{ platform }}.partial.mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/update/{{ platform }}/{{ locale }}/firefox-{{ partial_version }}-{{ version }}.partial.mar
+      s3_key: {{ s3_prefix }}update/{{ platform }}/{{ locale }}/firefox-{{ partial_version }}-{{ version }}.partial.mar
     partial_mar_sig:
       artifact: {{ artifact_base_url }}/firefox-{{ partial_version }}-{{ version }}.{{ locale }}.{{ platform }}.partial.mar.asc
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/update/{{ platform }}/{{ locale }}/firefox-{{ partial_version }}-{{ version }}.partial.mar.asc
+      s3_key: {{ s3_prefix }}update/{{ platform }}/{{ locale }}/firefox-{{ partial_version }}-{{ version }}.partial.mar.asc
 {% endfor %}
--- a/testing/mozharness/configs/beetmover/repacks.yml.tmpl
+++ b/testing/mozharness/configs/beetmover/repacks.yml.tmpl
@@ -5,59 +5,59 @@ metadata:
     owner: "release@mozilla.com"
 
 mapping:
 {% for locale in locales %}
   # common deliverables
   {{ locale }}:
     complete_mar:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.complete.mar
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/update/{{ platform }}/{{ locale }}/firefox-{{ version }}.complete.mar
+      s3_key: {{ s3_prefix }}update/{{ platform }}/{{ locale }}/firefox-{{ version }}.complete.mar
     checksum:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.checksums
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums
     checksum_sig:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.checksums.asc
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums.asc
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.checksums.asc
     xpi:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.langpack.xpi
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/xpi/{{ locale }}.xpi
+      s3_key: {{ s3_prefix }}{{ platform }}/xpi/{{ locale }}.xpi
 
   {% if platform == "win32" %}
     full_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
     stub_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer-stub.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup Stub {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup Stub {{ version }}.exe
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
   {% endif %}
 
   {% if platform == "win64" %}
     full_installer:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.installer.exe
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox Setup {{ version }}.exe
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.zip
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.zip
   {% endif %}
 
   {% if platform == "linux-i686" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
   {% endif %}
 
   {% if platform == "linux-x86_64" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.tar.bz2
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/firefox-{{ version }}.tar.bz2
   {% endif %}
 
   {% if platform == "mac" %}
     package:
       artifact: {{ artifact_base_url }}/firefox-{{ app_version }}.{{ locale }}.{{ platform }}.dmg
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/{{ platform }}/{{ locale }}/Firefox {{ version }}.dmg
+      s3_key: {{ s3_prefix }}{{ platform }}/{{ locale }}/Firefox {{ version }}.dmg
   {% endif %}
 
 {% endfor %}
--- a/testing/mozharness/configs/beetmover/source.yml.tmpl
+++ b/testing/mozharness/configs/beetmover/source.yml.tmpl
@@ -3,12 +3,12 @@ metadata:
     name: "Beet Mover Manifest"
     description: "Maps artifact locations to s3 key names for source bundles"
     owner: "release@mozilla.com"
 
 mapping:
   all:
     source_bundle:
       artifact: {{ artifact_base_url }}/firefox-{{ version }}.bundle
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/source/firefox-{{ version }}.bundle
+      s3_key: {{ s3_prefix }}source/firefox-{{ version }}.bundle
     source_tar:
       artifact: {{ artifact_base_url }}/firefox-{{ version }}.source.tar.xz
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/source/firefox-{{ version }}.source.tar.xz
+      s3_key: {{ s3_prefix }}source/firefox-{{ version }}.source.tar.xz
--- a/testing/mozharness/configs/beetmover/source_checksums.yml.tmpl
+++ b/testing/mozharness/configs/beetmover/source_checksums.yml.tmpl
@@ -3,12 +3,12 @@ metadata:
     name: "Beet Mover Manifest"
     description: "Maps artifact locations to s3 key names for source bundle checksums"
     owner: "release@mozilla.com"
 
 mapping:
   all:
     source_checksum:
       artifact: {{ artifact_base_url }}/firefox-{{ version }}.source.checksums
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/source/firefox-{{ version }}.source.checksums
+      s3_key: {{ s3_prefix }}source/firefox-{{ version }}.source.checksums
     source_checksum_asc:
       artifact: {{ artifact_base_url }}/firefox-{{ version }}.source.checksums.asc
-      s3_key: {{ s3_prefix }}/{{ version }}-candidates/{{ build_num }}/source/firefox-{{ version }}.source.checksums.asc
+      s3_key: {{ s3_prefix }}source/firefox-{{ version }}.source.checksums.asc
--- a/testing/mozharness/scripts/release/beet_mover.py
+++ b/testing/mozharness/scripts/release/beet_mover.py
@@ -170,118 +170,132 @@ class BeetMover(BaseScript, VirtualenvMi
         import jinja2
         self.virtualenv_imports = {
             'boto': boto,
             'yaml': yaml,
             'jinja2': jinja2,
         }
         self.log("activated virtualenv with the modules: {}".format(str(self.virtualenv_imports)))
 
+    def _get_template_vars(self):
+        return {
+            "platform": self.config['platform'],
+            "locales": self.config.get('locales'),
+            "version": self.config['version'],
+            "app_version": self.config.get('app_version', ''),
+            "partial_version": self.config.get('partial_version', ''),
+            "build_num": self.config['build_num'],
+            # keep the trailing slash
+            "s3_prefix": 'pub/{prod}/candidates/{ver}-candidates/{n}/'.format(
+                prod=self.config['product'], ver=self.config['version'],
+                n=self.config['build_num']
+            ),
+            "artifact_base_url": self.config['artifact_base_url'].format(
+                    taskid=self.config['taskid'], subdir=self.config['artifact_subdir']
+            )
+        }
+
     def generate_candidates_manifest(self):
         """
         generates and outputs a manifest that maps expected Taskcluster artifact names
         to release deliverable names
         """
         self.log('generating manifest from {}...'.format(self.config['template']))
         template_dir, template_file = os.path.split(os.path.abspath(self.config['template']))
         jinja2 = self.virtualenv_imports['jinja2']
         yaml = self.virtualenv_imports['yaml']
 
         jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir),
                                        undefined=jinja2.StrictUndefined)
         template = jinja_env.get_template(template_file)
-        template_vars = {
-            "platform": self.config['platform'],
-            "locales": self.config.get('locales'),
-            "version": self.config['version'],
-            "app_version": self.config.get('app_version', ''),
-            "partial_version": self.config.get('partial_version', ''),
-            "build_num": self.config['build_num'],
-            # mirror current release folder structure
-            "s3_prefix": 'pub/{}/candidates'.format(self.config['product']),
-            "artifact_base_url": self.config['artifact_base_url'].format(
-                    taskid=self.config['taskid'], subdir=self.config['artifact_subdir']
-            )
-        }
-        self.manifest = yaml.safe_load(template.render(**template_vars))
+        self.manifest = yaml.safe_load(template.render(**self._get_template_vars()))
 
         self.log("manifest generated:")
         self.log(pprint.pformat(self.manifest['mapping']))
 
     def verify_bits(self):
         """
         inspects each artifact and verifies that they were created by trustworthy tasks
         """
         # TODO
         self.log('skipping verification. unimplemented...')
 
     def refresh_antivirus(self):
-       self.info("Refreshing clamav db...")
-       try:
-           redo.retry(lambda:
-                      sh.freshclam("--stdout", "--verbose", _timeout=300, _err_to_out=True))
-           self.info("Done.")
-       except sh.ErrorReturnCode:
-           self.warning("Freshclam failed, skipping DB update")
+        self.info("Refreshing clamav db...")
+        try:
+            redo.retry(lambda:
+                       sh.freshclam("--stdout", "--verbose", _timeout=300,
+                                    _err_to_out=True))
+            self.info("Done.")
+        except sh.ErrorReturnCode:
+            self.warning("Freshclam failed, skipping DB update")
 
     def download_bits(self):
         """
         downloads list of artifacts to self.dest_dir dir based on a given manifest
         """
         self.log('downloading and uploading artifacts to self_dest_dir...')
-
-        # TODO - do we want to mirror/upload to more than one region?
         dirs = self.query_abs_dirs()
 
         for locale in self.manifest['mapping']:
             for deliverable in self.manifest['mapping'][locale]:
                 self.log("downloading '{}' deliverable for '{}' locale".format(deliverable, locale))
-                # download locally to working dir
-                source=self.manifest['mapping'][locale][deliverable]['artifact']
-                file_name = self.retry(self.download_file,
+                source = self.manifest['mapping'][locale][deliverable]['artifact']
+                self.retry(
+                    self.download_file,
                     args=[source],
                     kwargs={'parent_dir': dirs['abs_work_dir']},
                     error_level=FATAL)
         self.log('Success!')
 
+    def _strip_prefix(self, s3_key):
+        """Return file name relative to prefix"""
+        # "abc/def/hfg".split("abc/de")[-1] == "f/hfg"
+        return s3_key.split(self._get_template_vars()["s3_prefix"])[-1]
+
     def upload_bits(self):
         """
         uploads list of artifacts to s3 candidates dir based on a given manifest
         """
         self.log('uploading artifacts to s3...')
         dirs = self.query_abs_dirs()
 
         # connect to s3
         boto = self.virtualenv_imports['boto']
         conn = boto.connect_s3(self.aws_key_id, self.aws_secret_key)
         bucket = conn.get_bucket(self.bucket)
 
-        #todo change so this is not every entry in manifest - should exclude those that don't pass virus sign
-        #not sure how to determine this
         for locale in self.manifest['mapping']:
             for deliverable in self.manifest['mapping'][locale]:
                 self.log("uploading '{}' deliverable for '{}' locale".format(deliverable, locale))
-                #we have already downloaded the files locally so we can use that version
+                # we have already downloaded the files locally so we can use that version
                 source = self.manifest['mapping'][locale][deliverable]['artifact']
+                s3_key = self.manifest['mapping'][locale][deliverable]['s3_key']
                 downloaded_file = os.path.join(dirs['abs_work_dir'], self.get_filename_from_url(source))
-                self.upload_bit(
-                    source=downloaded_file,
-                    s3_key=self.manifest['mapping'][locale][deliverable]['s3_key'],
-                    bucket=bucket,
+                # generate checksums for every uploaded file
+                beet_file_name = '{}.beet'.format(downloaded_file)
+                # upload checksums to a separate subdirectory
+                beet_dest = '{prefix}beetmover-checksums/{f}.beet'.format(
+                    prefix=self._get_template_vars()["s3_prefix"],
+                    f=self._strip_prefix(s3_key)
                 )
+                beet_contents = '{hash} sha512 {size} {name}\n'.format(
+                    hash=self.file_sha512sum(downloaded_file),
+                    size=os.path.getsize(downloaded_file),
+                    name=self._strip_prefix(s3_key))
+                self.write_to_file(beet_file_name, beet_contents)
+                self.upload_bit(source=downloaded_file, s3_key=s3_key,
+                                bucket=bucket)
+                self.upload_bit(source=beet_file_name, s3_key=beet_dest,
+                                bucket=bucket)
         self.log('Success!')
 
 
     def upload_bit(self, source, s3_key, bucket):
-        # TODO - do we want to mirror/upload to more than one region?
-        dirs = self.query_abs_dirs()
         boto = self.virtualenv_imports['boto']
-
-        #todo need to copy from dir to s3
-
         self.info('uploading to s3 with key: {}'.format(s3_key))
         key = boto.s3.key.Key(bucket)  # create new key
         key.key = s3_key  # set key name
 
         self.info("Checking if `{}` already exists".format(s3_key))
         key = bucket.get_key(s3_key)
         if not key:
             self.info("Uploading to `{}`".format(s3_key))
--- a/testing/mozharness/scripts/release/generate-checksums.py
+++ b/testing/mozharness/scripts/release/generate-checksums.py
@@ -118,38 +118,38 @@ class ChecksumsGenerator(BaseScript, Vir
 
         # These defaults are set here rather in the config because default
         # lists cannot be completely overidden, only appended to.
         if not self.config.get("formats"):
             self.config["formats"] = ["sha512"]
 
         if not self.config.get("includes"):
             self.config["includes"] = [
-                "^.*\.tar\.bz2$",
-                "^.*\.tar\.xz$",
-                "^.*\.dmg$",
-                "^.*\.bundle$",
-                "^.*\.mar$",
-                "^.*Setup.*\.exe$",
-                "^.*\.xpi$",
+                r"^.*\.tar\.bz2$",
+                r"^.*\.tar\.xz$",
+                r"^.*\.dmg$",
+                r"^.*\.bundle$",
+                r"^.*\.mar$",
+                r"^.*Setup.*\.exe$",
+                r"^.*\.xpi$",
             ]
 
     def _get_bucket_name(self):
         if self.config.get('bucket_name_full'):
             return self.config['bucket_name_full']
 
         suffix = "archive"
         # Firefox has a special bucket, per https://github.com/mozilla-services/product-delivery-tools/blob/master/bucketmap.go
         if self.config["stage_product"] == "firefox":
             suffix = "firefox"
 
         return "{}-{}".format(self.config["bucket_name_prefix"], suffix)
 
     def _get_file_prefix(self):
-        return "pub/{}/candidates/{}-candidates/build{}".format(
+        return "pub/{}/candidates/{}-candidates/build{}/".format(
             self.config["stage_product"], self.config["version"], self.config["build_number"]
         )
 
     def _get_sums_filename(self, format_):
         return "{}SUMS".format(format_.upper())
 
     def _get_bucket(self):
         if not self.bucket:
@@ -176,22 +176,32 @@ class ChecksumsGenerator(BaseScript, Vir
             self.debug("Downloading {}".format(item))
             # TODO: It would be nice to download the associated .asc file
             # and verify against it.
             sums = bucket.get_key(item).get_contents_as_string()
             raw_checksums.append(sums)
 
         def find_checksums_files():
             self.info("Getting key names from bucket")
+            checksum_files = {"beets": [], "checksums": []}
             for key in bucket.list(prefix=self.file_prefix):
                 if key.key.endswith(".checksums"):
                     self.debug("Found checksums file: {}".format(key.key))
-                    yield key.key
+                    checksum_files["checksums"].append(key.key)
+                elif key.key.endswith(".beet"):
+                    self.debug("Found beet file: {}".format(key.key))
+                    checksum_files["beets"].append(key.key)
                 else:
                     self.debug("Ignoring non-checksums file: {}".format(key.key))
+            if checksum_files["beets"]:
+                self.log("Using beet format")
+                return checksum_files["beets"]
+            else:
+                self.log("Using checksums format")
+                return checksum_files["checksums"]
 
         pool = ThreadPool(self.config["parallelization"])
         pool.map(worker, find_checksums_files())
 
         for c in raw_checksums:
             for f, info in parse_checksums_file(c).iteritems():
                 for pattern in self.config["includes"]:
                     if re.search(pattern, f):
--- a/testing/mozharness/scripts/release/push-candidate-to-releases.py
+++ b/testing/mozharness/scripts/release/push-candidate-to-releases.py
@@ -100,17 +100,18 @@ class ReleasePusher(BaseScript, Virtuale
                 r"^.*/partner-repacks.*$",
                 r"^.*.checksums(\.asc)?$",
                 r"^.*/logs/.*$",
                 r"^.*/jsshell.*$",
                 r"^.*json$",
                 r"^.*/host.*$",
                 r"^.*/mar-tools/.*$",
                 r"^.*robocop.apk$",
-                r"^.*contrib.*"
+                r"^.*contrib.*",
+                r"^.*/beetmover-checksums/.*$",
             ]
 
     def _get_candidates_prefix(self):
         return "pub/{}/candidates/{}-candidates/build{}/".format(
             self.config['product'],
             self.config["version"],
             self.config["build_number"]
         )