11#include < ydb-cpp-sdk/client/cms/cms.h>
22
3+ #include < src/client/common_client/impl/client.h>
34#include < src/api/grpc/ydb_cms_v1.grpc.pb.h>
45#include < src/api/protos/ydb_cms.pb.h>
5- #include < src/client/common_client/impl/client.h>
6+
7+ #define INCLUDE_YDB_INTERNAL_H
8+ #include < src/client/impl/ydb_internal/make_request/make.h>
9+ #undef INCLUDE_YDB_INTERNAL_H
610
711namespace NYdb ::inline V3::NCms {
812
@@ -25,6 +29,82 @@ namespace {
2529 return EState::StateUnspecified;
2630 }
2731 }
32+
33+ void SerializeToImpl (
34+ const TResourcesKind& resourcesKind,
35+ const TSchemaOperationQuotas& schemaQuotas,
36+ const TDatabaseQuotas& dbQuotas,
37+ const TScaleRecommenderPolicies& scaleRecommenderPolicies,
38+ Ydb::Cms::CreateDatabaseRequest& out)
39+ {
40+ if (std::holds_alternative<NCms::TResources>(resourcesKind)) {
41+ const auto & resources = std::get<NCms::TResources>(resourcesKind);
42+ for (const auto & storageUnit : resources.StorageUnits ) {
43+ auto * protoUnit = out.mutable_resources ()->add_storage_units ();
44+ protoUnit->set_unit_kind (storageUnit.UnitKind );
45+ protoUnit->set_count (storageUnit.Count );
46+ }
47+ for (const auto & computationalUnit : resources.ComputationalUnits ) {
48+ auto * protoUnit = out.mutable_resources ()->add_computational_units ();
49+ protoUnit->set_unit_kind (computationalUnit.UnitKind );
50+ protoUnit->set_count (computationalUnit.Count );
51+ protoUnit->set_availability_zone (computationalUnit.AvailabilityZone );
52+ }
53+ } else if (std::holds_alternative<NCms::TSharedResources>(resourcesKind)) {
54+ const auto & resources = std::get<NCms::TSharedResources>(resourcesKind);
55+ for (const auto & storageUnit : resources.StorageUnits ) {
56+ auto * protoUnit = out.mutable_shared_resources ()->add_storage_units ();
57+ protoUnit->set_unit_kind (storageUnit.UnitKind );
58+ protoUnit->set_count (storageUnit.Count );
59+ }
60+ for (const auto & computationalUnit : resources.ComputationalUnits ) {
61+ auto * protoUnit = out.mutable_shared_resources ()->add_computational_units ();
62+ protoUnit->set_unit_kind (computationalUnit.UnitKind );
63+ protoUnit->set_count (computationalUnit.Count );
64+ protoUnit->set_availability_zone (computationalUnit.AvailabilityZone );
65+ }
66+ } else if (std::holds_alternative<NCms::TServerlessResources>(resourcesKind)) {
67+ const auto & resources = std::get<NCms::TServerlessResources>(resourcesKind);
68+ out.mutable_serverless_resources ()->set_shared_database_path (resources.SharedDatabasePath );
69+ } else if (std::holds_alternative<std::monostate>(resourcesKind)) {
70+ out.clear_resources_kind ();
71+ }
72+
73+ for (const auto & quota : schemaQuotas.LeakyBucketQuotas ) {
74+ auto protoQuota = out.mutable_schema_operation_quotas ()->add_leaky_bucket_quotas ();
75+ protoQuota->set_bucket_seconds (quota.BucketSeconds );
76+ protoQuota->set_bucket_size (quota.BucketSize );
77+ }
78+
79+ out.mutable_database_quotas ()->set_data_size_hard_quota (dbQuotas.DataSizeHardQuota );
80+ out.mutable_database_quotas ()->set_data_size_soft_quota (dbQuotas.DataSizeSoftQuota );
81+ out.mutable_database_quotas ()->set_data_stream_shards_quota (dbQuotas.DataStreamShardsQuota );
82+ out.mutable_database_quotas ()->set_data_stream_reserved_storage_quota (dbQuotas.DataStreamReservedStorageQuota );
83+ out.mutable_database_quotas ()->set_ttl_min_run_internal_seconds (dbQuotas.TtlMinRunInternalSeconds );
84+
85+ for (const auto & quota : dbQuotas.StorageQuotas ) {
86+ auto protoQuota = out.mutable_database_quotas ()->add_storage_quotas ();
87+ protoQuota->set_unit_kind (quota.UnitKind );
88+ protoQuota->set_data_size_hard_quota (quota.DataSizeHardQuota );
89+ protoQuota->set_data_size_soft_quota (quota.DataSizeSoftQuota );
90+ }
91+
92+ for (const auto & policy : scaleRecommenderPolicies.Policies ) {
93+ auto * protoPolicy = out.mutable_scale_recommender_policies ()->add_policies ();
94+ if (std::holds_alternative<NCms::TTargetTrackingPolicy>(policy.Policy )) {
95+ const auto & targetTracking = std::get<NCms::TTargetTrackingPolicy>(policy.Policy );
96+ auto * protoTargetTracking = protoPolicy->mutable_target_tracking_policy ();
97+ if (std::holds_alternative<NCms::TTargetTrackingPolicy::TAverageCpuUtilizationPercent>(targetTracking.Target )) {
98+ const auto & target = std::get<NCms::TTargetTrackingPolicy::TAverageCpuUtilizationPercent>(targetTracking.Target );
99+ protoTargetTracking->set_average_cpu_utilization_percent (target);
100+ } else if (std::holds_alternative<std::monostate>(targetTracking.Target )) {
101+ protoTargetTracking->clear_target ();
102+ }
103+ } else if (std::holds_alternative<std::monostate>(policy.Policy )) {
104+ protoPolicy->clear_policy ();
105+ }
106+ }
107+ }
28108} // anonymous namespace
29109
30110TListDatabasesResult::TListDatabasesResult (TStatus&& status, const Ydb::Cms::ListDatabasesResult& proto)
@@ -93,6 +173,7 @@ TTargetTrackingPolicy::TTargetTrackingPolicy(const Ydb::Cms::ScaleRecommenderPol
93173 Target = proto.average_cpu_utilization_percent ();
94174 break ;
95175 case Ydb::Cms::ScaleRecommenderPolicies_ScaleRecommenderPolicy_TargetTrackingPolicy::TARGET_NOT_SET:
176+ Target = std::monostate ();
96177 break ;
97178 }
98179}
@@ -104,6 +185,7 @@ TScaleRecommenderPolicy::TScaleRecommenderPolicy(const Ydb::Cms::ScaleRecommende
104185 Policy = proto.target_tracking_policy ();
105186 break ;
106187 case Ydb::Cms::ScaleRecommenderPolicies_ScaleRecommenderPolicy::POLICY_NOT_SET:
188+ Policy = std::monostate ();
107189 break ;
108190 }
109191}
@@ -134,6 +216,7 @@ TGetDatabaseStatusResult::TGetDatabaseStatusResult(TStatus&& status, const Ydb::
134216 ResourcesKind_ = proto.serverless_resources ();
135217 break ;
136218 case Ydb::Cms::GetDatabaseStatusResult::RESOURCES_KIND_NOT_SET:
219+ ResourcesKind_ = std::monostate ();
137220 break ;
138221 }
139222}
@@ -146,7 +229,7 @@ EState TGetDatabaseStatusResult::GetState() const {
146229 return State_;
147230}
148231
149- const std::variant<TResources, TSharedResources, TServerlessResources> & TGetDatabaseStatusResult::GetResourcesKind () const {
232+ const TResourcesKind & TGetDatabaseStatusResult::GetResourcesKind () const {
150233 return ResourcesKind_;
151234}
152235
@@ -176,67 +259,32 @@ const TScaleRecommenderPolicies& TGetDatabaseStatusResult::GetScaleRecommenderPo
176259
177260void TGetDatabaseStatusResult::SerializeTo (Ydb::Cms::CreateDatabaseRequest& request) const {
178261 request.set_path (Path_);
179- if (std::holds_alternative<NCms::TResources>(ResourcesKind_)) {
180- const auto & resources = std::get<NCms::TResources>(ResourcesKind_);
181- for (const auto & storageUnit : resources.StorageUnits ) {
182- auto * protoUnit = request.mutable_resources ()->add_storage_units ();
183- protoUnit->set_unit_kind (storageUnit.UnitKind );
184- protoUnit->set_count (storageUnit.Count );
185- }
186- for (const auto & computationalUnit : resources.ComputationalUnits ) {
187- auto * protoUnit = request.mutable_resources ()->add_computational_units ();
188- protoUnit->set_unit_kind (computationalUnit.UnitKind );
189- protoUnit->set_count (computationalUnit.Count );
190- protoUnit->set_availability_zone (computationalUnit.AvailabilityZone );
191- }
192- } else if (std::holds_alternative<NCms::TSharedResources>(ResourcesKind_)) {
193- const auto & resources = std::get<NCms::TSharedResources>(ResourcesKind_);
194- for (const auto & storageUnit : resources.StorageUnits ) {
195- auto * protoUnit = request.mutable_shared_resources ()->add_storage_units ();
196- protoUnit->set_unit_kind (storageUnit.UnitKind );
197- protoUnit->set_count (storageUnit.Count );
198- }
199- for (const auto & computationalUnit : resources.ComputationalUnits ) {
200- auto * protoUnit = request.mutable_shared_resources ()->add_computational_units ();
201- protoUnit->set_unit_kind (computationalUnit.UnitKind );
202- protoUnit->set_count (computationalUnit.Count );
203- protoUnit->set_availability_zone (computationalUnit.AvailabilityZone );
204- }
205- } else if (std::holds_alternative<NCms::TServerlessResources>(ResourcesKind_)) {
206- const auto & resources = std::get<NCms::TServerlessResources>(ResourcesKind_);
207- request.mutable_serverless_resources ()->set_shared_database_path (resources.SharedDatabasePath );
208- }
209-
210- for (const auto & quota : SchemaOperationQuotas_.LeakyBucketQuotas ) {
211- auto protoQuota = request.mutable_schema_operation_quotas ()->add_leaky_bucket_quotas ();
212- protoQuota->set_bucket_seconds (quota.BucketSeconds );
213- protoQuota->set_bucket_size (quota.BucketSize );
214- }
262+ SerializeToImpl (ResourcesKind_, SchemaOperationQuotas_, DatabaseQuotas_, ScaleRecommenderPolicies_, request);
263+ }
215264
216- request.mutable_database_quotas ()->set_data_size_hard_quota (DatabaseQuotas_.DataSizeHardQuota );
217- request.mutable_database_quotas ()->set_data_size_soft_quota (DatabaseQuotas_.DataSizeSoftQuota );
218- request.mutable_database_quotas ()->set_data_stream_shards_quota (DatabaseQuotas_.DataStreamShardsQuota );
219- request.mutable_database_quotas ()->set_data_stream_reserved_storage_quota (DatabaseQuotas_.DataStreamReservedStorageQuota );
220- request.mutable_database_quotas ()->set_ttl_min_run_internal_seconds (DatabaseQuotas_.TtlMinRunInternalSeconds );
221-
222- for (const auto & quota : DatabaseQuotas_.StorageQuotas ) {
223- auto protoQuota = request.mutable_database_quotas ()->add_storage_quotas ();
224- protoQuota->set_unit_kind (quota.UnitKind );
225- protoQuota->set_data_size_hard_quota (quota.DataSizeHardQuota );
226- protoQuota->set_data_size_soft_quota (quota.DataSizeSoftQuota );
227- }
265+ TCreateDatabaseSettings::TCreateDatabaseSettings (const Ydb::Cms::CreateDatabaseRequest& request)
266+ : SchemaOperationQuotas_(request.schema_operation_quotas())
267+ , DatabaseQuotas_(request.database_quotas())
268+ , ScaleRecommenderPolicies_(request.scale_recommender_policies())
269+ {
270+ switch (request.resources_kind_case ()) {
271+ case Ydb::Cms::CreateDatabaseRequest::kResources :
272+ ResourcesKind_ = TResources (request.resources ());
273+ break ;
274+ case Ydb::Cms::CreateDatabaseRequest::kSharedResources :
275+ ResourcesKind_ = TSharedResources (request.shared_resources ());
276+ break ;
277+ case Ydb::Cms::CreateDatabaseRequest::kServerlessResources :
278+ ResourcesKind_ = request.serverless_resources ();
279+ break ;
280+ case Ydb::Cms::CreateDatabaseRequest::RESOURCES_KIND_NOT_SET:
281+ ResourcesKind_ = std::monostate ();
282+ break ;
283+ }
284+ }
228285
229- for (const auto & policy : ScaleRecommenderPolicies_.Policies ) {
230- auto * protoPolicy = request.mutable_scale_recommender_policies ()->add_policies ();
231- if (std::holds_alternative<NCms::TTargetTrackingPolicy>(policy.Policy )) {
232- const auto & targetTracking = std::get<NCms::TTargetTrackingPolicy>(policy.Policy );
233- auto * protoTargetTracking = protoPolicy->mutable_target_tracking_policy ();
234- if (std::holds_alternative<NCms::TTargetTrackingPolicy::TAverageCpuUtilizationPercent>(targetTracking.Target )) {
235- const auto & target = std::get<NCms::TTargetTrackingPolicy::TAverageCpuUtilizationPercent>(targetTracking.Target );
236- protoTargetTracking->set_average_cpu_utilization_percent (target);
237- }
238- }
239- }
286+ void TCreateDatabaseSettings::SerializeTo (Ydb::Cms::CreateDatabaseRequest& request) const {
287+ SerializeToImpl (ResourcesKind_, SchemaOperationQuotas_, DatabaseQuotas_, ScaleRecommenderPolicies_, request);
240288}
241289
242290class TCmsClient ::TImpl : public TClientImplCommon<TCmsClient::TImpl> {
@@ -246,7 +294,7 @@ class TCmsClient::TImpl : public TClientImplCommon<TCmsClient::TImpl> {
246294 { }
247295
248296 TAsyncListDatabasesResult ListDatabases (const TListDatabasesSettings& settings) {
249- Ydb::Cms::ListDatabasesRequest request ;
297+ auto request = MakeOperationRequest< Ydb::Cms::ListDatabasesRequest>(settings) ;
250298
251299 auto promise = NThreading::NewPromise<TListDatabasesResult>();
252300
@@ -272,7 +320,7 @@ class TCmsClient::TImpl : public TClientImplCommon<TCmsClient::TImpl> {
272320 }
273321
274322 TAsyncGetDatabaseStatusResult GetDatabaseStatus (const std::string& path, const TGetDatabaseStatusSettings& settings) {
275- Ydb::Cms::GetDatabaseStatusRequest request ;
323+ auto request = MakeOperationRequest< Ydb::Cms::GetDatabaseStatusRequest>(settings) ;
276324 request.set_path (path);
277325
278326 auto promise = NThreading::NewPromise<TGetDatabaseStatusResult>();
@@ -297,6 +345,17 @@ class TCmsClient::TImpl : public TClientImplCommon<TCmsClient::TImpl> {
297345
298346 return promise.GetFuture ();
299347 }
348+
349+ TAsyncStatus CreateDatabase (const std::string& path, const TCreateDatabaseSettings& settings) {
350+ auto request = MakeOperationRequest<Ydb::Cms::CreateDatabaseRequest>(settings);
351+ request.set_path (path);
352+ settings.SerializeTo (request);
353+
354+ return RunSimple<Ydb::Cms::V1::CmsService, Ydb::Cms::CreateDatabaseRequest, Ydb::Cms::CreateDatabaseResponse>(
355+ std::move (request),
356+ &Ydb::Cms::V1::CmsService::Stub::AsyncCreateDatabase,
357+ TRpcRequestSettings::Make (settings));
358+ }
300359};
301360
302361TCmsClient::TCmsClient (const TDriver& driver, const TCommonClientSettings& settings)
@@ -314,4 +373,11 @@ TAsyncGetDatabaseStatusResult TCmsClient::GetDatabaseStatus(
314373 return Impl_->GetDatabaseStatus (path, settings);
315374}
316375
376+ TAsyncStatus TCmsClient::CreateDatabase (
377+ const std::string& path,
378+ const TCreateDatabaseSettings& settings)
379+ {
380+ return Impl_->CreateDatabase (path, settings);
381+ }
382+
317383} // namespace NYdb::NCms
0 commit comments