Google Cloud Spanner C++ Client
A C++ Client Library for Google Cloud Spanner
instance_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 
17 namespace google {
18 namespace cloud {
19 namespace spanner {
20 inline namespace SPANNER_CLIENT_NS {
21 
22 StatusOr<google::spanner::admin::instance::v1::Instance>
23 InstanceAdminClient::GetInstance(Instance const& in) {
24  return conn_->GetInstance({in.FullName()});
25 }
26 
27 future<StatusOr<google::spanner::admin::instance::v1::Instance>>
28 InstanceAdminClient::CreateInstance(
29  google::spanner::admin::instance::v1::CreateInstanceRequest const&
30  request) {
31  return conn_->CreateInstance({request});
32 }
33 
34 future<StatusOr<google::spanner::admin::instance::v1::Instance>>
35 InstanceAdminClient::UpdateInstance(
36  google::spanner::admin::instance::v1::UpdateInstanceRequest const&
37  request) {
38  return conn_->UpdateInstance({request});
39 }
40 
41 Status InstanceAdminClient::DeleteInstance(Instance const& in) {
42  return conn_->DeleteInstance({in.FullName()});
43 }
44 
45 StatusOr<google::spanner::admin::instance::v1::InstanceConfig>
46 InstanceAdminClient::GetInstanceConfig(std::string const& name) {
47  return conn_->GetInstanceConfig({name});
48 }
49 
50 ListInstanceConfigsRange InstanceAdminClient::ListInstanceConfigs(
51  std::string project_id) {
52  return conn_->ListInstanceConfigs({std::move(project_id)});
53 }
54 
55 ListInstancesRange InstanceAdminClient::ListInstances(std::string project_id,
56  std::string filter) {
57  return conn_->ListInstances({std::move(project_id), std::move(filter)});
58 }
59 
60 StatusOr<google::iam::v1::Policy> InstanceAdminClient::GetIamPolicy(
61  Instance const& in) {
62  return conn_->GetIamPolicy({in.FullName()});
63 }
64 
65 StatusOr<google::iam::v1::Policy> InstanceAdminClient::SetIamPolicy(
66  Instance const& in, google::iam::v1::Policy policy) {
67  return conn_->SetIamPolicy({in.FullName(), std::move(policy)});
68 }
69 
70 StatusOr<google::iam::v1::Policy> InstanceAdminClient::SetIamPolicy(
71  Instance const& in, IamUpdater const& updater) {
72  auto const rerun_maximum_duration = std::chrono::minutes(15);
73  auto default_rerun_policy =
74  LimitedTimeTransactionRerunPolicy(rerun_maximum_duration).clone();
75 
76  auto const backoff_initial_delay = std::chrono::milliseconds(1000);
77  auto const backoff_maximum_delay = std::chrono::minutes(5);
78  auto const backoff_scaling = 2.0;
79  auto default_backoff_policy =
80  ExponentialBackoffPolicy(backoff_initial_delay, backoff_maximum_delay,
81  backoff_scaling)
82  .clone();
83 
84  return SetIamPolicy(in, updater, std::move(default_rerun_policy),
85  std::move(default_backoff_policy));
86 }
87 
88 StatusOr<google::iam::v1::Policy> InstanceAdminClient::SetIamPolicy(
89  Instance const& in, IamUpdater const& updater,
90  std::unique_ptr<TransactionRerunPolicy> rerun_policy,
91  std::unique_ptr<BackoffPolicy> backoff_policy) {
92  using RerunnablePolicy = internal::SafeTransactionRerun;
93 
94  Status last_status;
95  do {
96  auto current_policy = GetIamPolicy(in);
97  if (!current_policy) {
98  last_status = std::move(current_policy).status();
99  } else {
100  auto etag = current_policy->etag();
101  auto desired = updater(*current_policy);
102  if (!desired.has_value()) {
103  return current_policy;
104  }
105  desired->set_etag(std::move(etag));
106  auto result = SetIamPolicy(in, *std::move(desired));
107  if (RerunnablePolicy::IsOk(result.status())) {
108  return result;
109  }
110  last_status = std::move(result).status();
111  }
112  if (!rerun_policy->OnFailure(last_status)) break;
113  std::this_thread::sleep_for(backoff_policy->OnCompletion());
114  } while (!rerun_policy->IsExhausted());
115  return last_status;
116 }
117 
118 StatusOr<google::iam::v1::TestIamPermissionsResponse>
119 InstanceAdminClient::TestIamPermissions(Instance const& in,
120  std::vector<std::string> permissions) {
121  return conn_->TestIamPermissions({in.FullName(), std::move(permissions)});
122 }
123 
124 } // namespace SPANNER_CLIENT_NS
125 } // namespace spanner
126 } // namespace cloud
127 } // namespace google
google::cloud::internal::PaginationRange< google::spanner::admin::instance::v1::InstanceConfig, google::spanner::admin::instance::v1::ListInstanceConfigsRequest, google::spanner::admin::instance::v1::ListInstanceConfigsResponse > ListInstanceConfigsRange
An input range to stream all the instance configs in a Cloud project.
This class identifies a Cloud Spanner Instance.
Definition: instance.h:41
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.
google::cloud::internal::PaginationRange< google::spanner::admin::instance::v1::Instance, google::spanner::admin::instance::v1::ListInstancesRequest, google::spanner::admin::instance::v1::ListInstancesResponse > ListInstancesRange
An input range to stream all the instances in a Cloud project.
google::cloud::internal::ExponentialBackoffPolicy ExponentialBackoffPolicy
A truncated exponential backoff policy with randomized periods.
#define SPANNER_CLIENT_NS
Definition: version.h:22
std::function< optional< google::iam::v1::Policy >(google::iam::v1::Policy)> IamUpdater
Definition: iam_updater.h:29
std::string FullName() const
Returns the fully qualified instance name as a string of the form: "projects/<project-id>/instances/<...
Definition: instance.cc:27