| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COBALT_UTIL_GCS_GCS_UTIL_H_ |
| #define COBALT_UTIL_GCS_GCS_UTIL_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| namespace cobalt { |
| namespace util { |
| namespace gcs { |
| |
| // A utility for uploading files to Google Cloud Storage. |
| // |
| // Usage: |
| // - construct an instance of GcsUtil |
| // - Invoke one of the two Init..() methods. |
| // - Repeatedly invoke Upload() to upload files. |
| // |
| // The implementation uses the library in google-api-cpp-client which in |
| // in turn uses libcurl for HTTP transport. From experimentation it appears |
| // that often times the first upload after the instance is created will fail |
| // with a timeout. We do not understand why. Subsequent uploads succeed. One |
| // workaround is to invoke the Ping() method prior to the first upload. This |
| // appears to succeed. We do not understand why. See |
| // https://github.com/google/google-api-cpp-client/issues/48 |
| class GcsUtil { |
| public: |
| GcsUtil(); |
| ~GcsUtil(); |
| |
| // Initializes this instance using default file paths for the CA root |
| // certificates and service account json. |
| // |
| // The path to the CA root cert file is read from the environment varialbe |
| // "GRPC_DEFAULT_SSL_ROOTS_FILE_PATH". The path to the service account |
| // json file is read from the environment variable |
| // "GOOGLE_APPLICATION_CREDENTIALS". |
| // |
| // Returns true on success. On failure, logs an Error and returns false. |
| // If this method returns false, do not continue to use this instance. |
| // Discard this instance and try again. |
| bool InitFromDefaultPaths(); |
| |
| // Initializes this instance by reading the CA root certificates and |
| // service account json from the given paths. |
| // |
| // Returns true on success. On failure, logs an Error and returns false. |
| // If this method returns false, do not continue to use this instance. |
| // Discard this instance and try again. |
| // |
| // ca_certs_path. The path to a file containing a PEM encoding of CA root |
| // certificates. |
| // |
| // service_account_json_path. The path to a json file containg a Google |
| // service account private key. |
| bool Init(const std::string ca_certs_path, |
| const std::string& service_account_json_path); |
| |
| // Uploads a blob to Google Cloud Storage. |num_bytes| from |data| are |
| // uploaded to the given |path| within the given |bucket|. This will succeed |
| // only if the bucket already exists and the service account specified when |
| // this instance was initalized has write permission on the bucket. |
| // Returns true on success. On failure, logs an Error and returns false. |
| // |
| // |path| Will be used as the full path of the uploaded file. It must |
| // follow the Google Cloud Storage Object name requirements. For best |
| // results it should contain only letters, numbers, underscores, dashes |
| // and forward slashes. |
| // |
| // |timeout_seconds| is used as the HTTP request timeout. |
| bool Upload(const std::string& bucket, const std::string& path, |
| const std::string mime_type, const char* data, size_t num_bytes, |
| uint32_t timeout_seconds); |
| |
| // Uploads a blob to Google Cloud Storage. Bytes will be read from |stream| |
| // until EOF. The bytes are uploaded to the given |path| within the given |
| // |bucket|. This will succeed only if the bucket already exists and the |
| // service account specified when this instance was initalized has write |
| // permission on the bucket. Returns true on success. On failure, logs an |
| // Error and returns false. |
| // |
| // |path| Will be used as the full path of the uploaded file. It must |
| // follow the Google Cloud Storage Object name requirements. For best |
| // results it should contain only letters, numbers, underscores, dashes |
| // and forward slashes. |
| // |
| // |timeout_seconds| is used as the HTTP request timeout. |
| bool Upload(const std::string& bucket, const std::string& path, |
| const std::string mime_type, std::istream* stream, |
| uint32_t timeout_seconds); |
| |
| // Attempts to connect with Google Cloud Storage and query for the metadata |
| // for the specified bucket. This will succeed only if the service |
| // account specified when this instance was initialized has read permission |
| // on the bucket. Returns true on success. On failure, logs an Error and |
| // returns. |
| // |
| // NOTE: For reasons not fully understood, it appears it is sometimes |
| // necessary to perform a Ping() prior to the first Upload. In testing we |
| // have observed that Upload will timeout unless at least one Ping() is |
| // performed first. We do not understand why. |
| bool Ping(const std::string& bucket); |
| |
| private: |
| // This is a helper function for the two public Upload() methods. The runtime |
| // type of |data_reader| must be googleapis::client::DataReader*. It is |
| // declared void* here in order to avoid #including |
| // //third_party/google-api-cpp-client in this header file. |
| // |
| // This method takes ownership of |data_reader|. |
| bool Upload(const std::string& bucket, const std::string& path, |
| const std::string mime_type, void* data_reader, |
| uint32_t timeout_seconds); |
| |
| struct Impl; |
| std::unique_ptr<Impl> impl_; |
| }; |
| |
| } // namespace gcs |
| } // namespace util |
| } // namespace cobalt |
| |
| #endif // COBALT_UTIL_GCS_GCS_UTIL_H_ |