From 14848cc77efa49f43636c09c029dcc0f4a73e999 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 9 Feb 2022 22:24:25 +0000 Subject: [PATCH 1/5] feat(bigtable): support x-goog-user-project --- google/cloud/bigtable/data_client.cc | 24 +++++++++++++++++++ google/cloud/bigtable/internal/defaults.cc | 11 +++++++-- .../cloud/bigtable/internal/defaults_test.cc | 17 +++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/google/cloud/bigtable/data_client.cc b/google/cloud/bigtable/data_client.cc index d99d91ca04e55..896fe1733d368 100644 --- a/google/cloud/bigtable/data_client.cc +++ b/google/cloud/bigtable/data_client.cc @@ -48,6 +48,10 @@ class DefaultDataClient : public DataClient { Options options = {}) : project_(std::move(project)), instance_(std::move(instance)), + user_project_( + options.has() + ? absl::nullopt + : absl::make_optional(options.get())), impl_(std::move(options)) {} std::string const& project_id() const override { return project_; }; @@ -59,6 +63,7 @@ class DefaultDataClient : public DataClient { grpc::Status MutateRow(grpc::ClientContext* context, btproto::MutateRowRequest const& request, btproto::MutateRowResponse* response) override { + ApplyOptions(context); return impl_.Stub()->MutateRow(context, request, response); } @@ -67,6 +72,7 @@ class DefaultDataClient : public DataClient { AsyncMutateRow(grpc::ClientContext* context, btproto::MutateRowRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncMutateRow(context, request, cq); } @@ -74,6 +80,7 @@ class DefaultDataClient : public DataClient { grpc::ClientContext* context, btproto::CheckAndMutateRowRequest const& request, btproto::CheckAndMutateRowResponse* response) override { + ApplyOptions(context); return impl_.Stub()->CheckAndMutateRow(context, request, response); } @@ -82,6 +89,7 @@ class DefaultDataClient : public DataClient { AsyncCheckAndMutateRow(grpc::ClientContext* context, btproto::CheckAndMutateRowRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncCheckAndMutateRow(context, request, cq); } @@ -89,6 +97,7 @@ class DefaultDataClient : public DataClient { grpc::ClientContext* context, btproto::ReadModifyWriteRowRequest const& request, btproto::ReadModifyWriteRowResponse* response) override { + ApplyOptions(context); return impl_.Stub()->ReadModifyWriteRow(context, request, response); } @@ -97,6 +106,7 @@ class DefaultDataClient : public DataClient { AsyncReadModifyWriteRow(grpc::ClientContext* context, btproto::ReadModifyWriteRowRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncReadModifyWriteRow(context, request, cq); } @@ -110,6 +120,7 @@ class DefaultDataClient : public DataClient { AsyncReadRows(grpc::ClientContext* context, btproto::ReadRowsRequest const& request, grpc::CompletionQueue* cq, void* tag) override { + ApplyOptions(context); return impl_.Stub()->AsyncReadRows(context, request, cq, tag); } @@ -117,12 +128,14 @@ class DefaultDataClient : public DataClient { PrepareAsyncReadRows(grpc::ClientContext* context, btproto::ReadRowsRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->PrepareAsyncReadRows(context, request, cq); } std::unique_ptr> SampleRowKeys(grpc::ClientContext* context, btproto::SampleRowKeysRequest const& request) override { + ApplyOptions(context); return impl_.Stub()->SampleRowKeys(context, request); } @@ -131,6 +144,7 @@ class DefaultDataClient : public DataClient { AsyncSampleRowKeys(grpc::ClientContext* context, btproto::SampleRowKeysRequest const& request, grpc::CompletionQueue* cq, void* tag) override { + ApplyOptions(context); return impl_.Stub()->AsyncSampleRowKeys(context, request, cq, tag); } @@ -139,12 +153,14 @@ class DefaultDataClient : public DataClient { PrepareAsyncSampleRowKeys(grpc::ClientContext* context, btproto::SampleRowKeysRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->PrepareAsyncSampleRowKeys(context, request, cq); } std::unique_ptr> MutateRows(grpc::ClientContext* context, btproto::MutateRowsRequest const& request) override { + ApplyOptions(context); return impl_.Stub()->MutateRows(context, request); } @@ -153,6 +169,7 @@ class DefaultDataClient : public DataClient { AsyncMutateRows(grpc::ClientContext* context, btproto::MutateRowsRequest const& request, grpc::CompletionQueue* cq, void* tag) override { + ApplyOptions(context); return impl_.Stub()->AsyncMutateRows(context, request, cq, tag); } @@ -161,6 +178,7 @@ class DefaultDataClient : public DataClient { PrepareAsyncMutateRows(grpc::ClientContext* context, btproto::MutateRowsRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->PrepareAsyncMutateRows(context, request, cq); } @@ -169,8 +187,14 @@ class DefaultDataClient : public DataClient { return impl_.BackgroundThreadsFactory(); } + void ApplyOptions(grpc::ClientContext* context) { + if (!user_project_) return; + context->AddMetadata("x-goog-user-project", *user_project_); + } + std::string project_; std::string instance_; + absl::optional user_project_; internal::CommonClient impl_; }; diff --git a/google/cloud/bigtable/internal/defaults.cc b/google/cloud/bigtable/internal/defaults.cc index f87f3ad574e05..3faba161b60c3 100644 --- a/google/cloud/bigtable/internal/defaults.cc +++ b/google/cloud/bigtable/internal/defaults.cc @@ -74,7 +74,9 @@ int DefaultConnectionPoolSize() { } Options DefaultOptions(Options opts) { - auto emulator = google::cloud::internal::GetEnv("BIGTABLE_EMULATOR_HOST"); + using ::google::cloud::internal::GetEnv; + + auto emulator = GetEnv("BIGTABLE_EMULATOR_HOST"); if (emulator) { opts.set(*emulator); opts.set(*emulator); @@ -82,11 +84,16 @@ Options DefaultOptions(Options opts) { } auto instance_admin_emulator = - google::cloud::internal::GetEnv("BIGTABLE_INSTANCE_ADMIN_EMULATOR_HOST"); + GetEnv("BIGTABLE_INSTANCE_ADMIN_EMULATOR_HOST"); if (instance_admin_emulator) { opts.set(*std::move(instance_admin_emulator)); } + auto user_project = GetEnv("GOOGLE_CLOUD_CPP_USER_PROJECT"); + if (user_project && !user_project->empty()) { + opts.set(*std::move(user_project)); + } + if (!opts.has()) { opts.set("bigtable.googleapis.com"); } diff --git a/google/cloud/bigtable/internal/defaults_test.cc b/google/cloud/bigtable/internal/defaults_test.cc index 81cc37624633d..3d24bbc429f11 100644 --- a/google/cloud/bigtable/internal/defaults_test.cc +++ b/google/cloud/bigtable/internal/defaults_test.cc @@ -42,6 +42,12 @@ using secs = std::chrono::seconds; using mins = std::chrono::minutes; TEST(OptionsTest, Defaults) { + ScopedEnvironment user_project("GOOGLE_CLOUD_CPP_USER_PROJECT", + absl::nullopt); + ScopedEnvironment emulator_host("BIGTABLE_EMULATOR_HOST", absl::nullopt); + ScopedEnvironment instance_emulator_host( + "BIGTABLE_INSTANCE_ADMIN_EMULATOR_HOST", absl::nullopt); + auto opts = DefaultOptions(); EXPECT_EQ("bigtable.googleapis.com", opts.get()); EXPECT_EQ("bigtableadmin.googleapis.com", opts.get()); @@ -49,6 +55,7 @@ TEST(OptionsTest, Defaults) { opts.get()); EXPECT_EQ(typeid(grpc::GoogleDefaultCredentials()), typeid(opts.get())); + EXPECT_FALSE(opts.has()); auto args = google::cloud::internal::MakeChannelArguments(opts); // Check that the pool domain is not set by default @@ -148,6 +155,16 @@ TEST(OptionsTest, DefaultTableAdminOptions) { EXPECT_EQ("tableadmin.googleapis.com", options.get()); } +TEST(OptionsTest, UserProjectOption) { + auto env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt); + auto options = Options{}.set("test-project"); + EXPECT_EQ(options.get(), "test-project"); + + env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", "env-project"); + options = Options{}.set("env-project"); + EXPECT_EQ(options.get(), "env-project"); +} + TEST(EndpointEnvTest, EmulatorEnvOnly) { ScopedEnvironment emulator("BIGTABLE_EMULATOR_HOST", "emulator-host:8000"); From f56bda895e0376339bb416e663feb025de89fb09 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 9 Feb 2022 23:54:43 +0000 Subject: [PATCH 2/5] Address review comments --- google/cloud/bigtable/data_client.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/google/cloud/bigtable/data_client.cc b/google/cloud/bigtable/data_client.cc index 896fe1733d368..9e0edcbb00db3 100644 --- a/google/cloud/bigtable/data_client.cc +++ b/google/cloud/bigtable/data_client.cc @@ -113,6 +113,7 @@ class DefaultDataClient : public DataClient { std::unique_ptr> ReadRows(grpc::ClientContext* context, btproto::ReadRowsRequest const& request) override { + ApplyOptions(context); return impl_.Stub()->ReadRows(context, request); } From 4d138ad7d7d5c44652fc7f760e4da9f3a7fe3ea1 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 9 Feb 2022 23:58:36 +0000 Subject: [PATCH 3/5] Address review comments and fix tests --- .../cloud/bigtable/internal/defaults_test.cc | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/google/cloud/bigtable/internal/defaults_test.cc b/google/cloud/bigtable/internal/defaults_test.cc index 3d24bbc429f11..d778c12448a66 100644 --- a/google/cloud/bigtable/internal/defaults_test.cc +++ b/google/cloud/bigtable/internal/defaults_test.cc @@ -155,13 +155,39 @@ TEST(OptionsTest, DefaultTableAdminOptions) { EXPECT_EQ("tableadmin.googleapis.com", options.get()); } -TEST(OptionsTest, UserProjectOption) { +TEST(OptionsTest, InstanceAdminUserProjectOption) { auto env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt); - auto options = Options{}.set("test-project"); + auto options = DefaultInstanceAdminOptions( + Options{}.set("test-project")); EXPECT_EQ(options.get(), "test-project"); env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", "env-project"); - options = Options{}.set("env-project"); + options = DefaultInstanceAdminOptions( + Options{}.set("test-project")); + EXPECT_EQ(options.get(), "env-project"); +} + +TEST(OptionsTest, TableAdminUserProjectOption) { + auto env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt); + auto options = + DefaultTableAdminOptions(Options{}.set("test-project")); + EXPECT_EQ(options.get(), "test-project"); + + env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", "env-project"); + options = + DefaultTableAdminOptions(Options{}.set("test-project")); + EXPECT_EQ(options.get(), "env-project"); +} + +TEST(OptionsTest, DataUserProjectOption) { + auto env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt); + auto options = + DefaultDataOptions(Options{}.set("test-project")); + EXPECT_EQ(options.get(), "test-project"); + + env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", "env-project"); + options = + DefaultDataOptions(Options{}.set("test-project")); EXPECT_EQ(options.get(), "env-project"); } From fc88475983a8f0d5d32332a4c597e11d8a0894cf Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 10 Feb 2022 00:04:16 +0000 Subject: [PATCH 4/5] Add support in (table)AdminClient --- google/cloud/bigtable/admin_client.cc | 49 ++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/google/cloud/bigtable/admin_client.cc b/google/cloud/bigtable/admin_client.cc index f4b0ed86a214b..fa56e25649737 100644 --- a/google/cloud/bigtable/admin_client.cc +++ b/google/cloud/bigtable/admin_client.cc @@ -125,7 +125,12 @@ namespace { class DefaultAdminClient : public google::cloud::bigtable::AdminClient { public: DefaultAdminClient(std::string project, Options options) - : project_(std::move(project)), impl_(std::move(options)) {} + : project_(std::move(project)), + user_project_( + options.has() + ? absl::nullopt + : absl::make_optional(options.get())), + impl_(std::move(options)) {} std::string const& project() const override { return project_; } std::shared_ptr Channel() override { return impl_.Channel(); } @@ -134,12 +139,14 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::Status CreateTable(grpc::ClientContext* context, btadmin::CreateTableRequest const& request, btadmin::Table* response) override { + ApplyOptions(context); return impl_.Stub()->CreateTable(context, request, response); } grpc::Status ListTables(grpc::ClientContext* context, btadmin::ListTablesRequest const& request, btadmin::ListTablesResponse* response) override { + ApplyOptions(context); return impl_.Stub()->ListTables(context, request, response); } @@ -148,12 +155,14 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncListTables(grpc::ClientContext* context, btadmin::ListTablesRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncListTables(context, request, cq); } grpc::Status GetTable(grpc::ClientContext* context, btadmin::GetTableRequest const& request, btadmin::Table* response) override { + ApplyOptions(context); return impl_.Stub()->GetTable(context, request, response); } @@ -161,48 +170,56 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncGetTable(grpc::ClientContext* context, btadmin::GetTableRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncGetTable(context, request, cq); } grpc::Status DeleteTable(grpc::ClientContext* context, btadmin::DeleteTableRequest const& request, google::protobuf::Empty* response) override { + ApplyOptions(context); return impl_.Stub()->DeleteTable(context, request, response); } grpc::Status CreateBackup(grpc::ClientContext* context, btadmin::CreateBackupRequest const& request, google::longrunning::Operation* response) override { + ApplyOptions(context); return impl_.Stub()->CreateBackup(context, request, response); } grpc::Status GetBackup(grpc::ClientContext* context, btadmin::GetBackupRequest const& request, btadmin::Backup* response) override { + ApplyOptions(context); return impl_.Stub()->GetBackup(context, request, response); } grpc::Status UpdateBackup(grpc::ClientContext* context, btadmin::UpdateBackupRequest const& request, btadmin::Backup* response) override { + ApplyOptions(context); return impl_.Stub()->UpdateBackup(context, request, response); } grpc::Status DeleteBackup(grpc::ClientContext* context, btadmin::DeleteBackupRequest const& request, google::protobuf::Empty* response) override { + ApplyOptions(context); return impl_.Stub()->DeleteBackup(context, request, response); } grpc::Status ListBackups(grpc::ClientContext* context, btadmin::ListBackupsRequest const& request, btadmin::ListBackupsResponse* response) override { + ApplyOptions(context); return impl_.Stub()->ListBackups(context, request, response); } grpc::Status RestoreTable(grpc::ClientContext* context, btadmin::RestoreTableRequest const& request, google::longrunning::Operation* response) override { + ApplyOptions(context); return impl_.Stub()->RestoreTable(context, request, response); } @@ -210,12 +227,14 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, btadmin::ModifyColumnFamiliesRequest const& request, btadmin::Table* response) override { + ApplyOptions(context); return impl_.Stub()->ModifyColumnFamilies(context, request, response); } grpc::Status DropRowRange(grpc::ClientContext* context, btadmin::DropRowRangeRequest const& request, google::protobuf::Empty* response) override { + ApplyOptions(context); return impl_.Stub()->DropRowRange(context, request, response); } @@ -223,6 +242,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, btadmin::GenerateConsistencyTokenRequest const& request, btadmin::GenerateConsistencyTokenResponse* response) override { + ApplyOptions(context); return impl_.Stub()->GenerateConsistencyToken(context, request, response); } @@ -230,6 +250,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, btadmin::CheckConsistencyRequest const& request, btadmin::CheckConsistencyResponse* response) override { + ApplyOptions(context); return impl_.Stub()->CheckConsistency(context, request, response); } @@ -237,6 +258,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, google::longrunning::GetOperationRequest const& request, google::longrunning::Operation* response) override { + ApplyOptions(context); auto stub = google::longrunning::Operations::NewStub(Channel()); return stub->GetOperation(context, request, response); } @@ -244,12 +266,14 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::Status GetIamPolicy(grpc::ClientContext* context, google::iam::v1::GetIamPolicyRequest const& request, google::iam::v1::Policy* response) override { + ApplyOptions(context); return impl_.Stub()->GetIamPolicy(context, request, response); } grpc::Status SetIamPolicy(grpc::ClientContext* context, google::iam::v1::SetIamPolicyRequest const& request, google::iam::v1::Policy* response) override { + ApplyOptions(context); return impl_.Stub()->SetIamPolicy(context, request, response); } @@ -257,6 +281,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, google::iam::v1::TestIamPermissionsRequest const& request, google::iam::v1::TestIamPermissionsResponse* response) override { + ApplyOptions(context); return impl_.Stub()->TestIamPermissions(context, request, response); } @@ -264,6 +289,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncCreateTable(grpc::ClientContext* context, btadmin::CreateTableRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncCreateTable(context, request, cq); } @@ -272,6 +298,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncDeleteTable(grpc::ClientContext* context, btadmin::DeleteTableRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncDeleteTable(context, request, cq); } @@ -280,6 +307,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncCreateBackup(grpc::ClientContext* context, btadmin::CreateBackupRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncCreateBackup(context, request, cq); } @@ -287,6 +315,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncGetBackup(grpc::ClientContext* context, btadmin::GetBackupRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncGetBackup(context, request, cq); } @@ -294,6 +323,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncUpdateBackup(grpc::ClientContext* context, btadmin::UpdateBackupRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncUpdateBackup(context, request, cq); } @@ -302,6 +332,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncDeleteBackup(grpc::ClientContext* context, btadmin::DeleteBackupRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncDeleteBackup(context, request, cq); } @@ -310,6 +341,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncListBackups(grpc::ClientContext* context, btadmin::ListBackupsRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncListBackups(context, request, cq); } @@ -318,6 +350,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncRestoreTable(grpc::ClientContext* context, btadmin::RestoreTableRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncRestoreTable(context, request, cq); } @@ -325,6 +358,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncModifyColumnFamilies(grpc::ClientContext* context, btadmin::ModifyColumnFamiliesRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncModifyColumnFamilies(context, request, cq); } @@ -333,6 +367,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncDropRowRange(grpc::ClientContext* context, btadmin::DropRowRangeRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncDropRowRange(context, request, cq); }; @@ -342,6 +377,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, btadmin::GenerateConsistencyTokenRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncGenerateConsistencyToken(context, request, cq); } @@ -350,6 +386,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncCheckConsistency(grpc::ClientContext* context, btadmin::CheckConsistencyRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncCheckConsistency(context, request, cq); } @@ -358,6 +395,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncGetIamPolicy(grpc::ClientContext* context, google::iam::v1::GetIamPolicyRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncGetIamPolicy(context, request, cq); } @@ -366,6 +404,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncSetIamPolicy(grpc::ClientContext* context, google::iam::v1::SetIamPolicyRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncSetIamPolicy(context, request, cq); } @@ -375,6 +414,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { grpc::ClientContext* context, google::iam::v1::TestIamPermissionsRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); return impl_.Stub()->AsyncTestIamPermissions(context, request, cq); } @@ -383,6 +423,7 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { AsyncGetOperation(grpc::ClientContext* context, google::longrunning::GetOperationRequest const& request, grpc::CompletionQueue* cq) override { + ApplyOptions(context); auto stub = google::longrunning::Operations::NewStub(Channel()); return std::unique_ptr>( @@ -394,7 +435,13 @@ class DefaultAdminClient : public google::cloud::bigtable::AdminClient { return impl_.BackgroundThreadsFactory(); } + void ApplyOptions(grpc::ClientContext* context) { + if (!user_project_) return; + context->AddMetadata("x-goog-user-project", *user_project_); + } + std::string project_; + absl::optional user_project_; internal::CommonClient impl_; }; From f53f8bda474800f720a6969c44e7097299decbe0 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 10 Feb 2022 00:48:02 +0000 Subject: [PATCH 5/5] Fix formatting --- google/cloud/bigtable/internal/defaults_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/google/cloud/bigtable/internal/defaults_test.cc b/google/cloud/bigtable/internal/defaults_test.cc index d778c12448a66..b26ae07cc6fd9 100644 --- a/google/cloud/bigtable/internal/defaults_test.cc +++ b/google/cloud/bigtable/internal/defaults_test.cc @@ -169,13 +169,13 @@ TEST(OptionsTest, InstanceAdminUserProjectOption) { TEST(OptionsTest, TableAdminUserProjectOption) { auto env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", absl::nullopt); - auto options = - DefaultTableAdminOptions(Options{}.set("test-project")); + auto options = DefaultTableAdminOptions( + Options{}.set("test-project")); EXPECT_EQ(options.get(), "test-project"); env = ScopedEnvironment("GOOGLE_CLOUD_CPP_USER_PROJECT", "env-project"); - options = - DefaultTableAdminOptions(Options{}.set("test-project")); + options = DefaultTableAdminOptions( + Options{}.set("test-project")); EXPECT_EQ(options.get(), "env-project"); }