Skip to content

Commit

Permalink
feat(generator): support explicit routing headers (#9368)
Browse files Browse the repository at this point in the history
  • Loading branch information
dbolduc authored Jun 30, 2022
1 parent c290d9a commit d19d731
Showing 27 changed files with 1,157 additions and 128 deletions.
1 change: 1 addition & 0 deletions generator/integration_tests/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -30,6 +30,7 @@ proto_library(
"@com_google_googleapis//google/api:client_proto",
"@com_google_googleapis//google/api:field_behavior_proto",
"@com_google_googleapis//google/api:resource_proto",
"@com_google_googleapis//google/api:routing_proto",
"@com_google_googleapis//google/iam/v1:iam_policy_proto",
"@com_google_googleapis//google/iam/v1:policy_proto",
"@com_google_googleapis//google/longrunning:operations_proto",
1 change: 1 addition & 0 deletions generator/integration_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -39,6 +39,7 @@ target_link_libraries(
google-cloud-cpp::api_client_protos
google-cloud-cpp::api_field_behavior_protos
google-cloud-cpp::api_resource_protos
google-cloud-cpp::api_routing_protos
google-cloud-cpp::iam_v1_iam_policy_protos
google-cloud-cpp::iam_v1_policy_protos
google-cloud-cpp::longrunning_operations_protos
12 changes: 12 additions & 0 deletions generator/integration_tests/golden/golden_kitchen_sink_client.cc
Original file line number Diff line number Diff line change
@@ -142,6 +142,18 @@ GoldenKitchenSinkClient::AsyncAppendRows(ExperimentalTag tag, Options opts) {
return connection_->AsyncAppendRows(std::move(tag));
}

Status
GoldenKitchenSinkClient::ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const& request, Options opts) {
internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_));
return connection_->ExplicitRouting1(request);
}

Status
GoldenKitchenSinkClient::ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const& request, Options opts) {
internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_));
return connection_->ExplicitRouting2(request);
}

GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
} // namespace golden
} // namespace cloud
116 changes: 78 additions & 38 deletions generator/integration_tests/golden/golden_kitchen_sink_client.h

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -91,6 +91,18 @@ GoldenKitchenSinkConnection::AsyncAppendRows(ExperimentalTag) {
Status(StatusCode::kUnimplemented, "not implemented"));
}

Status
GoldenKitchenSinkConnection::ExplicitRouting1(
google::test::admin::database::v1::ExplicitRoutingRequest const&) {
return Status(StatusCode::kUnimplemented, "not implemented");
}

Status
GoldenKitchenSinkConnection::ExplicitRouting2(
google::test::admin::database::v1::ExplicitRoutingRequest const&) {
return Status(StatusCode::kUnimplemented, "not implemented");
}

std::shared_ptr<GoldenKitchenSinkConnection> MakeGoldenKitchenSinkConnection(
Options options) {
internal::CheckExpectedOptions<CommonOptionList, GrpcOptionList,
Original file line number Diff line number Diff line change
@@ -89,6 +89,12 @@ class GoldenKitchenSinkConnection {
google::test::admin::database::v1::AppendRowsRequest,
google::test::admin::database::v1::AppendRowsResponse>>
AsyncAppendRows(ExperimentalTag);

virtual Status
ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const& request);

virtual Status
ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const& request);
};

