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..105880df5b49c873c8b65b531ce93032b3dbb8ec |
--- /dev/null |
+++ b/build/android/pylib/output/remote_output_manager.py |
@@ -0,0 +1,87 @@ |
+# 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.output import noop_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 _CreateArchivedFile(self, out_filename, out_subdir, datatype): |
+ if datatype == output_manager.Datatype.TEXT: |
+ return LogdogArchivedFile(out_filename, out_subdir, datatype) |
+ else: |
+ if self._bucket is None: |
+ return noop_output_manager.NoopArchivedFile() |
+ return GoogleStorageArchivedFile( |
+ out_filename, out_subdir, datatype, self._bucket) |
+ |
+ |
+class LogdogArchivedFile(output_manager.ArchivedFile): |
+ |
+ def __init__(self, out_filename, out_subdir, datatype): |
+ super(LogdogArchivedFile, self).__init__(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.name, 'r') as f: |
+ logdog_helper.text(self._stream_name, f.read()) |
+ |
+ |
+class GoogleStorageArchivedFile(output_manager.ArchivedFile): |
+ |
+ def __init__(self, out_filename, out_subdir, datatype, bucket): |
+ super(GoogleStorageArchivedFile, self).__init__( |
+ out_filename, out_subdir, datatype) |
+ self._bucket = bucket |
+ self._upload_path = None |
+ self._content_addressed = None |
+ |
+ def _PrepareArchive(self): |
+ self._content_addressed = (self._datatype in ( |
+ output_manager.Datatype.HTML, |
+ output_manager.Datatype.IMAGE)) |
+ if self._content_addressed: |
+ sha1 = hashlib.sha1() |
+ with open(self.name, 'rb') as f: |
+ sha1.update(f.read()) |
+ self._upload_path = sha1.hexdigest() |
+ else: |
+ self._upload_path = os.path.join(self._out_subdir, self._out_filename) |
+ |
+ def _Link(self): |
+ return google_storage_helper.get_url_link( |
+ self._upload_path, self._bucket) |
+ |
+ def _Archive(self): |
+ if (self._content_addressed and |
+ 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.name, self._bucket, content_type) |