diff options
Diffstat (limited to 'testing/talos/talos_from_code.py')
-rw-r--r-- | testing/talos/talos_from_code.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/testing/talos/talos_from_code.py b/testing/talos/talos_from_code.py new file mode 100644 index 0000000000..c5d24bd7b1 --- /dev/null +++ b/testing/talos/talos_from_code.py @@ -0,0 +1,141 @@ +#! /usr/bin/env python +# 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/. + +# +# Script name: talos_from_code.py +# Purpose: Read from a talos.json file the different files to download for a talos job +# Author(s): Zambrano Gasparnian, Armen <armenzg@mozilla.com> +# Target: Python 2.5 +# +import json +import os +import re +import sys +from optparse import OptionParser + +import six + + +def main(): + """ + This script downloads a talos.json file which indicates which files to download + for a talos job. + See a talos.json file for a better understand: + https://hg.mozilla.org/mozilla-central/raw-file/default/testing/talos/talos.json + """ + parser = OptionParser() + parser.add_option( + "--talos-json-url", + dest="talos_json_url", + type="string", + help="It indicates from where to download the talos.json file.", + ) + (options, args) = parser.parse_args() + + # 1) check that the url was passed + if options.talos_json_url is None: + print("You need to specify --talos-json-url.") + sys.exit(1) + + # 2) try to download the talos.json file + try: + jsonFilename = download_file(options.talos_json_url) + except Exception as e: + print("ERROR: We tried to download the talos.json file but something failed.") + print("ERROR: %s" % str(e)) + sys.exit(1) + + # 3) download the necessary files + print("INFO: talos.json URL: %s" % options.talos_json_url) + try: + key = "talos.zip" + entity = get_value(jsonFilename, key) + if passesRestrictions(options.talos_json_url, entity["url"]): + # the key is at the same time the filename e.g. talos.zip + print( + "INFO: Downloading %s as %s" + % (entity["url"], os.path.join(entity["path"], key)) + ) + download_file(entity["url"], entity["path"], key) + else: + print( + "ERROR: You have tried to download a file " + + "from: %s " % entity["url"] + + "which is a location different than http://talos-bundles.pvt.build.mozilla.org/" + ) + print("ERROR: This is only allowed for the certain branches.") + sys.exit(1) + except Exception as e: + print("ERROR: %s" % str(e)) + sys.exit(1) + + +def passesRestrictions(talosJsonUrl, fileUrl): + """ + Only certain branches are exempted from having to host their downloadable files + in talos-bundles.pvt.build.mozilla.org + """ + if ( + talosJsonUrl.startswith("http://hg.mozilla.org/try/") + or talosJsonUrl.startswith("https://hg.mozilla.org/try/") + or talosJsonUrl.startswith("http://hg.mozilla.org/projects/pine/") + or talosJsonUrl.startswith("https://hg.mozilla.org/projects/pine/") + or talosJsonUrl.startswith("http://hg.mozilla.org/projects/ash/") + or talosJsonUrl.startswith("https://hg.mozilla.org/projects/ash/") + ): + return True + else: + p = re.compile("^http://talos-bundles.pvt.build.mozilla.org/") + m = p.match(fileUrl) + if m is None: + return False + return True + + +def get_filename_from_url(url): + """ + This returns the filename of the file we're trying to download + """ + parsed = six.moves.urllib.parse.urlsplit(url.rstrip("/")) + if parsed.path != "": + return parsed.path.rsplit("/", 1)[-1] + else: + print( + "ERROR: We were trying to download a file from %s " + + "but the URL seems to be incorrect." + ) + sys.exit(1) + + +def download_file(url, path="", saveAs=None): + """ + It downloads a file from URL to the indicated path + """ + req = six.moves.urllib.request.Request(url) + f = six.moves.urllib.request.urlopen(req) + if path != "" and not os.path.isdir(path): + try: + os.makedirs(path) + print("INFO: directory %s created" % path) + except Exception as e: + print("ERROR: %s" % str(e)) + sys.exit(1) + filename = saveAs if saveAs else get_filename_from_url(url) + local_file = open(os.path.join(path, filename), "wb") + local_file.write(f.read()) + local_file.close() + return filename + + +def get_value(json_filename, key): + """ + It loads up a JSON file and returns the value for the given string + """ + f = open(json_filename, "r") + return json.load(f)[key] + + +if __name__ == "__main__": + main() |