flex/utils/remote/oss_storage.h (56 lines of code) (raw):
/** Copyright 2020 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef FLEX_UTILS_REMOTE_OSS_STORAGE_H_
#define FLEX_UTILS_REMOTE_OSS_STORAGE_H_
#ifdef BUILD_WITH_OSS
#include <filesystem>
#include <string>
#include "flex/third_party/aliyun-oss-cpp-sdk/sdk/include/alibabacloud/oss/OssClient.h"
#include "flex/third_party/aliyun-oss-cpp-sdk/sdk/include/alibabacloud/oss/client/ClientConfiguration.h"
#include "flex/utils/remote/remote_storage.h"
#include "flex/utils/result.h"
namespace gs {
struct OSSConf {
static constexpr const char* kOSSAccessKeyId = "OSS_ACCESS_KEY_ID";
static constexpr const char* kOSSAccessKeySecret = "OSS_ACCESS_KEY_SECRET";
static constexpr const char* kOSSEndpoint = "OSS_ENDPOINT";
static constexpr const char* kOSSBucketName = "OSS_BUCKET_NAME";
static constexpr const char* kOSSConcurrency = "OSS_CONCURRENCY";
// Avoid storing or printing the accesskey_id and accesskey_secret
std::string accesskey_id_;
std::string accesskey_secret_;
std::string endpoint_;
std::string bucket_name_;
int32_t concurrency_ = 4;
uint64_t partition_size_ = 1024 * 1024 * 128;
AlibabaCloud::OSS::ClientConfiguration client_conf_;
void load_conf_from_env();
};
class OSSRemoteStorageUploader : public RemoteStorageUploader {
public:
OSSRemoteStorageUploader(OSSConf conf = {}) : conf_(conf) {}
~OSSRemoteStorageUploader() override = default;
// Will try to load the accesskey_id and accesskey_secret from the environment
// variables if they are not set in the OSSConf.
Status Open() override;
Status Put(const std::string& local_path, const std::string& remote_path,
bool override = false) override;
Status Delete(const std::string& remote_path) override;
Status Close() override;
private:
OSSConf conf_;
std::shared_ptr<AlibabaCloud::OSS::OssClient> client_;
};
class OSSRemoteStorageDownloader : public RemoteStorageDownloader {
public:
OSSRemoteStorageDownloader(OSSConf conf = {}) : conf_(conf) {}
~OSSRemoteStorageDownloader() override = default;
Status Open() override;
Status Get(const std::string& remote_path,
const std::string& local_path) override;
Status List(const std::string& remote_path,
std::vector<std::string>& list) override;
Status Close() override;
private:
bool get_metadata_etag(const std::string& remote_path, std::string& etag);
OSSConf conf_;
std::shared_ptr<AlibabaCloud::OSS::OssClient> client_;
};
} // namespace gs
#endif // BUILD_WITH_OSS
#endif // FLEX_UTILS_REMOTE_OSS_STORAGE_H_