Skip to content

Commit 37fa36b

Browse files
authored
feat(generator): selectively generate async methods for certain RPCs (#7540)
1 parent 8a902a5 commit 37fa36b

36 files changed

Lines changed: 1201 additions & 43 deletions

generator/generator_config.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ message ServiceConfiguration {
2323
repeated string omitted_rpcs = 4;
2424
string service_endpoint_env_var = 5;
2525
string emulator_endpoint_env_var = 6;
26+
// Generating Async APIs is typically unnecessary for RPCs that are
27+
// non-streaming, non-paginated, and not longrunning operations. If we need
28+
// to generate an Async API for such an RPC, we can list it here.
29+
//
30+
// Only the Async API will be generated for RPCs listed both here and in
31+
// `omitted_rpcs`.
32+
repeated string gen_async_rpcs = 7;
2633
}
2734

2835
message GeneratorConfiguration {

generator/integration_tests/generator_integration_test.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ class GeneratorIntegrationTest : public testing::TestWithParam<std::string> {
103103
omit_rpc2_ = "Omitted2";
104104
service_endpoint_env_var_ = "GOLDEN_KITCHEN_SINK_ENDPOINT";
105105
emulator_endpoint_env_var_ = "GOLDEN_KITCHEN_SINK_EMULATOR_HOST";
106+
gen_async_rpc1_ = "GetDatabase";
107+
gen_async_rpc2_ = "DropDatabase";
106108

107109
std::vector<std::string> args;
108110
// empty arg keeps first real arg from being ignored.
@@ -121,6 +123,8 @@ class GeneratorIntegrationTest : public testing::TestWithParam<std::string> {
121123
service_endpoint_env_var_);
122124
args.emplace_back("--cpp_codegen_opt=emulator_endpoint_env_var=" +
123125
emulator_endpoint_env_var_);
126+
args.emplace_back("--cpp_codegen_opt=gen_async_rpc=" + gen_async_rpc1_);
127+
args.emplace_back("--cpp_codegen_opt=gen_async_rpc=" + gen_async_rpc2_);
124128
args.emplace_back("generator/integration_tests/test.proto");
125129

126130
std::vector<char const*> c_args;
@@ -145,6 +149,8 @@ class GeneratorIntegrationTest : public testing::TestWithParam<std::string> {
145149
std::string omit_rpc2_;
146150
std::string service_endpoint_env_var_;
147151
std::string emulator_endpoint_env_var_;
152+
std::string gen_async_rpc1_;
153+
std::string gen_async_rpc2_;
148154
};
149155

150156
TEST_P(GeneratorIntegrationTest, CompareGeneratedToGolden) {

generator/integration_tests/golden/golden_thing_admin_client.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,20 @@ GoldenThingAdminClient::ListBackupOperations(std::string const& parent) {
180180
return connection_->ListBackupOperations(request);
181181
}
182182

183+
future<StatusOr<google::test::admin::database::v1::Database>>
184+
GoldenThingAdminClient::AsyncGetDatabase(std::string const& name) {
185+
google::test::admin::database::v1::GetDatabaseRequest request;
186+
request.set_name(name);
187+
return connection_->AsyncGetDatabase(request);
188+
}
189+
190+
future<Status>
191+
GoldenThingAdminClient::AsyncDropDatabase(std::string const& database) {
192+
google::test::admin::database::v1::DropDatabaseRequest request;
193+
request.set_database(database);
194+
return connection_->AsyncDropDatabase(request);
195+
}
196+
183197
StreamRange<google::test::admin::database::v1::Database>
184198
GoldenThingAdminClient::ListDatabases(google::test::admin::database::v1::ListDatabasesRequest request) {
185199
return connection_->ListDatabases(std::move(request));
@@ -265,6 +279,16 @@ GoldenThingAdminClient::ListBackupOperations(google::test::admin::database::v1::
265279
return connection_->ListBackupOperations(std::move(request));
266280
}
267281

282+
future<StatusOr<google::test::admin::database::v1::Database>>
283+
GoldenThingAdminClient::AsyncGetDatabase(google::test::admin::database::v1::GetDatabaseRequest const& request) {
284+
return connection_->AsyncGetDatabase(request);
285+
}
286+
287+
future<Status>
288+
GoldenThingAdminClient::AsyncDropDatabase(google::test::admin::database::v1::DropDatabaseRequest const& request) {
289+
return connection_->AsyncDropDatabase(request);
290+
}
291+
268292
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
269293
} // namespace golden
270294
} // namespace cloud

generator/integration_tests/golden/golden_thing_admin_client.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,26 @@ class GoldenThingAdminClient {
378378
StreamRange<google::longrunning::Operation>
379379
ListBackupOperations(std::string const& parent);
380380

381+
/**
382+
* Gets the state of a Cloud Test database.
383+
*
384+
* @param name Required. The name of the requested database. Values are of the form
385+
* `projects/<project>/instances/<instance>/databases/<database>`.
386+
* @return [google::test::admin::database::v1::Database](https://github.com/googleapis/googleapis/blob/59f97e6044a1275f83427ab7962a154c00d915b5/generator/integration_tests/test.proto#L329)
387+
*/
388+
future<StatusOr<google::test::admin::database::v1::Database>>
389+
AsyncGetDatabase(std::string const& name);
390+
391+
/**
392+
* Drops (aka deletes) a Cloud Test database.
393+
* Completed backups for the database will be retained according to their
394+
* `expire_time`.
395+
*
396+
* @param database Required. The database to be dropped.
397+
*/
398+
future<Status>
399+
AsyncDropDatabase(std::string const& database);
400+
381401
/**
382402
* Lists Cloud Test databases.
383403
*
@@ -613,6 +633,25 @@ class GoldenThingAdminClient {
613633
StreamRange<google::longrunning::Operation>
614634
ListBackupOperations(google::test::admin::database::v1::ListBackupOperationsRequest request);
615635

636+
/**
637+
* Gets the state of a Cloud Test database.
638+
*
639+
* @param request [google::test::admin::database::v1::GetDatabaseRequest](https://github.com/googleapis/googleapis/blob/59f97e6044a1275f83427ab7962a154c00d915b5/generator/integration_tests/test.proto#L443)
640+
* @return [google::test::admin::database::v1::Database](https://github.com/googleapis/googleapis/blob/59f97e6044a1275f83427ab7962a154c00d915b5/generator/integration_tests/test.proto#L329)
641+
*/
642+
future<StatusOr<google::test::admin::database::v1::Database>>
643+
AsyncGetDatabase(google::test::admin::database::v1::GetDatabaseRequest const& request);
644+
645+
/**
646+
* Drops (aka deletes) a Cloud Test database.
647+
* Completed backups for the database will be retained according to their
648+
* `expire_time`.
649+
*
650+
* @param request [google::test::admin::database::v1::DropDatabaseRequest](https://github.com/googleapis/googleapis/blob/59f97e6044a1275f83427ab7962a154c00d915b5/generator/integration_tests/test.proto#L523)
651+
*/
652+
future<Status>
653+
AsyncDropDatabase(google::test::admin::database::v1::DropDatabaseRequest const& request);
654+
616655
private:
617656
std::shared_ptr<GoldenThingAdminConnection> connection_;
618657
};

generator/integration_tests/golden/golden_thing_admin_connection.cc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,21 @@ StreamRange<google::longrunning::Operation> GoldenThingAdminConnection::ListBack
172172
});
173173
}
174174

