| // 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 |