blob: 7fcec98fc5f20617d6eb75fe1eba3b953d93c948 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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.
#include <brpc/controller.h>
#include <fmt/format.h>
#include <gen_cpp/cloud.pb.h>
#include <gen_cpp/olap_file.pb.h>
#include <gtest/gtest.h>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include "common/defer.h"
#include "cpp/sync_point.h"
#include "meta-service/meta_service.h"
namespace doris::cloud {
extern std::unique_ptr<MetaServiceProxy> get_meta_service(bool mock_resource_mgr);
TEST(MetaServiceSnapshotTest, DISABLED_BeginSnapshotTest) {
auto meta_service = get_meta_service(true);
const char* const cloud_unique_id = "test_cloud_unique_id";
// Setup SyncPoint for encryption
auto sp = SyncPoint::get_instance();
sp->enable_processing();
sp->set_call_back("encrypt_ak_sk:get_encryption_key", [](auto&& args) {
auto* ret = try_any_cast<int*>(args[0]);
*ret = 0;
auto* key = try_any_cast<std::string*>(args[1]);
*key = "selectdbselectdbselectdbselectdb";
auto* key_id = try_any_cast<int64_t*>(args[2]);
*key_id = 1;
});
// Cleanup SyncPoint when test finishes
DORIS_CLOUD_DEFER {
sp->disable_processing();
sp->clear_all_call_backs();
};
// Create test instance first
{
brpc::Controller cntl;
CreateInstanceRequest req;
req.set_instance_id("test_instance");
req.set_user_id("test_user");
req.set_name("test_name");
ObjectStoreInfoPB obj;
obj.set_ak("123");
obj.set_sk("321");
obj.set_bucket("456");
obj.set_prefix("654");
obj.set_endpoint("789");
obj.set_region("987");
obj.set_external_endpoint("888");
obj.set_provider(ObjectStoreInfoPB::BOS);
req.mutable_obj_info()->CopyFrom(obj);
CreateInstanceResponse res;
meta_service->create_instance(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
}
// test invalid argument - empty cloud_unique_id
{
brpc::Controller cntl;
BeginSnapshotRequest req;
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test normal begin snapshot
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_auto_snapshot(true);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
ASSERT_FALSE(res.image_url().empty());
ASSERT_FALSE(res.snapshot_id().empty());
ASSERT_TRUE(res.image_url().find("/snapshot/") != std::string::npos);
}
// test begin snapshot with custom parameters
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(1800);
req.set_auto_snapshot(false);
req.set_ttl_seconds(14400);
req.set_snapshot_label("custom_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
ASSERT_FALSE(res.image_url().empty());
ASSERT_FALSE(res.snapshot_id().empty());
}
// test invalid timeout_seconds - zero
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(0);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test invalid timeout_seconds - negative
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(-100);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test invalid ttl_seconds - zero
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(0);
req.set_snapshot_label("test_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test invalid ttl_seconds - negative
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(-500);
req.set_snapshot_label("test_snapshot");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test empty snapshot_label
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test valid IPv4 address
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
req.set_request_ip("192.168.1.100");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
}
// test valid IPv6 address
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
req.set_request_ip("2001:db8::1");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
}
// test invalid IP address format
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
req.set_request_ip("invalid.ip.address");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test invalid IP address - out of range
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
req.set_request_ip("256.256.256.256");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::INVALID_ARGUMENT);
}
// test empty IP address (should pass - IP is optional)
{
brpc::Controller cntl;
BeginSnapshotRequest req;
req.set_cloud_unique_id(cloud_unique_id);
req.set_timeout_seconds(3600);
req.set_ttl_seconds(7200);
req.set_snapshot_label("test_snapshot");
req.set_request_ip("");
BeginSnapshotResponse res;
meta_service->begin_snapshot(reinterpret_cast<::google::protobuf::RpcController*>(&cntl),
&req, &res, nullptr);
ASSERT_EQ(res.status().code(), MetaServiceCode::OK);
}
}
} // namespace doris::cloud