From a5155607dd97c33e711d7ac382c123d7f0843c87 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Thu, 5 Sep 2024 11:58:18 -0400 Subject: [PATCH] feat(spanner): support instance edition (#14678) --- .../instance_admin_rest_integration_test.cc | 2 + .../spanner/create_instance_request_builder.h | 54 +++++++++++++++++++ .../create_instance_request_builder_test.cc | 18 +++++-- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/google/cloud/spanner/admin/integration_tests/instance_admin_rest_integration_test.cc b/google/cloud/spanner/admin/integration_tests/instance_admin_rest_integration_test.cc index 532b6bdb8735f..bf79c2cd2ad55 100644 --- a/google/cloud/spanner/admin/integration_tests/instance_admin_rest_integration_test.cc +++ b/google/cloud/spanner/admin/integration_tests/instance_admin_rest_integration_test.cc @@ -153,6 +153,8 @@ class InstanceAdminClientRestTest protected: void SetUp() override { if (Emulator()) { + // TODO(#14679): Remove this GTEST_SKIP when emulator supports editions. + GTEST_SKIP(); // We expect test instances to exist when running against real services, // but if we are running against the emulator we're happy to create one. Instance in(ProjectId(), InstanceId()); diff --git a/google/cloud/spanner/create_instance_request_builder.h b/google/cloud/spanner/create_instance_request_builder.h index 8b5c60d854497..4749192a45bd3 100644 --- a/google/cloud/spanner/create_instance_request_builder.h +++ b/google/cloud/spanner/create_instance_request_builder.h @@ -117,6 +117,48 @@ class CreateInstanceRequestBuilder { return std::move(*this); } + // Available editions. + // https://cloud.google.com/spanner/docs/editions-overview + enum class Edition { kStandard, kEnterprise, kEnterprisePlus }; + + CreateInstanceRequestBuilder& SetEdition(Edition edition) & { + switch (edition) { + case Edition::kStandard: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_STANDARD); + break; + case Edition::kEnterprise: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_ENTERPRISE); + break; + case Edition::kEnterprisePlus: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1:: + Instance_Edition_ENTERPRISE_PLUS); + break; + } + return *this; + } + + CreateInstanceRequestBuilder&& SetEdition(Edition edition) && { + switch (edition) { + case Edition::kStandard: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_STANDARD); + break; + case Edition::kEnterprise: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_ENTERPRISE); + break; + case Edition::kEnterprisePlus: + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1:: + Instance_Edition_ENTERPRISE_PLUS); + break; + } + return std::move(*this); + } + google::spanner::admin::instance::v1::CreateInstanceRequest& Build() & { // Preserve original behavior of defaulting node_count to 1. if (request_.instance().processing_units() == 0) { @@ -124,6 +166,12 @@ class CreateInstanceRequestBuilder { request_.mutable_instance()->set_node_count(1); } } + if (request_.instance().edition() == + google::spanner::admin::instance::v1:: + Instance_Edition_EDITION_UNSPECIFIED) { + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_STANDARD); + } return request_; } google::spanner::admin::instance::v1::CreateInstanceRequest&& Build() && { @@ -133,6 +181,12 @@ class CreateInstanceRequestBuilder { request_.mutable_instance()->set_node_count(1); } } + if (request_.instance().edition() == + google::spanner::admin::instance::v1:: + Instance_Edition_EDITION_UNSPECIFIED) { + request_.mutable_instance()->set_edition( + google::spanner::admin::instance::v1::Instance_Edition_STANDARD); + } return std::move(request_); } diff --git a/google/cloud/spanner/create_instance_request_builder_test.cc b/google/cloud/spanner/create_instance_request_builder_test.cc index 5b76892d75da6..81e217ea5e527 100644 --- a/google/cloud/spanner/create_instance_request_builder_test.cc +++ b/google/cloud/spanner/create_instance_request_builder_test.cc @@ -46,6 +46,8 @@ TEST(CreateInstanceRequestBuilder, DefaultValues) { EXPECT_EQ(1, req.instance().node_count()); EXPECT_EQ(0, req.instance().labels_size()); EXPECT_EQ(expected_display_name, req.instance().display_name()); + EXPECT_EQ(google::spanner::admin::instance::v1::Instance_Edition_STANDARD, + req.instance().edition()); } TEST(CreateInstanceRequestBuilder, RvalueReference) { @@ -58,6 +60,7 @@ TEST(CreateInstanceRequestBuilder, RvalueReference) { .SetDisplayName(expected_display_name) .SetNodeCount(1) .SetLabels({{"key", "value"}}) + .SetEdition(CreateInstanceRequestBuilder::Edition::kEnterprise) .Build(); EXPECT_EQ(in.project().FullName(), req.parent()); EXPECT_EQ(in.instance_id(), req.instance_id()); @@ -67,6 +70,8 @@ TEST(CreateInstanceRequestBuilder, RvalueReference) { EXPECT_EQ(1, req.instance().labels_size()); EXPECT_EQ("value", req.instance().labels().at("key")); EXPECT_EQ(expected_display_name, req.instance().display_name()); + EXPECT_EQ(google::spanner::admin::instance::v1::Instance_Edition_ENTERPRISE, + req.instance().edition()); } TEST(CreateInstanceRequestBuilder, Lvalue) { @@ -76,10 +81,12 @@ TEST(CreateInstanceRequestBuilder, Lvalue) { std::string expected_display_name = "test-display-name"; auto builder = CreateInstanceRequestBuilder(in, expected_config); - auto req = builder.SetDisplayName(expected_display_name) - .SetProcessingUnits(500) - .SetLabels({{"key", "value"}}) - .Build(); + auto req = + builder.SetDisplayName(expected_display_name) + .SetProcessingUnits(500) + .SetLabels({{"key", "value"}}) + .SetEdition(CreateInstanceRequestBuilder::Edition::kEnterprisePlus) + .Build(); EXPECT_EQ(in.project().FullName(), req.parent()); EXPECT_EQ(in.instance_id(), req.instance_id()); EXPECT_EQ(in.FullName(), req.instance().name()); @@ -88,6 +95,9 @@ TEST(CreateInstanceRequestBuilder, Lvalue) { EXPECT_EQ(1, req.instance().labels_size()); EXPECT_EQ("value", req.instance().labels().at("key")); EXPECT_EQ(expected_display_name, req.instance().display_name()); + EXPECT_EQ( + google::spanner::admin::instance::v1::Instance_Edition_ENTERPRISE_PLUS, + req.instance().edition()); } GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END