Google Cloud Spanner C++ Client
A C++ Client Library for Google Cloud Spanner
database_admin_client.cc
Go to the documentation of this file.
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
16 #include "google/cloud/spanner/internal/time_utils.h"
17 #include <algorithm>
18 
19 namespace google {
20 namespace cloud {
21 namespace spanner {
22 inline namespace SPANNER_CLIENT_NS {
23 
24 namespace gcsa = ::google::spanner::admin::database::v1;
25 
26 DatabaseAdminClient::DatabaseAdminClient(ConnectionOptions const& options)
27  : conn_(MakeDatabaseAdminConnection(options)) {}
28 
29 future<StatusOr<gcsa::Database>> DatabaseAdminClient::CreateDatabase(
30  Database db, std::vector<std::string> extra_statements) {
31  return conn_->CreateDatabase({std::move(db), std::move(extra_statements)});
32 }
33 
34 StatusOr<gcsa::Database> DatabaseAdminClient::GetDatabase(Database db) {
35  return conn_->GetDatabase({std::move(db)});
36 }
37 
38 StatusOr<gcsa::GetDatabaseDdlResponse> DatabaseAdminClient::GetDatabaseDdl(
39  Database db) {
40  return conn_->GetDatabaseDdl({std::move(db)});
41 }
42 
43 future<StatusOr<gcsa::UpdateDatabaseDdlMetadata>>
45  std::vector<std::string> statements) {
46  return conn_->UpdateDatabase({std::move(db), std::move(statements)});
47 }
48 
50  return conn_->ListDatabases({std::move(in)});
51 }
52 
54  return conn_->DropDatabase({std::move(db)});
55 }
56 
57 future<StatusOr<gcsa::Database>> DatabaseAdminClient::RestoreDatabase(
58  Database db, Backup const& backup) {
59  return conn_->RestoreDatabase({std::move(db), backup.FullName()});
60 }
61 
62 future<StatusOr<gcsa::Database>> DatabaseAdminClient::RestoreDatabase(
63  Database db, google::spanner::admin::database::v1::Backup const& backup) {
64  return conn_->RestoreDatabase({std::move(db), backup.name()});
65 }
66 
67 StatusOr<google::iam::v1::Policy> DatabaseAdminClient::GetIamPolicy(
68  Database db) {
69  return conn_->GetIamPolicy({std::move(db)});
70 }
71 
72 StatusOr<google::iam::v1::Policy> DatabaseAdminClient::SetIamPolicy(
73  Database db, google::iam::v1::Policy policy) {
74  return conn_->SetIamPolicy({std::move(db), std::move(policy)});
75 }
76 
77 StatusOr<google::iam::v1::Policy> DatabaseAdminClient::SetIamPolicy(
78  Database const& db, IamUpdater const& updater) {
79  auto const rerun_maximum_duration = std::chrono::minutes(15);
80  auto default_rerun_policy =
81  LimitedTimeTransactionRerunPolicy(rerun_maximum_duration).clone();
82 
83  auto const backoff_initial_delay = std::chrono::milliseconds(1000);
84  auto const backoff_maximum_delay = std::chrono::minutes(5);
85  auto const backoff_scaling = 2.0;
86  auto default_backoff_policy =
87  ExponentialBackoffPolicy(backoff_initial_delay, backoff_maximum_delay,
88  backoff_scaling)
89  .clone();
90 
91  return SetIamPolicy(db, updater, std::move(default_rerun_policy),
92  std::move(default_backoff_policy));
93 }
94 
95 StatusOr<google::iam::v1::Policy> DatabaseAdminClient::SetIamPolicy(
96  Database const& db, IamUpdater const& updater,
97  std::unique_ptr<TransactionRerunPolicy> rerun_policy,
98  std::unique_ptr<BackoffPolicy> backoff_policy) {
99  using RerunnablePolicy = internal::SafeTransactionRerun;
100 
101  Status last_status;
102  do {
103  auto current_policy = GetIamPolicy(db);
104  if (!current_policy) {
105  last_status = std::move(current_policy).status();
106  } else {
107  auto etag = current_policy->etag();
108  auto desired = updater(*current_policy);
109  if (!desired.has_value()) {
110  return current_policy;
111  }
112  desired->set_etag(std::move(etag));
113  auto result = SetIamPolicy(db, *std::move(desired));
114  if (RerunnablePolicy::IsOk(result.status())) {
115  return result;
116  }
117  last_status = std::move(result).status();
118  }
119  if (!rerun_policy->OnFailure(last_status)) break;
120  std::this_thread::sleep_for(backoff_policy->OnCompletion());
121  } while (!rerun_policy->IsExhausted());
122  return last_status;
123 }
124 
125 StatusOr<google::iam::v1::TestIamPermissionsResponse>
127  std::vector<std::string> permissions) {
128  return conn_->TestIamPermissions({std::move(db), std::move(permissions)});
129 }
130 
131 future<StatusOr<gcsa::Backup>> DatabaseAdminClient::CreateBackup(
132  Database db, std::string backup_id,
133  std::chrono::system_clock::time_point expire_time) {
134  return conn_->CreateBackup(
135  {std::move(db), std::move(backup_id), expire_time});
136 }
137 
138 StatusOr<gcsa::Backup> DatabaseAdminClient::GetBackup(Backup const& backup) {
139  return conn_->GetBackup({backup.FullName()});
140 }
141 
143  google::spanner::admin::database::v1::Backup const& backup) {
144  return conn_->DeleteBackup({backup.name()});
145 }
146 
148  return conn_->DeleteBackup({backup.FullName()});
149 }
150 
152  std::string filter) {
153  return conn_->ListBackups({std::move(in), std::move(filter)});
154 }
155 
157  google::spanner::admin::database::v1::Backup const& backup,
158  std::chrono::system_clock::time_point const& expire_time) {
159  auto proto_expire_time =
160  internal::ConvertTimePointToProtoTimestamp(expire_time);
161  if (!proto_expire_time) {
162  return proto_expire_time.status();
163  }
164  google::spanner::admin::database::v1::UpdateBackupRequest request;
165  request.mutable_backup()->set_name(backup.name());
166  *request.mutable_backup()->mutable_expire_time() = *proto_expire_time;
167  request.mutable_update_mask()->add_paths("expire_time");
168  return conn_->UpdateBackup({request});
169 }
170 
172  Backup const& backup,
173  std::chrono::system_clock::time_point const& expire_time) {
174  auto proto_expire_time =
175  internal::ConvertTimePointToProtoTimestamp(expire_time);
176  if (!proto_expire_time) {
177  return proto_expire_time.status();
178  }
179  google::spanner::admin::database::v1::UpdateBackupRequest request;
180  request.mutable_backup()->set_name(backup.FullName());
181  *request.mutable_backup()->mutable_expire_time() = *proto_expire_time;
182  request.mutable_update_mask()->add_paths("expire_time");
183  return conn_->UpdateBackup({request});
184 }
185 
187  Instance in, std::string filter) {
188  return conn_->ListBackupOperations({std::move(in), std::move(filter)});
189 }
190 
192  Instance in, std::string filter) {
193  return conn_->ListDatabaseOperations({std::move(in), std::move(filter)});
194 }
195 
196 } // namespace SPANNER_CLIENT_NS
197 } // namespace spanner
198 } // namespace cloud
199 } // namespace google
This class identifies a Cloud Spanner Backup.
Definition: backup.h:38
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.
future< StatusOr< google::spanner::admin::database::v1::Database > > RestoreDatabase(Database db, Backup const &backup)
Create a new database by restoring from a completed backup.
Status DeleteBackup(google::spanner::admin::database::v1::Backup const &backup)
Deletes a pending or completed Backup.
ListDatabaseRange ListDatabases(Instance in)
List all the databases in a give project and instance.
This class identifies a Cloud Spanner Instance.
Definition: instance.h:41
StatusOr< google::spanner::admin::database::v1::Backup > UpdateBackupExpireTime(google::spanner::admin::database::v1::Backup const &backup, std::chrono::system_clock::time_point const &expire_time)
Update backup's expire_time.
StatusOr< google::iam::v1::Policy > SetIamPolicy(Database db, google::iam::v1::Policy policy)
Set the IAM policy for the given database.
future< StatusOr< google::spanner::admin::database::v1::UpdateDatabaseDdlMetadata > > UpdateDatabase(Database db, std::vector< std::string > statements)
Updates the database using a series of DDL statements.
google::cloud::internal::LimitedTimeRetryPolicy< google::cloud::Status, internal::SafeTransactionRerun > LimitedTimeTransactionRerunPolicy
A transaction rerun policy that limits the duration of the rerun loop.
Definition: retry_policy.h:80
Contains all the Cloud Spanner C++ client types and functions.
StatusOr< google::spanner::admin::database::v1::Backup > GetBackup(Backup const &backup)
Retrieve metadata information about a Backup.
StatusOr< google::spanner::admin::database::v1::GetDatabaseDdlResponse > GetDatabaseDdl(Database db)
Retrieve a database schema.
StatusOr< google::spanner::admin::database::v1::Database > GetDatabase(Database db)
Retrieve metadata information about a database.
ListBackupOperationsRange ListBackupOperations(Instance in, std::string filter={})
List all the backup operations in a given project and instance that match the filter.
Status DropDatabase(Database db)
Drops (deletes) an existing Cloud Spanner database.
google::cloud::ConnectionOptions< ConnectionOptionsTraits > ConnectionOptions
The options for Cloud Spanner connections.
future< StatusOr< google::spanner::admin::database::v1::Database > > CreateDatabase(Database db, std::vector< std::string > extra_statements={})
Creates a new Cloud Spanner database in the given project and instance.
StatusOr< google::iam::v1::Policy > GetIamPolicy(Database db)
Gets the IAM policy for a database.
google::cloud::internal::ExponentialBackoffPolicy ExponentialBackoffPolicy
A truncated exponential backoff policy with randomized periods.
#define SPANNER_CLIENT_NS
Definition: version.h:22
StatusOr< google::iam::v1::TestIamPermissionsResponse > TestIamPermissions(Database db, std::vector< std::string > permissions)
Get the subset of the permissions the caller has on the given database.
ListDatabaseOperationsRange ListDatabaseOperations(Instance in, std::string filter={})
List all the database operations in a given project and instance that match the filter.
ListBackupsRange ListBackups(Instance in, std::string filter={})
List all the backups in a given project and instance that match the filter.
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.
std::function< optional< google::iam::v1::Policy >(google::iam::v1::Policy)> IamUpdater
Definition: iam_updater.h:29
This class identifies a Cloud Spanner Database.
Definition: database.h:43
std::string FullName() const
Returns the fully qualified backup name as a string of the form: "projects/<project-id>/instances/<in...
Definition: backup.cc:25
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...
future< StatusOr< google::spanner::admin::database::v1::Backup > > CreateBackup(Database db, std::string backup_id, std::chrono::system_clock::time_point expire_time)
Creates a new Cloud Spanner backup for the given database.