1use crate::types::{Link, ProcessorResponse};
55use crate::{CloudClient, Result};
56use serde::{Deserialize, Serialize};
57use serde_json::Value;
58use std::collections::HashMap;
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
66#[serde(rename_all = "camelCase")]
67pub struct BaseSubscriptionUpdateRequest {
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub subscription_id: Option<i32>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub command_type: Option<String>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77#[serde(rename_all = "camelCase")]
78pub struct SubscriptionUpdateRequest {
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub subscription_id: Option<i32>,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub name: Option<String>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub payment_method_id: Option<i32>,
89
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub payment_method: Option<String>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub command_type: Option<String>,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
100#[serde(rename_all = "camelCase")]
101pub struct SubscriptionSpec {
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub provider: Option<String>,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub cloud_account_id: Option<i32>,
109
110 pub regions: Vec<SubscriptionRegionSpec>,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116#[serde(rename_all = "camelCase")]
117pub struct CustomerManagedKey {
118 pub resource_name: String,
120
121 #[serde(skip_serializing_if = "Option::is_none")]
123 pub region: Option<String>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase")]
129pub struct LocalThroughput {
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub region: Option<String>,
133
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub write_operations_per_second: Option<i64>,
137
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub read_operations_per_second: Option<i64>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145#[serde(rename_all = "camelCase")]
146pub struct CrdbRegionSpec {
147 #[serde(skip_serializing_if = "Option::is_none")]
149 pub name: Option<String>,
150
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub local_throughput_measurement: Option<LocalThroughput>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
157#[serde(rename_all = "camelCase")]
158pub struct SubscriptionUpdateCMKRequest {
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub subscription_id: Option<i32>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub command_type: Option<String>,
164
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub deletion_grace_period: Option<String>,
168
169 pub customer_managed_keys: Vec<CustomerManagedKey>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
175pub struct SubscriptionPricings {
176 #[serde(skip_serializing_if = "Option::is_none")]
177 pub pricing: Option<Vec<SubscriptionPricing>>,
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct DatabaseThroughputSpec {
183 pub by: String,
185
186 pub value: i64,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct DatabaseModuleSpec {
193 pub name: String,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub parameters: Option<HashMap<String, Value>>,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(rename_all = "camelCase")]
204pub struct CidrAllowlistUpdateRequest {
205 #[serde(skip_serializing_if = "Option::is_none")]
206 pub subscription_id: Option<i32>,
207
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub cidr_ips: Option<Vec<String>>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub security_group_ids: Option<Vec<String>>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
217 pub command_type: Option<String>,
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize)]
222pub struct SubscriptionMaintenanceWindowsSpec {
223 pub mode: String,
225
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub windows: Option<Vec<MaintenanceWindowSpec>>,
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
233#[serde(rename_all = "camelCase")]
234pub struct MaintenanceWindowSkipStatus {
235 #[serde(skip_serializing_if = "Option::is_none")]
236 pub remaining_skips: Option<i32>,
237
238 #[serde(skip_serializing_if = "Option::is_none")]
239 pub current_skip_end: Option<String>,
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize)]
244#[serde(rename_all = "camelCase")]
245pub struct ActiveActiveSubscriptionRegions {
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub subscription_id: Option<i32>,
248
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub links: Option<Vec<Link>>,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize)]
256#[serde(rename_all = "camelCase")]
257pub struct SubscriptionPricing {
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub database_name: Option<String>,
261
262 #[serde(skip_serializing_if = "Option::is_none")]
263 pub r#type: Option<String>,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub type_details: Option<String>,
267
268 #[serde(skip_serializing_if = "Option::is_none")]
269 pub quantity: Option<i32>,
270
271 #[serde(skip_serializing_if = "Option::is_none")]
272 pub quantity_measurement: Option<String>,
273
274 #[serde(skip_serializing_if = "Option::is_none")]
275 pub price_per_unit: Option<f64>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
278 pub price_currency: Option<String>,
279
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub price_period: Option<String>,
282
283 #[serde(skip_serializing_if = "Option::is_none")]
284 pub region: Option<String>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
292#[serde(rename_all = "camelCase")]
293pub struct SubscriptionCreateRequest {
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub name: Option<String>,
297
298 #[serde(skip_serializing_if = "Option::is_none")]
300 pub dry_run: Option<bool>,
301
302 #[serde(skip_serializing_if = "Option::is_none")]
304 pub deployment_type: Option<String>,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub payment_method: Option<String>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub payment_method_id: Option<i32>,
313
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub memory_storage: Option<String>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub persistent_storage_encryption_type: Option<String>,
321
322 pub cloud_providers: Vec<SubscriptionSpec>,
324
325 pub databases: Vec<SubscriptionDatabaseSpec>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub redis_version: Option<String>,
331
332 #[serde(skip_serializing_if = "Option::is_none")]
333 pub command_type: Option<String>,
334}
335
336#[derive(Debug, Clone, Serialize, Deserialize)]
338#[serde(rename_all = "camelCase")]
339pub struct CustomerManagedKeyAccessDetails {
340 #[serde(skip_serializing_if = "Option::is_none")]
341 pub redis_service_account: Option<String>,
342
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub google_predefined_roles: Option<Vec<String>>,
345
346 #[serde(skip_serializing_if = "Option::is_none")]
347 pub google_custom_permissions: Option<Vec<String>>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
350 pub redis_iam_role: Option<String>,
351
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub required_key_policy_statements: Option<HashMap<String, Value>>,
354
355 #[serde(skip_serializing_if = "Option::is_none")]
356 pub deletion_grace_period_options: Option<Vec<String>>,
357}
358
359#[derive(Debug, Clone, Serialize, Deserialize)]
361#[serde(rename_all = "camelCase")]
362pub struct SubscriptionDatabaseSpec {
363 pub name: String,
365
366 pub protocol: String,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub memory_limit_in_gb: Option<f64>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub dataset_size_in_gb: Option<f64>,
376
377 #[serde(skip_serializing_if = "Option::is_none")]
379 pub support_oss_cluster_api: Option<bool>,
380
381 #[serde(skip_serializing_if = "Option::is_none")]
383 pub data_persistence: Option<String>,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub replication: Option<bool>,
388
389 #[serde(skip_serializing_if = "Option::is_none")]
390 pub throughput_measurement: Option<DatabaseThroughputSpec>,
391
392 #[serde(skip_serializing_if = "Option::is_none")]
394 pub local_throughput_measurement: Option<Vec<LocalThroughput>>,
395
396 #[serde(skip_serializing_if = "Option::is_none")]
398 pub modules: Option<Vec<DatabaseModuleSpec>>,
399
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub quantity: Option<i32>,
403
404 #[serde(skip_serializing_if = "Option::is_none")]
406 pub average_item_size_in_bytes: Option<i64>,
407
408 #[serde(skip_serializing_if = "Option::is_none")]
410 pub resp_version: Option<String>,
411
412 #[serde(skip_serializing_if = "Option::is_none")]
414 pub redis_version: Option<String>,
415
416 #[serde(skip_serializing_if = "Option::is_none")]
418 pub sharding_type: Option<String>,
419
420 #[serde(skip_serializing_if = "Option::is_none")]
422 pub query_performance_factor: Option<String>,
423}
424
425#[derive(Debug, Clone, Serialize, Deserialize)]
427#[serde(rename_all = "camelCase")]
428pub struct SubscriptionRegionNetworkingSpec {
429 #[serde(skip_serializing_if = "Option::is_none")]
431 pub deployment_cidr: Option<String>,
432
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub vpc_id: Option<String>,
436
437 #[serde(skip_serializing_if = "Option::is_none")]
439 pub subnet_ids: Option<Vec<String>>,
440
441 #[serde(skip_serializing_if = "Option::is_none")]
443 pub security_group_id: Option<String>,
444}
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
448#[serde(rename_all = "camelCase")]
449pub struct RedisVersion {
450 #[serde(skip_serializing_if = "Option::is_none")]
451 pub version: Option<String>,
452
453 #[serde(skip_serializing_if = "Option::is_none")]
454 pub eol_date: Option<String>,
455
456 #[serde(skip_serializing_if = "Option::is_none")]
457 pub is_preview: Option<bool>,
458
459 #[serde(skip_serializing_if = "Option::is_none")]
460 pub is_default: Option<bool>,
461}
462
463#[derive(Debug, Clone, Serialize, Deserialize)]
465#[serde(rename_all = "camelCase")]
466pub struct MaintenanceWindow {
467 #[serde(skip_serializing_if = "Option::is_none")]
468 pub days: Option<Vec<String>>,
469
470 #[serde(skip_serializing_if = "Option::is_none")]
471 pub start_hour: Option<i32>,
472
473 #[serde(skip_serializing_if = "Option::is_none")]
474 pub duration_in_hours: Option<i32>,
475}
476
477#[derive(Debug, Clone, Serialize, Deserialize)]
479#[serde(rename_all = "camelCase")]
480pub struct CloudDetail {
481 #[serde(skip_serializing_if = "Option::is_none")]
483 pub provider: Option<String>,
484
485 #[serde(skip_serializing_if = "Option::is_none")]
487 pub cloud_account_id: Option<i32>,
488
489 #[serde(skip_serializing_if = "Option::is_none")]
491 pub aws_account_id: Option<String>,
492
493 #[serde(skip_serializing_if = "Option::is_none")]
495 pub total_size_in_gb: Option<f64>,
496
497 #[serde(skip_serializing_if = "Option::is_none")]
499 pub regions: Option<Vec<SubscriptionRegion>>,
500}
501
502#[derive(Debug, Clone, Serialize, Deserialize)]
504#[serde(rename_all = "camelCase")]
505pub struct SubscriptionRegion {
506 #[serde(skip_serializing_if = "Option::is_none")]
508 pub region: Option<String>,
509
510 #[serde(skip_serializing_if = "Option::is_none")]
512 pub networking: Option<Vec<SubscriptionNetworking>>,
513
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub preferred_availability_zones: Option<Vec<String>>,
517
518 #[serde(skip_serializing_if = "Option::is_none")]
520 pub multiple_availability_zones: Option<bool>,
521}
522
523#[derive(Debug, Clone, Serialize, Deserialize)]
525#[serde(rename_all = "camelCase")]
526pub struct SubscriptionNetworking {
527 #[serde(skip_serializing_if = "Option::is_none")]
529 pub deployment_cidr: Option<String>,
530
531 #[serde(skip_serializing_if = "Option::is_none")]
533 pub vpc_id: Option<String>,
534
535 #[serde(skip_serializing_if = "Option::is_none")]
537 pub subnet_id: Option<String>,
538}
539
540#[derive(Debug, Clone, Serialize, Deserialize)]
542#[serde(rename_all = "camelCase")]
543pub struct Subscription {
548 #[serde(skip_serializing_if = "Option::is_none")]
550 pub id: Option<i32>,
551
552 #[serde(skip_serializing_if = "Option::is_none")]
554 pub name: Option<String>,
555
556 #[serde(skip_serializing_if = "Option::is_none")]
558 pub status: Option<String>,
559
560 #[serde(skip_serializing_if = "Option::is_none")]
562 pub payment_method_id: Option<i32>,
563
564 #[serde(skip_serializing_if = "Option::is_none")]
566 pub payment_method_type: Option<String>,
567
568 #[serde(skip_serializing_if = "Option::is_none")]
570 pub payment_method: Option<String>,
571
572 #[serde(skip_serializing_if = "Option::is_none")]
574 pub memory_storage: Option<String>,
575
576 #[serde(skip_serializing_if = "Option::is_none")]
578 pub persistent_storage_encryption_type: Option<String>,
579
580 #[serde(skip_serializing_if = "Option::is_none")]
582 pub deployment_type: Option<String>,
583
584 #[serde(skip_serializing_if = "Option::is_none")]
586 pub number_of_databases: Option<i32>,
587
588 #[serde(skip_serializing_if = "Option::is_none")]
590 pub cloud_details: Option<Vec<CloudDetail>>,
591
592 #[serde(skip_serializing_if = "Option::is_none")]
594 pub pricing: Option<Vec<SubscriptionPricing>>,
595
596 #[serde(skip_serializing_if = "Option::is_none")]
598 pub redis_version: Option<String>,
599
600 #[serde(skip_serializing_if = "Option::is_none")]
602 pub deletion_grace_period: Option<String>,
603
604 #[serde(skip_serializing_if = "Option::is_none")]
606 pub customer_managed_key_access_details: Option<CustomerManagedKeyAccessDetails>,
607
608 #[serde(skip_serializing_if = "Option::is_none")]
610 pub storage_encryption: Option<bool>,
611
612 #[serde(skip_serializing_if = "Option::is_none")]
614 pub public_endpoint_access: Option<bool>,
615
616 #[serde(skip_serializing_if = "Option::is_none")]
618 pub created_timestamp: Option<String>,
619
620 #[serde(skip_serializing_if = "Option::is_none")]
622 pub links: Option<Vec<Link>>,
623}
624
625#[derive(Debug, Clone, Serialize, Deserialize)]
627#[serde(rename_all = "camelCase")]
628pub struct MaintenanceWindowSpec {
629 pub start_hour: i32,
631
632 pub duration_in_hours: i32,
634
635 pub days: Vec<String>,
637}
638
639#[derive(Debug, Clone, Serialize, Deserialize)]
643#[serde(rename_all = "camelCase")]
644pub struct AccountSubscriptions {
645 #[serde(skip_serializing_if = "Option::is_none")]
647 pub account_id: Option<i32>,
648
649 #[serde(skip_serializing_if = "Option::is_none")]
651 pub subscriptions: Option<Vec<Subscription>>,
652
653 #[serde(skip_serializing_if = "Option::is_none")]
655 pub links: Option<Vec<Link>>,
656}
657
658#[derive(Debug, Clone, Serialize, Deserialize)]
660#[serde(rename_all = "camelCase")]
661pub struct ActiveActiveRegionCreateRequest {
662 #[serde(skip_serializing_if = "Option::is_none")]
663 pub subscription_id: Option<i32>,
664
665 #[serde(skip_serializing_if = "Option::is_none")]
667 pub region: Option<String>,
668
669 #[serde(skip_serializing_if = "Option::is_none")]
671 pub vpc_id: Option<String>,
672
673 pub deployment_cidr: String,
675
676 #[serde(skip_serializing_if = "Option::is_none")]
678 pub dry_run: Option<bool>,
679
680 #[serde(skip_serializing_if = "Option::is_none")]
682 pub databases: Option<Vec<CrdbRegionSpec>>,
683
684 #[serde(skip_serializing_if = "Option::is_none")]
686 pub resp_version: Option<String>,
687
688 #[serde(skip_serializing_if = "Option::is_none")]
690 pub customer_managed_key_resource_name: Option<String>,
691
692 #[serde(skip_serializing_if = "Option::is_none")]
693 pub command_type: Option<String>,
694}
695
696#[derive(Debug, Clone, Serialize, Deserialize)]
698#[serde(rename_all = "camelCase")]
699pub struct RedisVersions {
700 #[serde(skip_serializing_if = "Option::is_none")]
701 pub redis_versions: Option<Vec<RedisVersion>>,
702}
703
704#[derive(Debug, Clone, Serialize, Deserialize)]
706#[serde(rename_all = "camelCase")]
707pub struct ActiveActiveRegionDeleteRequest {
708 #[serde(skip_serializing_if = "Option::is_none")]
709 pub subscription_id: Option<i32>,
710
711 #[serde(skip_serializing_if = "Option::is_none")]
713 pub regions: Option<Vec<ActiveActiveRegionToDelete>>,
714
715 #[serde(skip_serializing_if = "Option::is_none")]
717 pub dry_run: Option<bool>,
718
719 #[serde(skip_serializing_if = "Option::is_none")]
720 pub command_type: Option<String>,
721}
722
723#[derive(Debug, Clone, Serialize, Deserialize)]
725pub struct ActiveActiveRegionToDelete {
726 #[serde(skip_serializing_if = "Option::is_none")]
728 pub region: Option<String>,
729}
730
731#[derive(Debug, Clone, Serialize, Deserialize)]
733#[serde(rename_all = "camelCase")]
734pub struct TaskStateUpdate {
735 #[serde(skip_serializing_if = "Option::is_none")]
736 pub task_id: Option<String>,
737
738 #[serde(skip_serializing_if = "Option::is_none")]
739 pub command_type: Option<String>,
740
741 #[serde(skip_serializing_if = "Option::is_none")]
742 pub status: Option<String>,
743
744 #[serde(skip_serializing_if = "Option::is_none")]
745 pub description: Option<String>,
746
747 #[serde(skip_serializing_if = "Option::is_none")]
748 pub timestamp: Option<String>,
749
750 #[serde(skip_serializing_if = "Option::is_none")]
751 pub response: Option<ProcessorResponse>,
752
753 #[serde(skip_serializing_if = "Option::is_none")]
755 pub links: Option<Vec<Link>>,
756}
757
758#[derive(Debug, Clone, Serialize, Deserialize)]
760#[serde(rename_all = "camelCase")]
761pub struct SubscriptionRegionSpec {
762 pub region: String,
764
765 #[serde(skip_serializing_if = "Option::is_none")]
767 pub multiple_availability_zones: Option<bool>,
768
769 #[serde(skip_serializing_if = "Option::is_none")]
771 pub preferred_availability_zones: Option<Vec<String>>,
772
773 #[serde(skip_serializing_if = "Option::is_none")]
774 pub networking: Option<SubscriptionRegionNetworkingSpec>,
775}
776
777#[derive(Debug, Clone, Serialize, Deserialize)]
779#[serde(rename_all = "camelCase")]
780pub struct SubscriptionMaintenanceWindows {
781 #[serde(skip_serializing_if = "Option::is_none")]
782 pub mode: Option<String>,
783
784 #[serde(skip_serializing_if = "Option::is_none")]
785 pub time_zone: Option<String>,
786
787 #[serde(skip_serializing_if = "Option::is_none")]
788 pub windows: Option<Vec<MaintenanceWindow>>,
789
790 #[serde(skip_serializing_if = "Option::is_none")]
791 pub skip_status: Option<MaintenanceWindowSkipStatus>,
792}
793
794pub struct SubscriptionHandler {
803 client: CloudClient,
804}
805
806impl SubscriptionHandler {
807 #[must_use]
809 pub fn new(client: CloudClient) -> Self {
810 Self { client }
811 }
812
813 pub async fn get_all_subscriptions(&self) -> Result<AccountSubscriptions> {
840 self.client.get("/subscriptions").await
841 }
842
843 pub async fn create_subscription(
848 &self,
849 request: &SubscriptionCreateRequest,
850 ) -> Result<TaskStateUpdate> {
851 self.client.post("/subscriptions", request).await
852 }
853
854 pub async fn get_redis_versions(&self, subscription_id: Option<i32>) -> Result<RedisVersions> {
859 let mut query = Vec::new();
860 if let Some(v) = subscription_id {
861 query.push(format!("subscriptionId={v}"));
862 }
863 let query_string = if query.is_empty() {
864 String::new()
865 } else {
866 format!("?{}", query.join("&"))
867 };
868 self.client
869 .get(&format!("/subscriptions/redis-versions{query_string}"))
870 .await
871 }
872
873 pub async fn delete_subscription_by_id(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
878 let response = self
879 .client
880 .delete_raw(&format!("/subscriptions/{subscription_id}"))
881 .await?;
882 serde_json::from_value(response).map_err(Into::into)
883 }
884
885 pub async fn get_subscription_by_id(&self, subscription_id: i32) -> Result<Subscription> {
911 self.client
912 .get(&format!("/subscriptions/{subscription_id}"))
913 .await
914 }
915
916 pub async fn update_subscription(
921 &self,
922 subscription_id: i32,
923 request: &BaseSubscriptionUpdateRequest,
924 ) -> Result<TaskStateUpdate> {
925 self.client
926 .put(&format!("/subscriptions/{subscription_id}"), request)
927 .await
928 }
929
930 pub async fn get_cidr_allowlist(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
935 self.client
936 .get(&format!("/subscriptions/{subscription_id}/cidr"))
937 .await
938 }
939
940 pub async fn update_subscription_cidr_allowlist(
945 &self,
946 subscription_id: i32,
947 request: &CidrAllowlistUpdateRequest,
948 ) -> Result<TaskStateUpdate> {
949 self.client
950 .put(&format!("/subscriptions/{subscription_id}/cidr"), request)
951 .await
952 }
953
954 pub async fn get_subscription_maintenance_windows(
959 &self,
960 subscription_id: i32,
961 ) -> Result<SubscriptionMaintenanceWindows> {
962 self.client
963 .get(&format!(
964 "/subscriptions/{subscription_id}/maintenance-windows"
965 ))
966 .await
967 }
968
969 pub async fn update_subscription_maintenance_windows(
974 &self,
975 subscription_id: i32,
976 request: &SubscriptionMaintenanceWindowsSpec,
977 ) -> Result<TaskStateUpdate> {
978 self.client
979 .put(
980 &format!("/subscriptions/{subscription_id}/maintenance-windows"),
981 request,
982 )
983 .await
984 }
985
986 pub async fn get_subscription_pricing(
991 &self,
992 subscription_id: i32,
993 ) -> Result<SubscriptionPricings> {
994 self.client
995 .get(&format!("/subscriptions/{subscription_id}/pricing"))
996 .await
997 }
998
999 pub async fn delete_regions_from_active_active_subscription(
1004 &self,
1005 subscription_id: i32,
1006 request: &ActiveActiveRegionDeleteRequest,
1007 ) -> Result<TaskStateUpdate> {
1008 let _ = request; let response = self
1011 .client
1012 .delete_raw(&format!("/subscriptions/{subscription_id}/regions"))
1013 .await?;
1014 serde_json::from_value(response).map_err(Into::into)
1015 }
1016
1017 pub async fn get_regions_from_active_active_subscription(
1022 &self,
1023 subscription_id: i32,
1024 ) -> Result<ActiveActiveSubscriptionRegions> {
1025 self.client
1026 .get(&format!("/subscriptions/{subscription_id}/regions"))
1027 .await
1028 }
1029
1030 pub async fn add_new_region_to_active_active_subscription(
1035 &self,
1036 subscription_id: i32,
1037 request: &ActiveActiveRegionCreateRequest,
1038 ) -> Result<TaskStateUpdate> {
1039 self.client
1040 .post(
1041 &format!("/subscriptions/{subscription_id}/regions"),
1042 request,
1043 )
1044 .await
1045 }
1046}