Chromium Code Reviews| 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) |