Index: build/android/pylib/utils/google_storage_helper.py |
diff --git a/build/android/pylib/utils/google_storage_helper.py b/build/android/pylib/utils/google_storage_helper.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8196c8f06db2da8ed85405403ed4d5dcca050c5 |
--- /dev/null |
+++ b/build/android/pylib/utils/google_storage_helper.py |
@@ -0,0 +1,81 @@ |
+# Copyright 2017 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. |
+ |
+"""Helper functions to upload data to Google Storage. |
+ |
+Text data should be streamed to logdog using |logdog_helper| module. |
+Due to logdog not having image or HTML viewer, those instead should be uploaded |
+to Google Storage directly using this module. |
+""" |
+ |
+import logging |
+import os |
+import sys |
+import time |
+ |
+from pylib.constants import host_paths |
+from pylib.utils import decorators |
+ |
+if host_paths.DEVIL_PATH not in sys.path: |
+ sys.path.append(host_paths.DEVIL_PATH) |
+from devil.utils import cmd_helper |
+ |
+_GSUTIL_PATH = os.path.join( |
+ host_paths.DIR_SOURCE_ROOT, 'third_party', 'catapult', |
+ 'third_party', 'gsutil', 'gsutil.py') |
+_PUBLIC_URL = 'https://storage.googleapis.com/%s/' |
+_AUTHENTICATED_URL = 'https://storage.cloud.google.com/%s/' |
+ |
+ |
+@decorators.NoRaiseException(default_return_value='') |
+def upload(name, filepath, bucket, content_type=None, authenticated_link=True): |
+ """Uploads data to Google Storage. |
+ |
+ Args: |
+ name: Name of the file on Google Storage. |
+ filepath: Path to file you want to upload. |
+ bucket: Bucket to upload file to. |
+ content_type: Content type to upload as. If not specified, Google storage |
+ will attempt to infer content type from file extension. |
+ authenticated_link: Whether to return a link that requires user to |
+ authenticate with a Google account. Setting this to false will return |
+ a link that does not require user to be signed into Google account but |
+ will only work for completely public storage buckets. |
+ Returns: |
+ Web link to item uploaded to Google Storage bucket. |
+ """ |
+ if bucket.startswith('gs://'): |
+ bucket = bucket[len('gs://'):] |
+ if bucket.endswith('/'): |
+ bucket = bucket[:-1] |
+ |
+ gs_path = 'gs://%s/%s' % (bucket, name) |
+ logging.info('Uploading %s to %s', filepath, gs_path) |
+ |
+ cmd = [_GSUTIL_PATH] |
+ if content_type: |
+ cmd.extend(['-h', 'Content-Type:%s' % content_type]) |
+ cmd.extend(['cp', filepath, gs_path]) |
+ |
+ cmd_helper.RunCmd(cmd) |
+ |
+ url_template = _AUTHENTICATED_URL if authenticated_link else _PUBLIC_URL |
+ return os.path.join(url_template % bucket, name) |
+ |
+ |
+def unique_name(basename, suffix='', timestamp=True, device=None): |
+ """Helper function for creating a unique name for a file to store in GS. |
+ |
+ Args: |
+ basename: Base of the unique filename. |
+ suffix: Suffix of filename. |
+ timestamp: Whether or not to add a timestamp to name. |
+ device: Device to add device serial of to name. |
+ """ |
+ return '%s%s%s%s' % ( |
+ basename, |
+ '_%s' % time.strftime('%Y_%m_%d_T%H_%M_%S-UTC', time.gmtime()) |
+ if timestamp else '', |
+ '_%s' % device.serial if device else '', |
+ suffix) |