175+
future<StatusOr<google::test::admin::database::v1::Database>>
176+
GoldenThingAdminConnection::AsyncGetDatabase(
177+
google::test::admin::database::v1::GetDatabaseRequest const&) {
178+
return google::cloud::make_ready_future<
179+
StatusOr<google::test::admin::database::v1::Database>>(
180+
Status(StatusCode::kUnimplemented, "not implemented"));
181+
}
182+
183+
future<Status>
184+
GoldenThingAdminConnection::AsyncDropDatabase(
185+
google::test::admin::database::v1::DropDatabaseRequest const&) {
186+
return google::cloud::make_ready_future(
187+
Status(StatusCode::kUnimplemented, "not implemented"));
188+
}
189+
175190
namespace {
176191
class GoldenThingAdminConnectionImpl : public GoldenThingAdminConnection {
177192
public:
@@ -532,6 +547,38 @@ class GoldenThingAdminConnectionImpl : public GoldenThingAdminConnection {
532547
});
533548
}
534549

550+
future<StatusOr<google::test::admin::database::v1::Database>>
551+
AsyncGetDatabase(
552+
google::test::admin::database::v1::GetDatabaseRequest const& request) override {
553+
auto& stub = stub_;
554+
return google::cloud::internal::AsyncRetryLoop(
555+
retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
556+
idempotency_policy_->GetDatabase(request),
557+
background_->cq(),
558+
[stub](CompletionQueue& cq,
559+
std::unique_ptr<grpc::ClientContext> context,
560+
google::test::admin::database::v1::GetDatabaseRequest const& request) {
561+
return stub->AsyncGetDatabase(cq, std::move(context), request);
562+
},
563+
request, __func__);
564+
}
565+
566+
future<Status>
567+
AsyncDropDatabase(
568+
google::test::admin::database::v1::DropDatabaseRequest const& request) override {
569+
auto& stub = stub_;
570+
return google::cloud::internal::AsyncRetryLoop(
571+
retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
572+
idempotency_policy_->DropDatabase(request),
573+
background_->cq(),
574+
[stub](CompletionQueue& cq,
575+
std::unique_ptr<grpc::ClientContext> context,
576+
google::test::admin::database::v1::DropDatabaseRequest const& request) {
577+
return stub->AsyncDropDatabase(cq, std::move(context), request);
578+
},
579+
request, __func__);
580+
}
581+
535582
private:
536583
std::unique_ptr<google::cloud::BackgroundThreads> background_;
537584
std::shared_ptr<golden_internal::GoldenThingAdminStub> stub_;

