Bug 1402011 - Use suffix for Balrog release blob names r=sfraser THUNDERBIRD_56_0b4_BUILD2
authorRail Aliiev <rail@mozilla.com>
Thu, 21 Sep 2017 12:12:09 -0400
changeset 8100 11abdf3a8a6fea776575d96218c1245f390646d8
parent 8099 d069f89487226dbc22631edfb5b2f8127a36f83b
child 8101 5a1fdddb698675c15125cea18d742bd03415edb4
push id248
push userbmo:rail@mozilla.com
push dateThu, 21 Sep 2017 16:12:18 +0000
reviewerssfraser
bugs1402011
Bug 1402011 - Use suffix for Balrog release blob names r=sfraser MozReview-Commit-ID: 19oHsN0yntB
lib/python/balrog/submitter/cli.py
--- a/lib/python/balrog/submitter/cli.py
+++ b/lib/python/balrog/submitter/cli.py
@@ -20,28 +20,30 @@ log = logging.getLogger(__name__)
 
 
 def get_nightly_blob_name(productName, branch, build_type, suffix, dummy=False):
     if dummy:
         branch = '%s-dummy' % branch
     return '%s-%s-%s-%s' % (productName, branch, build_type, suffix)
 
 
-def get_release_blob_name(productName, version, build_number, dummy=False):
-    name = '%s-%s-build%s' % (productName, version, build_number)
-    if dummy:
-        name += '-dummy'
-    return name
+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):
+    def __init__(self, api_root, auth, dummy=False, suffix=""):
         self.api_root = api_root
         self.auth = auth
-        self.dummy = dummy
+        self.suffix = suffix
+        if dummy and not suffix:
+            self.suffix = "-dummy"
+        else:
+            self.suffix = suffix
+
 
     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":
@@ -93,17 +95,17 @@ class ReleaseCreatorBase(object):
             updateChannels, ftpServer, bouncerServer,
             enUSPlatforms, hashFunction, schemaVersion, openURL=None,
             **updateKwargs):
         data = self.generate_data(appVersion, productName, version,
                                   buildNumber, updateChannels,
                                   ftpServer, bouncerServer, enUSPlatforms,
                                   schemaVersion, openURL, **updateKwargs)
         name = get_release_blob_name(productName, version, buildNumber,
-                                     self.dummy)
+                                     self.suffix)
         api = Release(name=name, auth=self.auth, api_root=self.api_root)
         try:
             current_data, data_version = api.get_data()
         except HTTPError, e:
             if e.response.status_code == 404:
                 log.warning("Release blob doesn't exist, using empty data...")
                 current_data, data_version = {}, None
             else:
@@ -155,17 +157,17 @@ class ReleaseCreatorV3(ReleaseCreatorBas
         }
 
         if partialUpdates:
             data["ftpFilenames"]["partials"] = {}
             data["bouncerProducts"]["partials"] = {}
             for previousVersion, previousInfo in partialUpdates.iteritems():
                 from_ = get_release_blob_name(productName, previousVersion,
                                               previousInfo["buildNumber"],
-                                              self.dummy)
+                                              self.suffix)
                 filename = "%s-%s-%s.partial.mar" % (file_prefix, previousVersion, version)
                 bouncerProduct = "%s-%s-partial-%s" % (productName.lower(), version, previousVersion)
                 data["ftpFilenames"]["partials"][from_] = filename
                 data["bouncerProducts"]["partials"][from_] = bouncerProduct
 
         return data
 
 
@@ -229,17 +231,17 @@ class ReleaseCreatorV4(ReleaseCreatorBas
         if not partialUpdates:
             return data
 
         for channel in uniqueChannels:
             data["fileUrls"][channel]["partials"] = {}
             for previousVersion, previousInfo in partialUpdates.iteritems():
                 from_ = get_release_blob_name(productName, previousVersion,
                                                 previousInfo["buildNumber"],
-                                                self.dummy)
+                                                self.suffix)
                 if "localtest" in channel:
                     dir_ = makeCandidatesDir(productName.lower(), version,
                                             buildNumber, server=ftpServer,
                                             protocol='http')
                     filename = "%s-%s-%s.partial.mar" % (file_prefix, previousVersion, version)
                     data["fileUrls"][channel]["partials"][from_] = "%supdate/%%OS_FTP%%/%%LOCALE%%/%s" % (dir_, filename)
                 else:
                     # See comment above about these channels for explanation.
