17bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen#!/usr/bin/env python 27bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen# Copyright 2014 The Chromium Authors. All rights reserved. 37bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen# Use of this source code is governed by a BSD-style license that can be 47bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen# found in the LICENSE file. 57bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 67bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen"""Upload DM output PNG files and JSON summary to Google Storage.""" 77bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 87bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 97bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenimport datetime 107bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenimport os 117bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenimport shutil 127bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenimport sys 137bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenimport tempfile 147bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 157bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollendef main(dm_dir, build_number, builder_name): 167bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen """Upload DM output PNG files and JSON summary to Google Storage. 177bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 187bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen dm_dir: path to PNG files and JSON summary (str) 197bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen build_number: nth build on this builder (str or int) 207bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen builder_name: name of this builder (str) 217bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen """ 227bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # import gs_utils 237bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen current_dir = os.path.dirname(os.path.abspath(__file__)) 247bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen sys.path.insert(0, os.path.join(current_dir, "../../../common/py/utils")) 257bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen import gs_utils 267bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 277bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # Private, but Google-readable. 287bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen ACL = gs_utils.GSUtils.PredefinedACL.PRIVATE 297bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen FINE_ACLS = [( 307bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen gs_utils.GSUtils.IdType.GROUP_BY_DOMAIN, 317bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 'google.com', 327bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen gs_utils.GSUtils.Permission.READ 337bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen )] 347bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 35a0219f15651a781e7cb8621189d5c2aa8d56da71Derek Sollenberger if not os.path.isfile(os.path.join(dm_dir, 'dm.json')): 36a0219f15651a781e7cb8621189d5c2aa8d56da71Derek Sollenberger sys.exit("no dm.json file found in output directory.") 37a0219f15651a781e7cb8621189d5c2aa8d56da71Derek Sollenberger 387bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # Move dm.json to its own directory to make uploading it easier. 397bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen tmp = tempfile.mkdtemp() 407bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen shutil.move(os.path.join(dm_dir, 'dm.json'), 417bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen os.path.join(tmp, 'dm.json')) 427bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 437bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # Only images are left in dm_dir. Upload any new ones. 447bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen gs = gs_utils.GSUtils() 457bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen gs.upload_dir_contents(dm_dir, 467bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 'skia-android-dm', 477bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 'dm-images-v1', 487bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen upload_if = gs.UploadIf.IF_NEW, 497bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen predefined_acl = ACL, 507bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen fine_grained_acl_list = FINE_ACLS) 517bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 527bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 537bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # /dm-json-v1/year/month/day/hour/build-number/builder/dm.json 547bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen now = datetime.datetime.utcnow() 557bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen summary_dest_dir = '/'.join(['dm-json-v1', 567bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen str(now.year ).zfill(4), 577bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen str(now.month).zfill(2), 587bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen str(now.day ).zfill(2), 597bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen str(now.hour ).zfill(2), 607bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen str(build_number), 617bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen builder_name]) 627bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 637bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # Upload the JSON summary. 647bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen gs.upload_dir_contents(tmp, 657bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 'skia-android-dm', 667bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen summary_dest_dir, 677bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen predefined_acl = ACL, 687bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen fine_grained_acl_list = FINE_ACLS) 697bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 707bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 717bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen # Just for hygiene, put dm.json back. 727bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen shutil.move(os.path.join(tmp, 'dm.json'), 737bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen os.path.join(dm_dir, 'dm.json')) 747bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen os.rmdir(tmp) 757bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen 767bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollenif '__main__' == __name__: 777bdc8dfaabdee59d1961a390418ae6aafe0f9e62djsollen main(*sys.argv[1:]) 78