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