16 #include "google/cloud/spanner/internal/polling_loop.h" 17 #include "google/cloud/spanner/internal/retry_loop.h" 18 #include "google/cloud/spanner/internal/time_utils.h" 25 namespace gcsa = ::google::spanner::admin::database::v1;
27 future<StatusOr<google::spanner::admin::database::v1::Backup>>
30 return google::cloud::make_ready_future(StatusOr<gcsa::Backup>(
31 Status(StatusCode::kUnimplemented,
"not implemented")));
34 future<StatusOr<google::spanner::admin::database::v1::Database>>
37 return google::cloud::make_ready_future(StatusOr<gcsa::Database>(
38 Status(StatusCode::kUnimplemented,
"not implemented")));
41 StatusOr<google::spanner::admin::database::v1::Backup>
44 return Status(StatusCode::kUnimplemented,
"not implemented");
49 return Status(StatusCode::kUnimplemented,
"not implemented");
55 gcsa::ListBackupsRequest{},
56 [](gcsa::ListBackupsRequest
const&) {
57 return StatusOr<gcsa::ListBackupsResponse>(
58 Status(StatusCode::kUnimplemented,
"not implemented"));
60 [](gcsa::ListBackupsResponse
const&) {
61 return std::vector<gcsa::Backup>{};
65 StatusOr<google::spanner::admin::database::v1::Backup>
68 return Status(StatusCode::kUnimplemented,
"not implemented");
75 gcsa::ListBackupOperationsRequest{},
76 [](gcsa::ListBackupOperationsRequest
const&) {
77 return StatusOr<gcsa::ListBackupOperationsResponse>(
78 Status(StatusCode::kUnimplemented,
"not implemented"));
80 [](gcsa::ListBackupOperationsResponse
const&) {
81 return std::vector<google::longrunning::Operation>{};
89 gcsa::ListDatabaseOperationsRequest{},
90 [](gcsa::ListDatabaseOperationsRequest
const&) {
91 return StatusOr<gcsa::ListDatabaseOperationsResponse>(
92 Status(StatusCode::kUnimplemented,
"not implemented"));
94 [](gcsa::ListDatabaseOperationsResponse
const&) {
95 return std::vector<google::longrunning::Operation>{};
101 std::unique_ptr<RetryPolicy> DefaultAdminRetryPolicy() {
105 std::unique_ptr<BackoffPolicy> DefaultAdminBackoffPolicy() {
106 auto constexpr kBackoffScaling = 2.0;
108 std::chrono::minutes(5), kBackoffScaling)
112 std::unique_ptr<PollingPolicy> DefaultAdminPollingPolicy() {
113 auto constexpr kBackoffScaling = 2.0;
114 return GenericPollingPolicy<>(
117 std::chrono::minutes(5), kBackoffScaling))
121 class DatabaseAdminConnectionImpl :
public DatabaseAdminConnection {
123 explicit DatabaseAdminConnectionImpl(
124 std::shared_ptr<internal::DatabaseAdminStub> stub,
125 std::unique_ptr<RetryPolicy> retry_policy,
126 std::unique_ptr<BackoffPolicy> backoff_policy,
127 std::unique_ptr<PollingPolicy> polling_policy)
128 : stub_(std::move(stub)),
129 retry_policy_prototype_(std::move(retry_policy)),
130 backoff_policy_prototype_(std::move(backoff_policy)),
131 polling_policy_prototype_(std::move(polling_policy)) {}
133 explicit DatabaseAdminConnectionImpl(
134 std::shared_ptr<internal::DatabaseAdminStub> stub)
135 : DatabaseAdminConnectionImpl(std::move(stub), DefaultAdminRetryPolicy(),
136 DefaultAdminBackoffPolicy(),
137 DefaultAdminPollingPolicy()) {}
139 ~DatabaseAdminConnectionImpl()
override =
default;
141 future<StatusOr<google::spanner::admin::database::v1::Database>>
142 CreateDatabase(CreateDatabaseParams p)
override {
143 gcsa::CreateDatabaseRequest request;
144 request.set_parent(p.database.instance().FullName());
145 request.set_create_statement(
"CREATE DATABASE `" +
146 p.database.database_id() +
"`");
147 for (
auto& s : p.extra_statements) {
148 *request.add_extra_statements() = std::move(s);
151 auto operation = RetryLoop(
152 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
154 [
this](grpc::ClientContext& context,
155 gcsa::CreateDatabaseRequest
const& request) {
156 return stub_->CreateDatabase(context, request);
160 return google::cloud::make_ready_future(
161 StatusOr<gcsa::Database>(operation.status()));
164 return AwaitDatabase(*std::move(operation));
167 StatusOr<google::spanner::admin::database::v1::Database> GetDatabase(
168 GetDatabaseParams p)
override {
169 gcsa::GetDatabaseRequest request;
170 request.set_name(p.database.FullName());
172 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
174 [
this](grpc::ClientContext& context,
175 gcsa::GetDatabaseRequest
const& request) {
176 return stub_->GetDatabase(context, request);
181 StatusOr<google::spanner::admin::database::v1::GetDatabaseDdlResponse>
182 GetDatabaseDdl(GetDatabaseDdlParams p)
override {
183 gcsa::GetDatabaseDdlRequest request;
184 request.set_database(p.database.FullName());
186 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
188 [
this](grpc::ClientContext& context,
189 gcsa::GetDatabaseDdlRequest
const& request) {
190 return stub_->GetDatabaseDdl(context, request);
196 StatusOr<google::spanner::admin::database::v1::UpdateDatabaseDdlMetadata>>
197 UpdateDatabase(UpdateDatabaseParams p)
override {
198 gcsa::UpdateDatabaseDdlRequest request;
199 request.set_database(p.database.FullName());
200 for (
auto& s : p.statements) {
201 *request.add_statements() = std::move(s);
203 auto operation = RetryLoop(
204 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
206 [
this](grpc::ClientContext& context,
207 gcsa::UpdateDatabaseDdlRequest
const& request) {
208 return stub_->UpdateDatabase(context, request);
212 return google::cloud::make_ready_future(
213 StatusOr<gcsa::UpdateDatabaseDdlMetadata>(operation.status()));
216 return AwaitUpdateDatabase(*std::move(operation));
219 Status DropDatabase(DropDatabaseParams p)
override {
220 google::spanner::admin::database::v1::DropDatabaseRequest request;
221 request.set_database(p.database.FullName());
223 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
225 [
this](grpc::ClientContext& context,
226 gcsa::DropDatabaseRequest
const& request) {
227 return stub_->DropDatabase(context, request);
233 gcsa::ListDatabasesRequest request;
234 request.set_parent(p.instance.FullName());
235 request.clear_page_token();
240 std::shared_ptr<RetryPolicy const>(retry_policy_prototype_->clone());
241 auto backoff = std::shared_ptr<BackoffPolicy const>(
242 backoff_policy_prototype_->clone());
244 char const* function_name = __func__;
247 [stub, retry, backoff,
248 function_name](gcsa::ListDatabasesRequest
const& r) {
250 retry->clone(), backoff->clone(),
true,
251 [stub](grpc::ClientContext& context,
252 gcsa::ListDatabasesRequest
const& request) {
253 return stub->ListDatabases(context, request);
257 [](gcsa::ListDatabasesResponse r) {
258 std::vector<gcsa::Database> result(r.databases().size());
259 auto& dbs = *r.mutable_databases();
260 std::move(dbs.begin(), dbs.end(), result.begin());
265 future<StatusOr<google::spanner::admin::database::v1::Database>>
266 RestoreDatabase(RestoreDatabaseParams p)
override {
267 gcsa::RestoreDatabaseRequest request;
268 request.set_parent(p.database.instance().FullName());
269 request.set_database_id(p.database.database_id());
270 request.set_backup(std::move(p.backup_full_name));
271 auto operation = RetryLoop(
272 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
274 [
this](grpc::ClientContext& context,
275 gcsa::RestoreDatabaseRequest
const& request) {
276 return stub_->RestoreDatabase(context, request);
280 return google::cloud::make_ready_future(
281 StatusOr<gcsa::Database>(operation.status()));
284 return AwaitDatabase(*std::move(operation));
287 StatusOr<google::iam::v1::Policy> GetIamPolicy(
288 GetIamPolicyParams p)
override {
289 google::iam::v1::GetIamPolicyRequest request;
290 request.set_resource(p.database.FullName());
292 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
294 [
this](grpc::ClientContext& context,
295 google::iam::v1::GetIamPolicyRequest
const& request) {
296 return stub_->GetIamPolicy(context, request);
301 StatusOr<google::iam::v1::Policy> SetIamPolicy(
302 SetIamPolicyParams p)
override {
303 google::iam::v1::SetIamPolicyRequest request;
304 request.set_resource(p.database.FullName());
305 *request.mutable_policy() = std::move(p.policy);
306 bool is_idempotent = !request.policy().etag().empty();
308 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
310 [
this](grpc::ClientContext& context,
311 google::iam::v1::SetIamPolicyRequest
const& request) {
312 return stub_->SetIamPolicy(context, request);
317 StatusOr<google::iam::v1::TestIamPermissionsResponse> TestIamPermissions(
318 TestIamPermissionsParams p)
override {
319 google::iam::v1::TestIamPermissionsRequest request;
320 request.set_resource(p.database.FullName());
321 for (
auto& permission : p.permissions) {
322 request.add_permissions(std::move(permission));
325 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
327 [
this](grpc::ClientContext& context,
328 google::iam::v1::TestIamPermissionsRequest
const& request) {
329 return stub_->TestIamPermissions(context, request);
334 future<StatusOr<gcsa::Backup>> CreateBackup(CreateBackupParams p)
override {
335 gcsa::CreateBackupRequest request;
336 request.set_parent(p.database.instance().FullName());
337 request.set_backup_id(p.backup_id);
338 auto backup = request.mutable_backup();
339 backup->set_database(p.database.FullName());
340 auto proto_expire_time =
341 internal::ConvertTimePointToProtoTimestamp(p.expire_time);
342 if (!proto_expire_time) {
343 return google::cloud::make_ready_future(
344 StatusOr<gcsa::Backup>(proto_expire_time.status()));
346 *backup->mutable_expire_time() = *proto_expire_time;
347 auto operation = RetryLoop(
348 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
350 [
this](grpc::ClientContext& context,
351 gcsa::CreateBackupRequest
const& request) {
352 return stub_->CreateBackup(context, request);
356 return google::cloud::make_ready_future(
357 StatusOr<gcsa::Backup>(operation.status()));
360 return AwaitCreateBackup(*std::move(operation));
363 StatusOr<google::spanner::admin::database::v1::Backup> GetBackup(
364 GetBackupParams p)
override {
365 gcsa::GetBackupRequest request;
366 request.set_name(p.backup_full_name);
368 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
370 [
this](grpc::ClientContext& context,
371 gcsa::GetBackupRequest
const& request) {
372 return stub_->GetBackup(context, request);
377 Status DeleteBackup(DeleteBackupParams p)
override {
378 google::spanner::admin::database::v1::DeleteBackupRequest request;
379 request.set_name(p.backup_full_name);
381 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
383 [
this](grpc::ClientContext& context,
384 gcsa::DeleteBackupRequest
const& request) {
385 return stub_->DeleteBackup(context, request);
391 gcsa::ListBackupsRequest request;
392 request.set_parent(p.instance.FullName());
393 request.set_filter(std::move(p.filter));
398 std::shared_ptr<RetryPolicy const>(retry_policy_prototype_->clone());
399 auto backoff = std::shared_ptr<BackoffPolicy const>(
400 backoff_policy_prototype_->clone());
402 char const* function_name = __func__;
405 [stub, retry, backoff,
406 function_name](gcsa::ListBackupsRequest
const& r) {
408 retry->clone(), backoff->clone(),
true,
409 [stub](grpc::ClientContext& context,
410 gcsa::ListBackupsRequest
const& request) {
411 return stub->ListBackups(context, request);
415 [](gcsa::ListBackupsResponse r) {
416 std::vector<gcsa::Backup> result(r.backups().size());
417 auto& backups = *r.mutable_backups();
418 std::move(backups.begin(), backups.end(), result.begin());
423 StatusOr<google::spanner::admin::database::v1::Backup> UpdateBackup(
424 UpdateBackupParams p)
override {
426 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
428 [
this](grpc::ClientContext& context,
429 gcsa::UpdateBackupRequest
const& request) {
430 return stub_->UpdateBackup(context, request);
432 p.request, __func__);
436 ListBackupOperationsParams p)
override {
437 gcsa::ListBackupOperationsRequest request;
438 request.set_parent(p.instance.FullName());
439 request.set_filter(std::move(p.filter));
444 std::shared_ptr<RetryPolicy const>(retry_policy_prototype_->clone());
445 auto backoff = std::shared_ptr<BackoffPolicy const>(
446 backoff_policy_prototype_->clone());
448 char const* function_name = __func__;
451 [stub, retry, backoff,
452 function_name](gcsa::ListBackupOperationsRequest
const& r) {
454 retry->clone(), backoff->clone(),
true,
455 [stub](grpc::ClientContext& context,
456 gcsa::ListBackupOperationsRequest
const& request) {
457 return stub->ListBackupOperations(context, request);
461 [](gcsa::ListBackupOperationsResponse r) {
462 std::vector<google::longrunning::Operation> result(
463 r.operations().size());
464 auto& operations = *r.mutable_operations();
465 std::move(operations.begin(), operations.end(), result.begin());
471 ListDatabaseOperationsParams p)
override {
472 gcsa::ListDatabaseOperationsRequest request;
473 request.set_parent(p.instance.FullName());
474 request.set_filter(std::move(p.filter));
479 std::shared_ptr<RetryPolicy const>(retry_policy_prototype_->clone());
480 auto backoff = std::shared_ptr<BackoffPolicy const>(
481 backoff_policy_prototype_->clone());
483 char const* function_name = __func__;
486 [stub, retry, backoff,
487 function_name](gcsa::ListDatabaseOperationsRequest
const& r) {
489 retry->clone(), backoff->clone(),
true,
490 [stub](grpc::ClientContext& context,
491 gcsa::ListDatabaseOperationsRequest
const& request) {
492 return stub->ListDatabaseOperations(context, request);
496 [](gcsa::ListDatabaseOperationsResponse r) {
497 std::vector<google::longrunning::Operation> result(
498 r.operations().size());
499 auto& operations = *r.mutable_operations();
500 std::move(operations.begin(), operations.end(), result.begin());
506 future<StatusOr<gcsa::Database>> AwaitDatabase(
507 google::longrunning::Operation operation) {
508 promise<StatusOr<gcsa::Database>> pr;
509 auto f = pr.get_future();
513 [](std::shared_ptr<internal::DatabaseAdminStub> stub,
514 google::longrunning::Operation operation,
515 std::unique_ptr<PollingPolicy> polling_policy,
516 google::cloud::promise<StatusOr<gcsa::Database>> promise,
517 char const* location)
mutable {
518 auto result = internal::PollingLoop<
519 internal::PollingLoopResponseExtractor<gcsa::Database>>(
520 std::move(polling_policy),
521 [stub](grpc::ClientContext& context,
522 google::longrunning::GetOperationRequest
const& request) {
523 return stub->GetOperation(context, request);
525 std::move(operation), location);
531 promise.set_value(std::move(result));
533 stub_, std::move(operation), polling_policy_prototype_->clone(),
534 std::move(pr), __func__);
540 future<StatusOr<gcsa::UpdateDatabaseDdlMetadata>> AwaitUpdateDatabase(
541 google::longrunning::Operation operation) {
542 promise<StatusOr<gcsa::UpdateDatabaseDdlMetadata>> pr;
543 auto f = pr.get_future();
547 [](std::shared_ptr<internal::DatabaseAdminStub> stub,
548 google::longrunning::Operation operation,
549 std::unique_ptr<PollingPolicy> polling_policy,
550 promise<StatusOr<gcsa::UpdateDatabaseDdlMetadata>> promise,
551 char const* location)
mutable {
553 internal::PollingLoop<internal::PollingLoopMetadataExtractor<
554 gcsa::UpdateDatabaseDdlMetadata>>(
555 std::move(polling_policy),
557 grpc::ClientContext& context,
558 google::longrunning::GetOperationRequest
const& request) {
559 return stub->GetOperation(context, request);
561 std::move(operation), location);
567 promise.set_value(std::move(result));
569 stub_, std::move(operation), polling_policy_prototype_->clone(),
570 std::move(pr), __func__);
576 future<StatusOr<gcsa::Backup>> AwaitCreateBackup(
577 google::longrunning::Operation operation) {
580 std::shared_ptr<internal::DatabaseAdminStub> cancel_stub(stub_);
582 promise<StatusOr<gcsa::Backup>> pr([cancel_stub, operation]() {
583 grpc::ClientContext context;
584 google::longrunning::CancelOperationRequest request;
585 request.set_name(operation.name());
586 cancel_stub->CancelOperation(context, request);
588 auto f = pr.get_future();
592 [](std::shared_ptr<internal::DatabaseAdminStub> stub,
593 google::longrunning::Operation operation,
594 std::unique_ptr<PollingPolicy> polling_policy,
595 google::cloud::promise<StatusOr<gcsa::Backup>> promise,
596 char const* location)
mutable {
597 auto result = internal::PollingLoop<
598 internal::PollingLoopResponseExtractor<gcsa::Backup>>(
599 std::move(polling_policy),
600 [stub](grpc::ClientContext& context,
601 google::longrunning::GetOperationRequest
const& request) {
602 return stub->GetOperation(context, request);
604 std::move(operation), location);
610 promise.set_value(std::move(result));
612 stub_, std::move(operation), polling_policy_prototype_->clone(),
613 std::move(pr), __func__);
619 std::shared_ptr<internal::DatabaseAdminStub> stub_;
620 std::unique_ptr<RetryPolicy const> retry_policy_prototype_;
621 std::unique_ptr<BackoffPolicy const> backoff_policy_prototype_;
622 std::unique_ptr<PollingPolicy const> polling_policy_prototype_;
626 DatabaseAdminConnection::~DatabaseAdminConnection() =
default;
630 return std::make_shared<DatabaseAdminConnectionImpl>(
631 internal::CreateDefaultDatabaseAdminStub(options));
636 std::unique_ptr<BackoffPolicy> backoff_policy,
637 std::unique_ptr<PollingPolicy> polling_policy) {
638 return std::make_shared<DatabaseAdminConnectionImpl>(
639 internal::CreateDefaultDatabaseAdminStub(options),
640 std::move(retry_policy), std::move(backoff_policy),
641 std::move(polling_policy));
646 std::shared_ptr<DatabaseAdminConnection> MakeDatabaseAdminConnection(
647 std::shared_ptr<internal::DatabaseAdminStub> stub,
648 std::unique_ptr<RetryPolicy> retry_policy,
649 std::unique_ptr<BackoffPolicy> backoff_policy,
650 std::unique_ptr<PollingPolicy> polling_policy) {
651 return std::make_shared<DatabaseAdminConnectionImpl>(
652 std::move(stub), std::move(retry_policy), std::move(backoff_policy),
653 std::move(polling_policy));
google::cloud::internal::PaginationRange< google::spanner::admin::database::v1::Backup, google::spanner::admin::database::v1::ListBackupsRequest, google::spanner::admin::database::v1::ListBackupsResponse > ListBackupsRange
An input range to stream backups in Cloud Spanner instance.
google::cloud::internal::PaginationRange< google::longrunning::Operation, google::spanner::admin::database::v1::ListBackupOperationsRequest, google::spanner::admin::database::v1::ListBackupOperationsResponse > ListBackupOperationsRange
An input range to stream backup operations in Cloud Spanner instance.
Wrap the arguments for RestoreDatabase().
Wrap the arguments for ListDatabaseOperations().
Wrap the arguments for UpdateBackup().
Contains all the Cloud Spanner C++ client types and functions.
Wrap the arguments for CreateBackup().
google::cloud::ConnectionOptions< ConnectionOptionsTraits > ConnectionOptions
The options for Cloud Spanner connections.
Wrap the arguments for ListBackups().
google::cloud::internal::LimitedTimeRetryPolicy< google::cloud::Status, internal::SafeGrpcRetry > LimitedTimeRetryPolicy
A retry policy that limits based on time.
google::cloud::internal::ExponentialBackoffPolicy ExponentialBackoffPolicy
A truncated exponential backoff policy with randomized periods.
Wrap the arguments for GetBackup().
#define SPANNER_CLIENT_NS
google::cloud::internal::PaginationRange< google::spanner::admin::database::v1::Database, google::spanner::admin::database::v1::ListDatabasesRequest, google::spanner::admin::database::v1::ListDatabasesResponse > ListDatabaseRange
An input range to stream all the databases in a Cloud Spanner instance.
Wrap the arguments for DeleteBackup().
google::cloud::internal::PaginationRange< google::longrunning::Operation, google::spanner::admin::database::v1::ListDatabaseOperationsRequest, google::spanner::admin::database::v1::ListDatabaseOperationsResponse > ListDatabaseOperationsRange
An input range to stream database operations in Cloud Spanner instance.
std::shared_ptr< DatabaseAdminConnection > MakeDatabaseAdminConnection(ConnectionOptions const &options)
Returns an DatabaseAdminConnection object that can be used for interacting with Cloud Spanner's admin...
Wrap the arguments for ListBackupOperations().