Bug 1402015 - Override Balrog blob name suffix, MAR filename pattern, Bouncer product name pattern r=sfraser
authorRail Aliiev <rail@mozilla.com>
Mon, 02 Oct 2017 11:57:09 -0400
changeset 8137 a2ecd77a1ee12e13521371ac4dcfe02eab7bb62c
parent 8136 5f6367ddf320ee59ac6e850b47fdbbdd5c533dd4
child 8138 aeca53320ba024fc2e49eb4942b293b56eca6ec8
push id249
push userbmo:rail@mozilla.com
push dateMon, 02 Oct 2017 15:57:19 +0000
reviewerssfraser
bugs1402015
Bug 1402015 - Override Balrog blob name suffix, MAR filename pattern, Bouncer product name pattern r=sfraser MozReview-Commit-ID: Drv2jIu1qXL
lib/python/balrog/submitter/cli.py
scripts/build-promotion/balrog-release-pusher.py
scripts/build-promotion/balrog-release-shipper.py
--- a/lib/python/balrog/submitter/cli.py
+++ b/lib/python/balrog/submitter/cli.py
@@ -25,25 +25,28 @@ def get_nightly_blob_name(productName, b
     return '%s-%s-%s-%s' % (productName, branch, build_type, suffix)
 
 
 def get_release_blob_name(productName, version, build_number, suffix=""):
     return '%s-%s-build%s%s' % (productName, version, build_number, suffix)
 
 
 class ReleaseCreatorBase(object):
-    def __init__(self, api_root, auth, dummy=False, suffix=""):
+    def __init__(self, api_root, auth, dummy=False, suffix="",
+                 complete_mar_filename_pattern=None,
+                 complete_mar_bouncer_product_pattern=None):
         self.api_root = api_root
         self.auth = auth
         self.suffix = suffix
         if dummy and not suffix:
             self.suffix = "-dummy"
         else:
             self.suffix = suffix
-
+        self.complete_mar_filename_pattern = complete_mar_filename_pattern or '%s-%s.complete.mar'
+        self.complete_mar_bouncer_product_pattern = complete_mar_bouncer_product_pattern or '%s-%s-complete'
 
     def generate_data(self, appVersion, productName, version, buildNumber,
                       updateChannels, ftpServer, bouncerServer,
                       enUSPlatforms, schemaVersion, openURL=None,
                       **updateKwargs):
         assert schemaVersion in (3, 4), 'Unhandled schema version %s' % schemaVersion
         details_product = productName.lower()
         if details_product == "devedition":
@@ -141,17 +144,17 @@ class ReleaseCreatorV3(ReleaseCreatorBas
     def _get_update_data(self, productName, version, partialUpdates):
         file_prefix = productName.lower()
         if file_prefix == "devedition":
             file_prefix = "firefox"
 
         data = {
             "ftpFilenames": {
                 "completes": {
-                    "*": "%s-%s.complete.mar" % (file_prefix, version),
+                    "*": self.complete_mar_filename_pattern % (file_prefix, version),
                 }
             },
             "bouncerProducts": {
                 "completes": {
                     "*": "%s-%s-complete" % (file_prefix, version),
                 }
             }
         }
@@ -182,17 +185,16 @@ class ReleaseCreatorV4(ReleaseCreatorBas
     def _getFileUrls(self, productName, version, buildNumber, updateChannels,
                      ftpServer, bouncerServer, partialUpdates,
                      requiresMirrors=True):
         data = {"fileUrls": {}}
         file_prefix = productName.lower()
         if file_prefix == "devedition":
             file_prefix = "firefox"
 
-
         # "*" is for the default set of fileUrls, which generally points at
         # bouncer. It's helpful to have this to reduce duplication between
         # the live channel and the cdntest channel (which eliminates the
         # possibility that those two channels serve different contents).
         uniqueChannels = ["*"]
         for c in updateChannels:
             # localtest channels are different than the default because they
             # point directly at FTP rather than Bouncer.
@@ -209,27 +211,27 @@ class ReleaseCreatorV4(ReleaseCreatorBas
         for channel in uniqueChannels:
             data["fileUrls"][channel] = {
                 "completes": {}
             }
             if "localtest" in channel:
                 dir_ = makeCandidatesDir(productName.lower(), version,
                                          buildNumber, server=ftpServer,
                                          protocol='http')
-                filename = "%s-%s.complete.mar" % (file_prefix, version)
+                filename = self.complete_mar_filename_pattern % (file_prefix, version)
                 data["fileUrls"][channel]["completes"]["*"] = "%supdate/%%OS_FTP%%/%%LOCALE%%/%s" % (dir_, filename)
             else:
                 # See comment above about these channels for explanation.
                 if not requiresMirrors and channel in ("beta", "beta-cdntest", "beta-dev", "beta-dev-cdntest"):
                     bouncerProduct = "%s-%sbuild%s-complete" % (productName.lower(), version, buildNumber)
                 else:
                     if productName.lower() == "fennec":
                         bouncerProduct = "%s-%s" % (productName.lower(), version)
                     else:
-                        bouncerProduct = "%s-%s-complete" % (productName.lower(), version)
+                        bouncerProduct = self.complete_mar_bouncer_product_pattern % (productName.lower(), version)
                 url = 'http://%s/?product=%s&os=%%OS_BOUNCER%%&lang=%%LOCALE%%' % (bouncerServer, bouncerProduct)
                 data["fileUrls"][channel]["completes"]["*"] = url
 
         if not partialUpdates:
             return data
 
         for channel in uniqueChannels:
             data["fileUrls"][channel]["partials"] = {}
--- a/scripts/build-promotion/balrog-release-pusher.py
+++ b/scripts/build-promotion/balrog-release-pusher.py
@@ -54,31 +54,40 @@ if __name__ == '__main__':
         help="Hash function used in release blobs")
     parser.add_argument(
         "-v", "--verbose", action="store_const", dest="loglevel",
         const=logging.DEBUG, default=logging.INFO,
         help="Increase output verbosity")
     parser.add_argument(
         "--dummy", action="store_true", default=False,
         help="Use dummy balrog blobs")
-
+    parser.add_argument("--suffix", help="Balrog blob suffix")
+    parser.add_argument(
+        "--complete-mar-filename-pattern",
+        help="Override complete MAR file name pattern, e.g. '%s-%s.bz2.complete.mar'")
+    parser.add_argument(
+        "--complete-mar-bouncer-product-pattern",
+        help="Override Bouncer product name pattern, e.g. '%s-%s-complete-bz2'")
 
     args = parser.parse_args()
     logging.basicConfig(format="%(message)s", level=args.loglevel)
 
     partials = {}
     for v in args.partial_updates:
         version, build_number = v.split("build")
         partials[version] = {"buildNumber": build_number}
 
     credentials = {}
     execfile(args.credentials_file, credentials)
     auth = (args.username, credentials['balrog_credentials'][args.username])
-    creator = ReleaseCreatorV4(args.api_root, auth, dummy=args.dummy)
-    pusher = ReleasePusher(args.api_root, auth, dummy=args.dummy)
+    creator = ReleaseCreatorV4(
+        args.api_root, auth, dummy=args.dummy, suffix=args.suffix,
+        complete_mar_filename_pattern=args.complete_mar_filename_pattern,
+        complete_mar_bouncer_product_pattern=args.complete_mar_bouncer_product_pattern)
+    pusher = ReleasePusher(args.api_root, auth, dummy=args.dummy, suffix=args.suffix)
 
     creator.run(
         appVersion=args.app_version,
         productName=args.product.capitalize(),
         version=args.version,
         buildNumber=args.build_number,
         updateChannels=args.channels,
         ftpServer=args.archive_domain,
--- a/scripts/build-promotion/balrog-release-shipper.py
+++ b/scripts/build-promotion/balrog-release-shipper.py
@@ -16,42 +16,43 @@ sys.path.insert(0, path.join(path.dirnam
 sys.path.insert(0, path.join(path.dirname(__file__), "../../lib/python"))
 
 from balrog.submitter.cli import ReleasePusher, ReleaseScheduler
 
 if __name__ == '__main__':
 
     from argparse import ArgumentParser
     parser = ArgumentParser()
-    parser.add_argument("-a", "--api-root", dest="api_root",required=True)
+    parser.add_argument("-a", "--api-root", dest="api_root", required=True)
     parser.add_argument("-c", "--credentials-file", dest="credentials_file", required=True)
     parser.add_argument("-u", "--username", dest="username", required=True)
     parser.add_argument("-V", "--version", dest="version", required=True)
     parser.add_argument("-p", "--product", dest="product_name", required=True)
     parser.add_argument("-b", "--build-number", dest="build_number", required=True)
     parser.add_argument("-R", "--rules", dest="rule_ids", action="append", required=True)
     parser.add_argument("-s", "--schedule-at", dest="schedule_at", default=None)
     parser.add_argument("-B", "--background-rate", dest="backgroundRate", default=None)
     parser.add_argument("-v", "--verbose", dest="verbose", action="store_true")
+    parser.add_argument("--suffix", dest="suffix", help="Balrog blob suffix")
     args = parser.parse_args()
 
     logging_level = logging.INFO
     if args.verbose:
         logging_level = logging.DEBUG
     logging.basicConfig(stream=sys.stdout, level=logging_level,
                         format="%(message)s")
 
     credentials = {}
     execfile(args.credentials_file, credentials)
     auth = (args.username, credentials['balrog_credentials'][args.username])
 
     if args.schedule_at:
-        scheduler = ReleaseScheduler(args.api_root, auth)
+        scheduler = ReleaseScheduler(args.api_root, auth, suffix=args.suffix)
         if args.backgroundRate:
             scheduler.run(args.product_name.capitalize(), args.version,
                           args.build_number, args.rule_ids, args.schedule_at, args.backgroundRate)
         else:
             scheduler.run(args.product_name.capitalize(), args.version,
                           args.build_number, args.rule_ids, args.schedule_at)
     else:
-        pusher = ReleasePusher(args.api_root, auth)
+        pusher = ReleasePusher(args.api_root, auth, suffix=args.suffix)
         pusher.run(args.product_name.capitalize(), args.version,
                 args.build_number, args.rule_ids, args.backgroundRate)