Bug 1402015 - Override Balrog blob name suffix, MAR filename pattern, Bouncer product name pattern r=sfraser
MozReview-Commit-ID: Drv2jIu1qXL
--- 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)