From d0618c9f4338fcf250c12c14d2d530484b863312 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 4 Sep 2024 13:40:42 -0400 Subject: [PATCH 1/2] feat(spanner): support instance edition --- .../spanner/create_instance_request_builder.h | 52 +++++++++++++++++++ .../create_instance_request_builder_test.cc | 18 +++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/google/cloud/spanner/create_instance_request_builder.h b/google/cloud/spanner/create_instance_request_builder.h index 8b5c60d854497..788f8ac883e6c 100644 --- a/google/cloud/spanner/create_instance_request_builder.h +++ b/google/cloud/spanner/create_instance_request_builder.h @@ -117,6 +117,46 @@ class CreateInstanceRequestBuilder { return std::move(*this); } + enum class Edition { kStandard = 0, 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 +164,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 +179,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 From 15fb48ed484244fba77815c0c4607f6d747e0195 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 4 Sep 2024 17:20:06 -0400 Subject: [PATCH 2/2] address comments; disable rest tests versus emulator --- .../integration_tests/instance_admin_rest_integration_test.cc | 2 ++ google/cloud/spanner/create_instance_request_builder.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) 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 788f8ac883e6c..4749192a45bd3 100644 --- a/google/cloud/spanner/create_instance_request_builder.h +++ b/google/cloud/spanner/create_instance_request_builder.h @@ -117,7 +117,9 @@ class CreateInstanceRequestBuilder { return std::move(*this); } - enum class Edition { kStandard = 0, kEnterprise, kEnterprisePlus }; + // Available editions. + // https://cloud.google.com/spanner/docs/editions-overview + enum class Edition { kStandard, kEnterprise, kEnterprisePlus }; CreateInstanceRequestBuilder& SetEdition(Edition edition) & { switch (edition) {