@@ -397,31 +399,34 @@ class NightlySubmitterV3(NightlySubmitte
 
 
 class NightlySubmitterV4(NightlySubmitterBase, MultipleUpdatesNightlyMixin):
     def run(self, *args, **kwargs):
         return NightlySubmitterBase.run(self, *args, schemaVersion=4, **kwargs)
 
 
 class ReleaseSubmitterBase(object):
-    def __init__(self, api_root, auth, dummy=False):
+    def __init__(self, api_root, auth, dummy=False, suffix=""):
         self.api_root = api_root
         self.auth = auth
-        self.dummy = dummy
+        if dummy and not suffix:
+            self.suffix = "-dummy"
+        else:
+            self.suffix = suffix
 
     def run(self, platform, productName, appVersion, version, build_number, locale,
             hashFunction, extVersion, buildID, schemaVersion, **updateKwargs):
         assert schemaVersion in (3, 4), 'Unhandled schema version %s' % schemaVersion
         targets = buildbot2updatePlatforms(platform)
         # Some platforms may have alias', but those are set-up elsewhere
         # for release blobs.
         build_target = targets[0]
 
         name = get_release_blob_name(productName, version, build_number,
-                                     self.dummy)
+                                     self.suffix)
         data = {
             'buildID': buildID,
             'appVersion': appVersion,
             'platformVersion': extVersion,
             'displayVersion': getPrettyVersion(version)
         }
 
         data.update(self._get_update_data(productName, version, build_number,
@@ -442,32 +447,32 @@ class MultipleUpdatesReleaseMixin(object
                          completeInfo=None, partialInfo=None):
         data = {}
 
         if completeInfo:
             data["completes"] = []
             for info in completeInfo:
                 if "previousVersion" in info:
                     from_ = get_release_blob_name(productName, version,
-                                                  build_number, self.dummy)
+                                                  build_number, self.suffix)
                 else:
                     from_ = "*"
                 data["completes"].append({
                     "from": from_,
                     "filesize": info["size"],
                     "hashValue": info["hash"],
                 })
         if partialInfo:
             data["partials"] = []
             for info in partialInfo:
                 data["partials"].append({
                     "from": get_release_blob_name(productName,
                                                   info["previousVersion"],
-                                                  info["previousBuildNumber"] ,
-                                                  self.dummy),
+                                                  info["previousBuildNumber"],
+                                                  self.suffix),
                     "filesize": info["size"],
                     "hashValue": info["hash"],
                 })
 
         return data
 
 
 class ReleaseSubmitterV3(ReleaseSubmitterBase, MultipleUpdatesReleaseMixin):
@@ -476,41 +481,47 @@ class ReleaseSubmitterV3(ReleaseSubmitte
 
 
 class ReleaseSubmitterV4(ReleaseSubmitterBase, MultipleUpdatesReleaseMixin):
     def run(self, *args, **kwargs):
         return ReleaseSubmitterBase.run(self, *args, schemaVersion=4, **kwargs)
 
 
 class ReleasePusher(object):
-    def __init__(self, api_root, auth, dummy=False):
+    def __init__(self, api_root, auth, dummy=False, suffix=""):
         self.api_root = api_root
         self.auth = auth
-        self.dummy = dummy
+        if dummy and not suffix:
+            self.suffix = "-dummy"
+        else:
+            self.suffix = suffix
 
     def run(self, productName, version, build_number, rule_ids, backgroundRate=None):
         name = get_release_blob_name(productName, version, build_number,
-                                     self.dummy)
+                                     self.suffix)
         for rule_id in rule_ids:
             data = {"mapping": name}
             if backgroundRate:
                 data["backgroundRate"] = backgroundRate
             Rule(api_root=self.api_root, auth=self.auth, rule_id=rule_id
                  ).update_rule(**data)
 
 
 class ReleaseScheduler(object):
-    def __init__(self, api_root, auth, dummy=False):
+    def __init__(self, api_root, auth, dummy=False, suffix=""):
         self.api_root = api_root
         self.auth = auth
-        self.dummy = dummy
+        if dummy and not suffix:
+            self.suffix = "-dummy"
+        else:
+            self.suffix = suffix
 
     def run(self, productName, version, build_number, rule_ids, when, backgroundRate=None):
         name = get_release_blob_name(productName, version, build_number,
-                                     self.dummy)
+                                     self.suffix)
         for rule_id in rule_ids:
             data, data_version = Rule(api_root=self.api_root, auth=self.auth, rule_id=rule_id).get_data()
             data["fallbackMapping"] = data["mapping"]
             data["mapping"] = name
             data["data_verison"] = data_version
             data["rule_id"] = rule_id
             data["change_type"] = "update"
             # We receive an iso8601 datetime, but what Balrog needs is a to-the-millisecond epoch timestamp