diff options
Diffstat (limited to 'infra/bots/recipe_modules/skia/resources/upload_dm_results.py')
-rwxr-xr-x | infra/bots/recipe_modules/skia/resources/upload_dm_results.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/infra/bots/recipe_modules/skia/resources/upload_dm_results.py b/infra/bots/recipe_modules/skia/resources/upload_dm_results.py new file mode 100755 index 0000000000..1bee64fb78 --- /dev/null +++ b/infra/bots/recipe_modules/skia/resources/upload_dm_results.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Upload DM output PNG files and JSON summary to Google Storage.""" + +import datetime +import json +import os +import shutil +import sys +import tempfile + +def main(dm_dir, git_hash, builder_name, build_number, try_issue, import_path): + """Upload DM output PNG files and JSON summary to Google Storage. + + dm_dir: path to PNG files and JSON summary (str) + git_hash: this build's Git hash (str) + builder_name: name of this builder (str) + build_number: nth build on this builder (str or int) + try_issue: Rietveld issue if this is a try job (str, int, or None) + import_path: Path to import the gs_utils package (str) + """ + # import gs_utils + sys.path.insert(0, import_path) + import gs_utils + + # Private, but Google-readable. + ACL = gs_utils.GSUtils.PredefinedACL.PRIVATE + FINE_ACLS = [( + gs_utils.GSUtils.IdType.GROUP_BY_DOMAIN, + 'google.com', + gs_utils.GSUtils.Permission.READ + )] + + # Move dm.json and verbose.log to their own directory for easy upload. + tmp = tempfile.mkdtemp() + shutil.move(os.path.join(dm_dir, 'dm.json'), + os.path.join(tmp, 'dm.json')) + shutil.move(os.path.join(dm_dir, 'verbose.log'), + os.path.join(tmp, 'verbose.log')) + + # Make sure the JSON file parses correctly. + json_file_name = os.path.join(tmp, 'dm.json') + with open(json_file_name) as jsonFile: + try: + json.load(jsonFile) + except ValueError: + json_content = open(json_file_name).read() + print >> sys.stderr, "Invalid JSON: \n\n%s\n" % json_content + raise + + # Only images are left in dm_dir. Upload any new ones. + gs = gs_utils.GSUtils() + bucket, image_dest_dir = 'chromium-skia-gm', 'dm-images-v1' + print 'Uploading images to gs://' + bucket + '/' + image_dest_dir + gs.upload_dir_contents(dm_dir, + bucket, + image_dest_dir, + upload_if = gs.UploadIf.ALWAYS, + predefined_acl = ACL, + fine_grained_acl_list = FINE_ACLS) + + + # /dm-json-v1/year/month/day/hour/git-hash/builder/build-number/dm.json + now = datetime.datetime.utcnow() + summary_dest_dir = '/'.join(['dm-json-v1', + str(now.year ).zfill(4), + str(now.month).zfill(2), + str(now.day ).zfill(2), + str(now.hour ).zfill(2), + git_hash, + builder_name, + str(build_number)]) + + # Trybot results are further siloed by CL. + if try_issue: + summary_dest_dir = '/'.join(['trybot', summary_dest_dir, str(try_issue)]) + + # Upload the JSON summary and verbose.log. + print 'Uploading logs to gs://' + bucket + '/' + summary_dest_dir + gs.upload_dir_contents(tmp, + bucket, + summary_dest_dir, + predefined_acl = ACL, + fine_grained_acl_list = FINE_ACLS) + + + # Just for hygiene, put dm.json and verbose.log back. + shutil.move(os.path.join(tmp, 'dm.json'), + os.path.join(dm_dir, 'dm.json')) + shutil.move(os.path.join(tmp, 'verbose.log'), + os.path.join(dm_dir, 'verbose.log')) + os.rmdir(tmp) + +if '__main__' == __name__: + main(*sys.argv[1:]) |