/**
Original file line number Diff line number Diff line change
@@ -68,6 +68,16 @@ class DefaultGoldenKitchenSinkConnectionIdempotencyPolicy : public GoldenKitchen
DoNothing(google::protobuf::Empty const&) override {
return Idempotency::kIdempotent;
}

Idempotency
ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const&) override {
return Idempotency::kNonIdempotent;
}

Idempotency
ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const&) override {
return Idempotency::kNonIdempotent;
}
};
} // namespace

Original file line number Diff line number Diff line change
@@ -54,6 +54,12 @@ class GoldenKitchenSinkConnectionIdempotencyPolicy {

virtual google::cloud::Idempotency
DoNothing(google::protobuf::Empty const& request) = 0;

virtual google::cloud::Idempotency
ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const& request) = 0;

virtual google::cloud::Idempotency
ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const& request) = 0;
};

std::unique_ptr<GoldenKitchenSinkConnectionIdempotencyPolicy>
124 changes: 62 additions & 62 deletions generator/integration_tests/golden/golden_thing_admin_client.h

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -121,6 +121,22 @@ GoldenKitchenSinkAuth::WriteObject(
return child_->WriteObject(std::move(context));
}

Status GoldenKitchenSinkAuth::ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
auto status = auth_->ConfigureContext(context);
if (!status.ok()) return status;
return child_->ExplicitRouting1(context, request);
}

Status GoldenKitchenSinkAuth::ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
auto status = auth_->ConfigureContext(context);
if (!status.ok()) return status;
return child_->ExplicitRouting2(context, request);
}

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
GoldenKitchenSinkAuth::AsyncTailLogEntries(
Original file line number Diff line number Diff line change
@@ -79,6 +79,14 @@ class GoldenKitchenSinkAuth : public GoldenKitchenSinkStub {
google::test::admin::database::v1::WriteObjectResponse>> WriteObject(
std::unique_ptr<grpc::ClientContext> context) override;

Status ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

Status ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
AsyncTailLogEntries(
Original file line number Diff line number Diff line change
@@ -147,6 +147,30 @@ GoldenKitchenSinkConnectionImpl::DoNothing(google::protobuf::Empty const& reques
request, __func__);
}

Status
GoldenKitchenSinkConnectionImpl::ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return google::cloud::internal::RetryLoop(
retry_policy(), backoff_policy(),
idempotency_policy()->ExplicitRouting1(request),
[this](grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return stub_->ExplicitRouting1(context, request);
},
request, __func__);
}

Status
GoldenKitchenSinkConnectionImpl::ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return google::cloud::internal::RetryLoop(
retry_policy(), backoff_policy(),
idempotency_policy()->ExplicitRouting2(request),
[this](grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return stub_->ExplicitRouting2(context, request);
},
request, __func__);
}

GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
} // namespace golden_internal
} // namespace cloud
Original file line number Diff line number Diff line change
@@ -80,6 +80,12 @@ class GoldenKitchenSinkConnectionImpl
google::test::admin::database::v1::AppendRowsResponse>>
AsyncAppendRows(ExperimentalTag) override;

Status
ExplicitRouting1(google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

Status
ExplicitRouting2(google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

private:
std::unique_ptr<golden::GoldenKitchenSinkRetryPolicy> retry_policy() {
auto const& options = internal::CurrentOptions();
Original file line number Diff line number Diff line change
@@ -169,6 +169,30 @@ GoldenKitchenSinkLogging::WriteObject(
return stream;
}

Status
GoldenKitchenSinkLogging::ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return google::cloud::internal::LogWrapper(
[this](grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return child_->ExplicitRouting1(context, request);
},
context, request, __func__, tracing_options_);
}

Status
GoldenKitchenSinkLogging::ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return google::cloud::internal::LogWrapper(
[this](grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
return child_->ExplicitRouting2(context, request);
},
context, request, __func__, tracing_options_);
}

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
GoldenKitchenSinkLogging::AsyncTailLogEntries(
Original file line number Diff line number Diff line change
@@ -80,6 +80,14 @@ class GoldenKitchenSinkLogging : public GoldenKitchenSinkStub {
WriteObject(
std::unique_ptr<grpc::ClientContext> context) override;

Status ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

Status ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
AsyncTailLogEntries(
Original file line number Diff line number Diff line change
@@ -18,7 +18,9 @@

#include "generator/integration_tests/golden/internal/golden_kitchen_sink_metadata_decorator.h"
#include "google/cloud/common_options.h"
#include "google/cloud/internal/absl_str_join_quiet.h"
#include "google/cloud/internal/api_client_header.h"
#include "google/cloud/internal/routing_matcher.h"
#include "google/cloud/status_or.h"
#include <generator/integration_tests/test.grpc.pb.h>
#include <memory>
@@ -69,7 +71,18 @@ std::unique_ptr<google::cloud::internal::StreamingReadRpc<google::test::admin::d
GoldenKitchenSinkMetadata::TailLogEntries(
std::unique_ptr<grpc::ClientContext> context,
google::test::admin::database::v1::TailLogEntriesRequest const& request) {
SetMetadata(*context);
std::vector<std::string> params;
params.reserve(1);

if (!request.filter().empty()) {
params.push_back("filter=" + request.filter());
}

if (params.empty()) {
SetMetadata(*context);
} else {
SetMetadata(*context, absl::StrJoin(params, "&"));
}
return child_->TailLogEntries(std::move(context), request);
}

@@ -108,13 +121,96 @@ GoldenKitchenSinkMetadata::WriteObject(
return child_->WriteObject(std::move(context));
}

Status
GoldenKitchenSinkMetadata::ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
std::vector<std::string> params;
params.reserve(2);

static auto* table_location_matcher = []{
return new google::cloud::internal::RoutingMatcher<google::test::admin::database::v1::ExplicitRoutingRequest>{
"table_location=", {
{[](google::test::admin::database::v1::ExplicitRoutingRequest const& request) -> std::string const& {
return request.table_name();
},
std::regex{"(regions/[^/]+/zones/[^/]+)/tables/[^/]+", std::regex::optimize}},
{[](google::test::admin::database::v1::ExplicitRoutingRequest const& request) -> std::string const& {
return request.table_name();
},
std::regex{"projects/[^/]+/(instances/[^/]+)/tables/[^/]+", std::regex::optimize}},
}};
}();
table_location_matcher->AppendParam(request, params);

static auto* routing_id_matcher = []{
return new google::cloud::internal::RoutingMatcher<google::test::admin::database::v1::ExplicitRoutingRequest>{
"routing_id=", {
{[](google::test::admin::database::v1::ExplicitRoutingRequest const& request) -> std::string const& {
return request.app_profile_id();
},
std::regex{"profiles/([^/]+)", std::regex::optimize}},
{[](google::test::admin::database::v1::ExplicitRoutingRequest const& request) -> std::string const& {
return request.app_profile_id();
},
absl::nullopt},
{[](google::test::admin::database::v1::ExplicitRoutingRequest const& request) -> std::string const& {
return request.table_name();
},
std::regex{"(projects/[^/]+)/.*", std::regex::optimize}},
}};
}();
routing_id_matcher->AppendParam(request, params);

if (params.empty()) {
SetMetadata(context);
} else {
SetMetadata(context, absl::StrJoin(params, "&"));
}
return child_->ExplicitRouting1(context, request);
}

Status
GoldenKitchenSinkMetadata::ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) {
std::vector<std::string> params;
params.reserve(1);

if (!request.app_profile_id().empty()) {
params.push_back("no_regex_needed=" + request.app_profile_id());
} else if (!request.table_name().empty()) {
params.push_back("no_regex_needed=" + request.table_name());
} else if (!request.no_regex_needed().empty()) {
params.push_back("no_regex_needed=" + request.no_regex_needed());
}

if (params.empty()) {
SetMetadata(context);
} else {
SetMetadata(context, absl::StrJoin(params, "&"));
}
return child_->ExplicitRouting2(context, request);
}

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
GoldenKitchenSinkMetadata::AsyncTailLogEntries(
google::cloud::CompletionQueue const& cq,
std::unique_ptr<grpc::ClientContext> context,
google::test::admin::database::v1::TailLogEntriesRequest const& request) {
SetMetadata(*context);
std::vector<std::string> params;
params.reserve(1);

if (!request.filter().empty()) {
params.push_back("filter=" + request.filter());
}

if (params.empty()) {
SetMetadata(*context);
} else {
SetMetadata(*context, absl::StrJoin(params, "&"));
}
return child_->AsyncTailLogEntries(cq, std::move(context), request);
}

Original file line number Diff line number Diff line change
@@ -76,6 +76,14 @@ class GoldenKitchenSinkMetadata : public GoldenKitchenSinkStub {
WriteObject(
std::unique_ptr<grpc::ClientContext> context) override;

Status ExplicitRouting1(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

Status ExplicitRouting2(
grpc::ClientContext& context,
google::test::admin::database::v1::ExplicitRoutingRequest const& request) override;

std::unique_ptr<::google::cloud::internal::AsyncStreamingReadRpc<
google::test::admin::database::v1::TailLogEntriesResponse>>
AsyncTailLogEntries(
Loading

0 comments on commit d19d731

Please sign in to comment.