17 #include "google/cloud/spanner/internal/polling_loop.h" 18 #include "google/cloud/spanner/internal/retry_loop.h" 25 namespace gcsa = ::google::spanner::admin::instance::v1;
26 namespace giam = ::google::iam::v1;
30 std::unique_ptr<RetryPolicy> DefaultInstanceAdminRetryPolicy() {
32 std::chrono::minutes(30))
36 std::unique_ptr<BackoffPolicy> DefaultInstanceAdminBackoffPolicy() {
37 auto constexpr kBackoffScaling = 2.0;
39 std::chrono::seconds(1), std::chrono::minutes(5), kBackoffScaling)
43 std::unique_ptr<PollingPolicy> DefaultInstanceAdminPollingPolicy() {
44 auto constexpr kBackoffScaling = 2.0;
45 return GenericPollingPolicy<>(
48 std::chrono::minutes(5), kBackoffScaling))
52 class InstanceAdminConnectionImpl :
public InstanceAdminConnection {
54 InstanceAdminConnectionImpl(std::shared_ptr<internal::InstanceAdminStub> stub,
55 std::unique_ptr<RetryPolicy> retry_policy,
56 std::unique_ptr<BackoffPolicy> backoff_policy,
57 std::unique_ptr<PollingPolicy> polling_policy)
58 : stub_(std::move(stub)),
59 retry_policy_prototype_(std::move(retry_policy)),
60 backoff_policy_prototype_(std::move(backoff_policy)),
61 polling_policy_prototype_(std::move(polling_policy)) {}
63 explicit InstanceAdminConnectionImpl(
64 std::shared_ptr<internal::InstanceAdminStub> stub)
65 : InstanceAdminConnectionImpl(std::move(stub),
66 DefaultInstanceAdminRetryPolicy(),
67 DefaultInstanceAdminBackoffPolicy(),
68 DefaultInstanceAdminPollingPolicy()) {}
70 ~InstanceAdminConnectionImpl()
override =
default;
72 StatusOr<gcsa::Instance> GetInstance(GetInstanceParams gip)
override {
73 gcsa::GetInstanceRequest request;
74 request.set_name(std::move(gip.instance_name));
75 return internal::RetryLoop(
76 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
78 [
this](grpc::ClientContext& context,
79 gcsa::GetInstanceRequest
const& request) {
80 return stub_->GetInstance(context, request);
85 future<StatusOr<gcsa::Instance>> CreateInstance(
86 CreateInstanceParams p)
override {
87 auto operation = RetryLoop(
88 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
90 [
this](grpc::ClientContext& context,
91 gcsa::CreateInstanceRequest
const& request) {
92 return stub_->CreateInstance(context, request);
96 return google::cloud::make_ready_future(
97 StatusOr<gcsa::Instance>(operation.status()));
100 return AwaitCreateOrUpdateInstance(*std::move(operation));
103 future<StatusOr<gcsa::Instance>> UpdateInstance(
104 UpdateInstanceParams p)
override {
105 auto operation = RetryLoop(
106 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
108 [
this](grpc::ClientContext& context,
109 gcsa::UpdateInstanceRequest
const& request) {
110 return stub_->UpdateInstance(context, request);
112 p.request, __func__);
114 return google::cloud::make_ready_future(
115 StatusOr<gcsa::Instance>(operation.status()));
118 return AwaitCreateOrUpdateInstance(*std::move(operation));
121 Status DeleteInstance(DeleteInstanceParams p)
override {
122 gcsa::DeleteInstanceRequest request;
123 request.set_name(std::move(p.instance_name));
124 return internal::RetryLoop(
125 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
127 [
this](grpc::ClientContext& context,
128 gcsa::DeleteInstanceRequest
const& request) {
129 return stub_->DeleteInstance(context, request);
134 StatusOr<gcsa::InstanceConfig> GetInstanceConfig(
135 GetInstanceConfigParams p)
override {
136 gcsa::GetInstanceConfigRequest request;
137 request.set_name(std::move(p.instance_config_name));
138 return internal::RetryLoop(
139 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
141 [
this](grpc::ClientContext& context,
142 gcsa::GetInstanceConfigRequest
const& request) {
143 return stub_->GetInstanceConfig(context, request);
149 ListInstanceConfigsParams params)
override {
150 gcsa::ListInstanceConfigsRequest request;
151 request.set_parent(
"projects/" + params.project_id);
152 request.clear_page_token();
156 auto retry = std::shared_ptr<RetryPolicy>(retry_policy_prototype_->clone());
158 std::shared_ptr<BackoffPolicy>(backoff_policy_prototype_->clone());
160 char const* function_name = __func__;
163 [stub, retry, backoff,
164 function_name](gcsa::ListInstanceConfigsRequest
const& r) {
166 retry->clone(), backoff->clone(),
true,
167 [stub](grpc::ClientContext& context,
168 gcsa::ListInstanceConfigsRequest
const& request) {
169 return stub->ListInstanceConfigs(context, request);
173 [](gcsa::ListInstanceConfigsResponse r) {
174 std::vector<gcsa::InstanceConfig> result(r.instance_configs().size());
175 auto& configs = *r.mutable_instance_configs();
176 std::move(configs.begin(), configs.end(), result.begin());
182 gcsa::ListInstancesRequest request;
183 request.set_parent(
"projects/" + params.project_id);
184 request.set_filter(std::move(params.filter));
185 request.clear_page_token();
189 auto retry = std::shared_ptr<RetryPolicy>(retry_policy_prototype_->clone());
191 std::shared_ptr<BackoffPolicy>(backoff_policy_prototype_->clone());
193 char const* function_name = __func__;
196 [stub, retry, backoff,
197 function_name](gcsa::ListInstancesRequest
const& r) {
199 retry->clone(), backoff->clone(),
true,
200 [stub](grpc::ClientContext& context,
201 gcsa::ListInstancesRequest
const& request) {
202 return stub->ListInstances(context, request);
206 [](gcsa::ListInstancesResponse r) {
207 std::vector<gcsa::Instance> result(r.instances().size());
208 auto& instances = *r.mutable_instances();
209 std::move(instances.begin(), instances.end(), result.begin());
214 StatusOr<giam::Policy> GetIamPolicy(GetIamPolicyParams p)
override {
215 google::iam::v1::GetIamPolicyRequest request;
216 request.set_resource(std::move(p.instance_name));
218 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
220 [
this](grpc::ClientContext& context,
221 giam::GetIamPolicyRequest
const& request) {
222 return stub_->GetIamPolicy(context, request);
227 StatusOr<giam::Policy> SetIamPolicy(SetIamPolicyParams p)
override {
228 google::iam::v1::SetIamPolicyRequest request;
229 request.set_resource(std::move(p.instance_name));
230 *request.mutable_policy() = std::move(p.policy);
231 bool is_idempotent = !request.policy().etag().empty();
233 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
235 [
this](grpc::ClientContext& context,
236 giam::SetIamPolicyRequest
const& request) {
237 return stub_->SetIamPolicy(context, request);
242 StatusOr<google::iam::v1::TestIamPermissionsResponse> TestIamPermissions(
243 TestIamPermissionsParams p)
override {
244 google::iam::v1::TestIamPermissionsRequest request;
245 request.set_resource(std::move(p.instance_name));
246 for (
auto& permission : p.permissions) {
247 request.add_permissions(std::move(permission));
250 retry_policy_prototype_->clone(), backoff_policy_prototype_->clone(),
252 [
this](grpc::ClientContext& context,
253 giam::TestIamPermissionsRequest
const& request) {
254 return stub_->TestIamPermissions(context, request);
260 future<StatusOr<gcsa::Instance>> AwaitCreateOrUpdateInstance(
261 google::longrunning::Operation operation) {
262 promise<StatusOr<gcsa::Instance>> pr;
263 auto f = pr.get_future();
267 [](std::shared_ptr<internal::InstanceAdminStub> stub,
268 google::longrunning::Operation operation,
269 std::unique_ptr<PollingPolicy> polling_policy,
270 google::cloud::promise<StatusOr<gcsa::Instance>> promise,
271 char const* location)
mutable {
272 auto result = internal::PollingLoop<
273 internal::PollingLoopResponseExtractor<gcsa::Instance>>(
274 std::move(polling_policy),
275 [stub](grpc::ClientContext& context,
276 google::longrunning::GetOperationRequest
const& request) {
277 return stub->GetOperation(context, request);
279 std::move(operation), location);
285 promise.set_value(std::move(result));
287 stub_, std::move(operation), polling_policy_prototype_->clone(),
288 std::move(pr), __func__);
293 std::shared_ptr<internal::InstanceAdminStub> stub_;
294 std::unique_ptr<RetryPolicy const> retry_policy_prototype_;
295 std::unique_ptr<BackoffPolicy const> backoff_policy_prototype_;
296 std::unique_ptr<PollingPolicy const> polling_policy_prototype_;
300 InstanceAdminConnection::~InstanceAdminConnection() =
default;
304 return internal::MakeInstanceAdminConnection(
305 internal::CreateDefaultInstanceAdminStub(options), options);
310 std::unique_ptr<BackoffPolicy> backoff_policy,
311 std::unique_ptr<PollingPolicy> polling_policy) {
312 return internal::MakeInstanceAdminConnection(
313 internal::CreateDefaultInstanceAdminStub(options),
314 std::move(retry_policy), std::move(backoff_policy),
315 std::move(polling_policy));
320 std::shared_ptr<InstanceAdminConnection> MakeInstanceAdminConnection(
321 std::shared_ptr<internal::InstanceAdminStub> base_stub,
323 return std::make_shared<InstanceAdminConnectionImpl>(std::move(base_stub));
326 std::shared_ptr<InstanceAdminConnection> MakeInstanceAdminConnection(
327 std::shared_ptr<internal::InstanceAdminStub> base_stub,
328 std::unique_ptr<RetryPolicy> retry_policy,
329 std::unique_ptr<BackoffPolicy> backoff_policy,
330 std::unique_ptr<PollingPolicy> polling_policy) {
331 return std::make_shared<InstanceAdminConnectionImpl>(
332 std::move(base_stub), std::move(retry_policy), std::move(backoff_policy),
333 std::move(polling_policy));
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.
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::ConnectionOptions< ConnectionOptionsTraits > ConnectionOptions
The options for Cloud Spanner connections.
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.
#define SPANNER_CLIENT_NS
std::shared_ptr< InstanceAdminConnection > MakeInstanceAdminConnection(ConnectionOptions const &options)
Returns an InstanceAdminConnection object that can be used for interacting with Cloud Spanner's admin...