Index: build/android/pylib/output/remote_output_manager.py |
diff --git a/build/android/pylib/output/remote_output_manager.py b/build/android/pylib/output/remote_output_manager.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..04cb55232a2f37e0efe3bb64b4387d19da2f2ee8 |
--- /dev/null |
+++ b/build/android/pylib/output/remote_output_manager.py |
@@ -0,0 +1,86 @@ |
+# 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. |
+ |
+import hashlib |
+import os |
+ |
+from pylib.base import output_manager |
+from pylib.utils import logdog_helper |
+from pylib.utils import google_storage_helper |
+ |
+ |
+class RemoteOutputManager(output_manager.OutputManager): |
+ |
+ def __init__(self, bucket): |
+ """Uploads output files to Google Storage or LogDog. |
+ |
+ Files will either be uploaded directly to Google Storage or LogDog |
+ depending on the datatype. |
+ |
+ Args |
+ bucket: Bucket to use when saving to Google Storage. |
+ """ |
+ super(RemoteOutputManager, self).__init__() |
+ self._bucket = bucket |
+ |
+ #override |
+ def _CreateArchiveJob(self, in_filepath, out_filename, out_subdir, datatype): |
+ if datatype == output_manager.Datatype.TEXT: |
+ return LogdogArchiveJob(in_filepath, out_filename, out_subdir, datatype) |
+ else: |
+ if self._bucket is None: |
+ return None |
+ return GoogleStorageArchiveJob( |
+ in_filepath, out_filename, out_subdir, datatype, self._bucket) |
+ |
+ |
+class LogdogArchiveJob(output_manager.Job): |
+ |
+ def __init__(self, in_filepath, out_filename, out_subdir, datatype): |
+ super(LogdogArchiveJob, self).__init__( |
+ in_filepath, out_filename, out_subdir, datatype) |
+ self._stream_name = '%s_%s' % (out_subdir, out_filename) |
+ |
+ def Link(self): |
+ return logdog_helper.get_viewer_url(self._stream_name) |
+ |
+ def Archive(self): |
+ with open(self._in_filepath, 'r') as f: |
+ logdog_helper.text(self._stream_name, f.read()) |
+ |
+ |
+class GoogleStorageArchiveJob(output_manager.Job): |
+ |
+ def __init__(self, in_filepath, out_filename, out_subdir, datatype, bucket): |
+ super(GoogleStorageArchiveJob, self).__init__( |
+ in_filepath, out_filename, out_subdir, datatype) |
+ self._bucket = bucket |
+ |
+ self._content_addressed = False |
jbudorick
2017/07/19 22:45:09
nit: self._content_addressed = (self._datatype in
mikecase (-- gone --)
2017/07/26 21:21:37
done
|
+ if self._datatype in (output_manager.Datatype.HTML, |
+ output_manager.Datatype.IMAGE): |
+ self._content_addressed = True |
+ |
+ if self._content_addressed: |
+ sha1 = hashlib.sha1() |
+ with open(in_filepath, 'rb') as f: |
+ sha1.update(f.read()) |
jbudorick
2017/07/19 22:45:09
I'd be interested in how this performs. If it's co
mikecase (-- gone --)
2017/07/26 21:21:37
ack
|
+ self._upload_path = sha1.hexdigest() |
+ else: |
+ self._upload_path = os.path.join(out_subdir, out_filename) |
+ |
+ def Link(self): |
+ return google_storage_helper.get_url_link( |
+ self._upload_path, self._bucket) |
+ |
+ def Archive(self): |
+ if self._content_addressed: |
+ if google_storage_helper.exists(self._upload_path, self._bucket): |
+ return |
+ |
+ content_type = None |
+ if self._datatype == output_manager.Datatype.HTML: |
+ content_type = 'text/html' |
+ google_storage_helper.upload( |
+ self._upload_path, self._in_filepath, self._bucket, content_type) |