generator/integration_tests/golden/golden_thing_admin_connection.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ class GoldenThingAdminConnection {
102102
virtual StreamRange<google::longrunning::Operation>
103103
ListBackupOperations(google::test::admin::database::v1::ListBackupOperationsRequest request);
104104

105+
virtual future<StatusOr<google::test::admin::database::v1::Database>>
106+
AsyncGetDatabase(google::test::admin::database::v1::GetDatabaseRequest const& request);
107+
108+
virtual future<Status>
109+
AsyncDropDatabase(google::test::admin::database::v1::DropDatabaseRequest const& request);
110+
105111
};
106112

107113
std::shared_ptr<GoldenThingAdminConnection> MakeGoldenThingAdminConnection(

generator/integration_tests/golden/internal/golden_kitchen_sink_auth_decorator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ namespace cloud {
2525
namespace golden_internal {
2626
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
2727

28-
2928
GoldenKitchenSinkAuth::GoldenKitchenSinkAuth(
3029
std::shared_ptr<google::cloud::internal::GrpcAuthenticationStrategy> auth,
3130
std::shared_ptr<GoldenKitchenSinkStub> child)
@@ -81,6 +80,7 @@ StatusOr<google::test::admin::database::v1::ListServiceAccountKeysResponse> Gold
8180
if (!status.ok()) return status;
8281
return child_->ListServiceAccountKeys(context, request);
8382
}
83+
8484
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
8585
} // namespace golden_internal
8686
} // namespace cloud

generator/integration_tests/golden/internal/golden_kitchen_sink_auth_decorator.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ namespace cloud {
3131
namespace golden_internal {
3232
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
3333

34-
3534
class GoldenKitchenSinkAuth : public GoldenKitchenSinkStub {
3635
public:
3736
~GoldenKitchenSinkAuth() override = default;

generator/integration_tests/golden/internal/golden_thing_admin_auth_decorator.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,37 @@ StatusOr<google::test::admin::database::v1::ListBackupOperationsResponse> Golden
207207
return child_->ListBackupOperations(context, request);
208208
}
209209

210+
future<StatusOr<google::test::admin::database::v1::Database>> GoldenThingAdminAuth::AsyncGetDatabase(
211+
google::cloud::CompletionQueue& cq,
212+
std::unique_ptr<grpc::ClientContext> context,
213+
google::test::admin::database::v1::GetDatabaseRequest const& request) {
214+
using ReturnType = StatusOr<google::test::admin::database::v1::Database>;
215+
auto child = child_;
216+
return auth_->AsyncConfigureContext(std::move(context)).then(
217+
[cq, child, request](
218+
future<StatusOr<std::unique_ptr<grpc::ClientContext>>> f) mutable {
219+
auto context = f.get();
220+
if (!context) {
221+
return make_ready_future(ReturnType(std::move(context).status()));
222+
}
223+
return child->AsyncGetDatabase(cq, *std::move(context), request);
224+
});
225+
}
226+
227+
future<Status> GoldenThingAdminAuth::AsyncDropDatabase(
228+
google::cloud::CompletionQueue& cq,
229+
std::unique_ptr<grpc::ClientContext> context,
230+
google::test::admin::database::v1::DropDatabaseRequest const& request) {
231+
auto child = child_;
232+
return auth_->AsyncConfigureContext(std::move(context)).then(
233+
[cq, child, request](
234+
future<StatusOr<std::unique_ptr<grpc::ClientContext>>> f) mutable {
235+
auto context = f.get();
236+
if (!context) return make_ready_future(std::move(context).status());
237+
return child->AsyncDropDatabase(cq, *std::move(context), request);
238+
});
239+
}
240+
210241
future<StatusOr<google::longrunning::Operation>>
211242
GoldenThingAdminAuth::AsyncGetOperation(
212243
google::cloud::CompletionQueue& cq,
@@ -238,6 +269,7 @@ future<Status> GoldenThingAdminAuth::AsyncCancelOperation(
238269
return child->AsyncCancelOperation(cq, *std::move(context), request);
239270
});
240271
}
272+
241273
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
242274
} // namespace golden_internal
243275
} // namespace cloud

generator/integration_tests/golden/internal/golden_thing_admin_auth_decorator.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,16 @@ class GoldenThingAdminAuth : public GoldenThingAdminStub {
112112
grpc::ClientContext& context,
113113
google::test::admin::database::v1::ListBackupOperationsRequest const& request) override;
114114

115+
future<StatusOr<google::test::admin::database::v1::Database>> AsyncGetDatabase(
116+
google::cloud::CompletionQueue& cq,
117+
std::unique_ptr<grpc::ClientContext> context,
118+
google::test::admin::database::v1::GetDatabaseRequest const& request) override;
119+
120+
future<Status> AsyncDropDatabase(
121+
google::cloud::CompletionQueue& cq,
122+
std::unique_ptr<grpc::ClientContext> context,
123+
google::test::admin::database::v1::DropDatabaseRequest const& request) override;
124+
115125
future<StatusOr<google::longrunning::Operation>> AsyncGetOperation(
116126
google::cloud::CompletionQueue& cq,
117127
std::unique_ptr<grpc::ClientContext> context,

0 commit comments

Comments
 (0)