1use crate::{CloudClient, Result};
55use serde::{Deserialize, Serialize};
56use serde_json::Value;
57use std::collections::HashMap;
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase")]
66pub struct BaseSubscriptionUpdateRequest {
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub subscription_id: Option<i32>,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub command_type: Option<String>,
72
73 #[serde(flatten)]
75 pub extra: Value,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80#[serde(rename_all = "camelCase")]
81pub struct SubscriptionUpdateRequest {
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub subscription_id: Option<i32>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub name: Option<String>,
88
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub payment_method_id: Option<i32>,
92
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub payment_method: Option<String>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub command_type: Option<String>,
99
100 #[serde(flatten)]
102 pub extra: Value,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct SubscriptionSpec {
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub provider: Option<String>,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub cloud_account_id: Option<i32>,
116
117 pub regions: Vec<SubscriptionRegionSpec>,
119
120 #[serde(flatten)]
122 pub extra: Value,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127#[serde(rename_all = "camelCase")]
128pub struct CustomerManagedKey {
129 pub resource_name: String,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub region: Option<String>,
135
136 #[serde(flatten)]
138 pub extra: Value,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize)]
143#[serde(rename_all = "camelCase")]
144pub struct LocalThroughput {
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub region: Option<String>,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub write_operations_per_second: Option<i64>,
152
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub read_operations_per_second: Option<i64>,
156
157 #[serde(flatten)]
159 pub extra: Value,
160}
161
162#[derive(Debug, Clone, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase")]
165pub struct CrdbRegionSpec {
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub name: Option<String>,
169
170 #[serde(skip_serializing_if = "Option::is_none")]
171 pub local_throughput_measurement: Option<LocalThroughput>,
172
173 #[serde(flatten)]
175 pub extra: Value,
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize)]
180#[serde(rename_all = "camelCase")]
181pub struct SubscriptionUpdateCMKRequest {
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub subscription_id: Option<i32>,
184
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub command_type: Option<String>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub deletion_grace_period: Option<String>,
191
192 pub customer_managed_keys: Vec<CustomerManagedKey>,
194
195 #[serde(flatten)]
197 pub extra: Value,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct SubscriptionPricings {
203 #[serde(skip_serializing_if = "Option::is_none")]
204 pub pricing: Option<Vec<SubscriptionPricing>>,
205
206 #[serde(flatten)]
208 pub extra: Value,
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize)]
213pub struct DatabaseThroughputSpec {
214 pub by: String,
216
217 pub value: i64,
219
220 #[serde(flatten)]
222 pub extra: Value,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227pub struct DatabaseModuleSpec {
228 pub name: String,
230
231 #[serde(skip_serializing_if = "Option::is_none")]
233 pub parameters: Option<HashMap<String, Value>>,
234
235 #[serde(flatten)]
237 pub extra: Value,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize)]
242#[serde(rename_all = "camelCase")]
243pub struct CidrAllowlistUpdateRequest {
244 #[serde(skip_serializing_if = "Option::is_none")]
245 pub subscription_id: Option<i32>,
246
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub cidr_ips: Option<Vec<String>>,
250
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub security_group_ids: Option<Vec<String>>,
254
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub command_type: Option<String>,
257
258 #[serde(flatten)]
260 pub extra: Value,
261}
262
263#[derive(Debug, Clone, Serialize, Deserialize)]
265pub struct SubscriptionMaintenanceWindowsSpec {
266 pub mode: String,
268
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub windows: Option<Vec<MaintenanceWindowSpec>>,
272
273 #[serde(flatten)]
275 pub extra: Value,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280#[serde(rename_all = "camelCase")]
281pub struct MaintenanceWindowSkipStatus {
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub remaining_skips: Option<i32>,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
286 pub current_skip_end: Option<String>,
287
288 #[serde(flatten)]
290 pub extra: Value,
291}
292
293#[derive(Debug, Clone, Serialize, Deserialize)]
295#[serde(rename_all = "camelCase")]
296pub struct ActiveActiveSubscriptionRegions {
297 #[serde(skip_serializing_if = "Option::is_none")]
298 pub subscription_id: Option<i32>,
299
300 #[serde(skip_serializing_if = "Option::is_none")]
302 pub links: Option<Vec<HashMap<String, Value>>>,
303
304 #[serde(flatten)]
306 pub extra: Value,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
311#[serde(rename_all = "camelCase")]
312pub struct SubscriptionPricing {
313 #[serde(skip_serializing_if = "Option::is_none")]
314 pub r#type: Option<String>,
315
316 #[serde(skip_serializing_if = "Option::is_none")]
317 pub type_details: Option<String>,
318
319 #[serde(skip_serializing_if = "Option::is_none")]
320 pub quantity: Option<i32>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub quantity_measurement: Option<String>,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
326 pub price_per_unit: Option<f64>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
329 pub price_currency: Option<String>,
330
331 #[serde(skip_serializing_if = "Option::is_none")]
332 pub price_period: Option<String>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub region: Option<String>,
336
337 #[serde(flatten)]
339 pub extra: Value,
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize)]
347#[serde(rename_all = "camelCase")]
348pub struct SubscriptionCreateRequest {
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub name: Option<String>,
352
353 #[serde(skip_serializing_if = "Option::is_none")]
355 pub dry_run: Option<bool>,
356
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub deployment_type: Option<String>,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub payment_method: Option<String>,
364
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub payment_method_id: Option<i32>,
368
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub memory_storage: Option<String>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub persistent_storage_encryption_type: Option<String>,
376
377 pub cloud_providers: Vec<SubscriptionSpec>,
379
380 pub databases: Vec<SubscriptionDatabaseSpec>,
382
383 #[serde(skip_serializing_if = "Option::is_none")]
385 pub redis_version: Option<String>,
386
387 #[serde(skip_serializing_if = "Option::is_none")]
388 pub command_type: Option<String>,
389
390 #[serde(flatten)]
392 pub extra: Value,
393}
394
395#[derive(Debug, Clone, Serialize, Deserialize)]
397#[serde(rename_all = "camelCase")]
398pub struct ProcessorResponse {
399 #[serde(skip_serializing_if = "Option::is_none")]
400 pub resource_id: Option<i32>,
401
402 #[serde(skip_serializing_if = "Option::is_none")]
403 pub additional_resource_id: Option<i32>,
404
405 #[serde(skip_serializing_if = "Option::is_none")]
406 pub resource: Option<HashMap<String, Value>>,
407
408 #[serde(skip_serializing_if = "Option::is_none")]
409 pub error: Option<String>,
410
411 #[serde(skip_serializing_if = "Option::is_none")]
412 pub additional_info: Option<String>,
413
414 #[serde(flatten)]
416 pub extra: Value,
417}
418
419#[derive(Debug, Clone, Serialize, Deserialize)]
421#[serde(rename_all = "camelCase")]
422pub struct CustomerManagedKeyAccessDetails {
423 #[serde(skip_serializing_if = "Option::is_none")]
424 pub redis_service_account: Option<String>,
425
426 #[serde(skip_serializing_if = "Option::is_none")]
427 pub google_predefined_roles: Option<Vec<String>>,
428
429 #[serde(skip_serializing_if = "Option::is_none")]
430 pub google_custom_permissions: Option<Vec<String>>,
431
432 #[serde(skip_serializing_if = "Option::is_none")]
433 pub redis_iam_role: Option<String>,
434
435 #[serde(skip_serializing_if = "Option::is_none")]
436 pub required_key_policy_statements: Option<HashMap<String, Value>>,
437
438 #[serde(skip_serializing_if = "Option::is_none")]
439 pub deletion_grace_period_options: Option<Vec<String>>,
440
441 #[serde(flatten)]
443 pub extra: Value,
444}
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
448#[serde(rename_all = "camelCase")]
449pub struct SubscriptionDatabaseSpec {
450 pub name: String,
452
453 pub protocol: String,
455
456 #[serde(skip_serializing_if = "Option::is_none")]
458 pub memory_limit_in_gb: Option<f64>,
459
460 #[serde(skip_serializing_if = "Option::is_none")]
462 pub dataset_size_in_gb: Option<f64>,
463
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub support_oss_cluster_api: Option<bool>,
467
468 #[serde(skip_serializing_if = "Option::is_none")]
470 pub data_persistence: Option<String>,
471
472 #[serde(skip_serializing_if = "Option::is_none")]
474 pub replication: Option<bool>,
475
476 #[serde(skip_serializing_if = "Option::is_none")]
477 pub throughput_measurement: Option<DatabaseThroughputSpec>,
478
479 #[serde(skip_serializing_if = "Option::is_none")]
481 pub local_throughput_measurement: Option<Vec<LocalThroughput>>,
482
483 #[serde(skip_serializing_if = "Option::is_none")]
485 pub modules: Option<Vec<DatabaseModuleSpec>>,
486
487 #[serde(skip_serializing_if = "Option::is_none")]
489 pub quantity: Option<i32>,
490
491 #[serde(skip_serializing_if = "Option::is_none")]
493 pub average_item_size_in_bytes: Option<i64>,
494
495 #[serde(skip_serializing_if = "Option::is_none")]
497 pub resp_version: Option<String>,
498
499 #[serde(skip_serializing_if = "Option::is_none")]
501 pub redis_version: Option<String>,
502
503 #[serde(skip_serializing_if = "Option::is_none")]
505 pub sharding_type: Option<String>,
506
507 #[serde(skip_serializing_if = "Option::is_none")]
509 pub query_performance_factor: Option<String>,
510
511 #[serde(flatten)]
513 pub extra: Value,
514}
515
516#[derive(Debug, Clone, Serialize, Deserialize)]
518#[serde(rename_all = "camelCase")]
519pub struct SubscriptionRegionNetworkingSpec {
520 #[serde(skip_serializing_if = "Option::is_none")]
522 pub deployment_cidr: Option<String>,
523
524 #[serde(skip_serializing_if = "Option::is_none")]
526 pub vpc_id: Option<String>,
527
528 #[serde(skip_serializing_if = "Option::is_none")]
530 pub subnet_ids: Option<Vec<String>>,
531
532 #[serde(skip_serializing_if = "Option::is_none")]
534 pub security_group_id: Option<String>,
535
536 #[serde(flatten)]
538 pub extra: Value,
539}
540
541#[derive(Debug, Clone, Serialize, Deserialize)]
543#[serde(rename_all = "camelCase")]
544pub struct RedisVersion {
545 #[serde(skip_serializing_if = "Option::is_none")]
546 pub version: Option<String>,
547
548 #[serde(skip_serializing_if = "Option::is_none")]
549 pub eol_date: Option<String>,
550
551 #[serde(skip_serializing_if = "Option::is_none")]
552 pub is_preview: Option<bool>,
553
554 #[serde(skip_serializing_if = "Option::is_none")]
555 pub is_default: Option<bool>,
556
557 #[serde(flatten)]
559 pub extra: Value,
560}
561
562#[derive(Debug, Clone, Serialize, Deserialize)]
564#[serde(rename_all = "camelCase")]
565pub struct MaintenanceWindow {
566 #[serde(skip_serializing_if = "Option::is_none")]
567 pub days: Option<Vec<String>>,
568
569 #[serde(skip_serializing_if = "Option::is_none")]
570 pub start_hour: Option<i32>,
571
572 #[serde(skip_serializing_if = "Option::is_none")]
573 pub duration_in_hours: Option<i32>,
574
575 #[serde(flatten)]
577 pub extra: Value,
578}
579
580#[derive(Debug, Clone, Serialize, Deserialize)]
582#[serde(rename_all = "camelCase")]
583pub struct Subscription {
588 #[serde(skip_serializing_if = "Option::is_none")]
590 pub id: Option<i32>,
591
592 #[serde(skip_serializing_if = "Option::is_none")]
594 pub name: Option<String>,
595
596 #[serde(skip_serializing_if = "Option::is_none")]
598 pub status: Option<String>,
599
600 #[serde(skip_serializing_if = "Option::is_none")]
602 pub payment_method_id: Option<i32>,
603
604 #[serde(skip_serializing_if = "Option::is_none")]
606 pub payment_method_type: Option<String>,
607
608 #[serde(skip_serializing_if = "Option::is_none")]
610 pub payment_method: Option<String>,
611
612 #[serde(skip_serializing_if = "Option::is_none")]
614 pub memory_storage: Option<String>,
615
616 #[serde(skip_serializing_if = "Option::is_none")]
618 pub persistent_storage_encryption_type: Option<String>,
619
620 #[serde(skip_serializing_if = "Option::is_none")]
622 pub deployment_type: Option<String>,
623
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub number_of_databases: Option<i32>,
627
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub cloud_details: Option<Vec<Value>>,
631
632 #[serde(skip_serializing_if = "Option::is_none")]
634 pub pricing: Option<Vec<Value>>,
635
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub redis_version: Option<String>,
639
640 #[serde(skip_serializing_if = "Option::is_none")]
642 pub deletion_grace_period: Option<String>,
643
644 #[serde(skip_serializing_if = "Option::is_none")]
646 pub customer_managed_key_access_details: Option<CustomerManagedKeyAccessDetails>,
647
648 #[serde(skip_serializing_if = "Option::is_none")]
650 pub created_timestamp: Option<String>,
651
652 #[serde(skip_serializing_if = "Option::is_none")]
654 pub links: Option<Vec<HashMap<String, Value>>>,
655
656 #[serde(flatten)]
658 pub extra: Value,
659}
660
661#[derive(Debug, Clone, Serialize, Deserialize)]
663#[serde(rename_all = "camelCase")]
664pub struct MaintenanceWindowSpec {
665 pub start_hour: i32,
667
668 pub duration_in_hours: i32,
670
671 pub days: Vec<String>,
673
674 #[serde(flatten)]
676 pub extra: Value,
677}
678
679#[derive(Debug, Clone, Serialize, Deserialize)]
683#[serde(rename_all = "camelCase")]
684pub struct AccountSubscriptions {
685 #[serde(skip_serializing_if = "Option::is_none")]
687 pub account_id: Option<i32>,
688
689 #[serde(skip_serializing_if = "Option::is_none")]
691 pub subscriptions: Option<Vec<Subscription>>,
692
693 #[serde(skip_serializing_if = "Option::is_none")]
695 pub links: Option<Vec<HashMap<String, Value>>>,
696
697 #[serde(flatten)]
699 pub extra: Value,
700}
701
702#[derive(Debug, Clone, Serialize, Deserialize)]
704#[serde(rename_all = "camelCase")]
705pub struct ActiveActiveRegionCreateRequest {
706 #[serde(skip_serializing_if = "Option::is_none")]
707 pub subscription_id: Option<i32>,
708
709 #[serde(skip_serializing_if = "Option::is_none")]
711 pub region: Option<String>,
712
713 #[serde(skip_serializing_if = "Option::is_none")]
715 pub vpc_id: Option<String>,
716
717 pub deployment_cidr: String,
719
720 #[serde(skip_serializing_if = "Option::is_none")]
722 pub dry_run: Option<bool>,
723
724 #[serde(skip_serializing_if = "Option::is_none")]
726 pub databases: Option<Vec<CrdbRegionSpec>>,
727
728 #[serde(skip_serializing_if = "Option::is_none")]
730 pub resp_version: Option<String>,
731
732 #[serde(skip_serializing_if = "Option::is_none")]
734 pub customer_managed_key_resource_name: Option<String>,
735
736 #[serde(skip_serializing_if = "Option::is_none")]
737 pub command_type: Option<String>,
738
739 #[serde(flatten)]
741 pub extra: Value,
742}
743
744#[derive(Debug, Clone, Serialize, Deserialize)]
746#[serde(rename_all = "camelCase")]
747pub struct RedisVersions {
748 #[serde(skip_serializing_if = "Option::is_none")]
749 pub redis_versions: Option<Vec<RedisVersion>>,
750
751 #[serde(flatten)]
753 pub extra: Value,
754}
755
756#[derive(Debug, Clone, Serialize, Deserialize)]
758#[serde(rename_all = "camelCase")]
759pub struct ActiveActiveRegionDeleteRequest {
760 #[serde(skip_serializing_if = "Option::is_none")]
761 pub subscription_id: Option<i32>,
762
763 #[serde(skip_serializing_if = "Option::is_none")]
765 pub regions: Option<Vec<ActiveActiveRegionToDelete>>,
766
767 #[serde(skip_serializing_if = "Option::is_none")]
769 pub dry_run: Option<bool>,
770
771 #[serde(skip_serializing_if = "Option::is_none")]
772 pub command_type: Option<String>,
773
774 #[serde(flatten)]
776 pub extra: Value,
777}
778
779#[derive(Debug, Clone, Serialize, Deserialize)]
781pub struct ActiveActiveRegionToDelete {
782 #[serde(skip_serializing_if = "Option::is_none")]
784 pub region: Option<String>,
785
786 #[serde(flatten)]
788 pub extra: Value,
789}
790
791#[derive(Debug, Clone, Serialize, Deserialize)]
793#[serde(rename_all = "camelCase")]
794pub struct TaskStateUpdate {
795 #[serde(skip_serializing_if = "Option::is_none")]
796 pub task_id: Option<String>,
797
798 #[serde(skip_serializing_if = "Option::is_none")]
799 pub command_type: Option<String>,
800
801 #[serde(skip_serializing_if = "Option::is_none")]
802 pub status: Option<String>,
803
804 #[serde(skip_serializing_if = "Option::is_none")]
805 pub description: Option<String>,
806
807 #[serde(skip_serializing_if = "Option::is_none")]
808 pub timestamp: Option<String>,
809
810 #[serde(skip_serializing_if = "Option::is_none")]
811 pub response: Option<ProcessorResponse>,
812
813 #[serde(skip_serializing_if = "Option::is_none")]
815 pub links: Option<Vec<HashMap<String, Value>>>,
816
817 #[serde(flatten)]
819 pub extra: Value,
820}
821
822#[derive(Debug, Clone, Serialize, Deserialize)]
824#[serde(rename_all = "camelCase")]
825pub struct SubscriptionRegionSpec {
826 pub region: String,
828
829 #[serde(skip_serializing_if = "Option::is_none")]
831 pub multiple_availability_zones: Option<bool>,
832
833 #[serde(skip_serializing_if = "Option::is_none")]
835 pub preferred_availability_zones: Option<Vec<String>>,
836
837 #[serde(skip_serializing_if = "Option::is_none")]
838 pub networking: Option<SubscriptionRegionNetworkingSpec>,
839
840 #[serde(flatten)]
842 pub extra: Value,
843}
844
845#[derive(Debug, Clone, Serialize, Deserialize)]
847#[serde(rename_all = "camelCase")]
848pub struct SubscriptionMaintenanceWindows {
849 #[serde(skip_serializing_if = "Option::is_none")]
850 pub mode: Option<String>,
851
852 #[serde(skip_serializing_if = "Option::is_none")]
853 pub time_zone: Option<String>,
854
855 #[serde(skip_serializing_if = "Option::is_none")]
856 pub windows: Option<Vec<MaintenanceWindow>>,
857
858 #[serde(skip_serializing_if = "Option::is_none")]
859 pub skip_status: Option<MaintenanceWindowSkipStatus>,
860
861 #[serde(flatten)]
863 pub extra: Value,
864}
865
866pub struct SubscriptionHandler {
875 client: CloudClient,
876}
877
878impl SubscriptionHandler {
879 pub fn new(client: CloudClient) -> Self {
881 Self { client }
882 }
883
884 pub async fn get_all_subscriptions(&self) -> Result<AccountSubscriptions> {
889 self.client.get("/subscriptions").await
890 }
891
892 pub async fn create_subscription(
897 &self,
898 request: &SubscriptionCreateRequest,
899 ) -> Result<TaskStateUpdate> {
900 self.client.post("/subscriptions", request).await
901 }
902
903 pub async fn get_redis_versions(&self, subscription_id: Option<i32>) -> Result<RedisVersions> {
908 let mut query = Vec::new();
909 if let Some(v) = subscription_id {
910 query.push(format!("subscriptionId={}", v));
911 }
912 let query_string = if query.is_empty() {
913 String::new()
914 } else {
915 format!("?{}", query.join("&"))
916 };
917 self.client
918 .get(&format!("/subscriptions/redis-versions{}", query_string))
919 .await
920 }
921
922 pub async fn delete_subscription_by_id(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
927 let response = self
928 .client
929 .delete_raw(&format!("/subscriptions/{}", subscription_id))
930 .await?;
931 serde_json::from_value(response).map_err(Into::into)
932 }
933
934 pub async fn get_subscription_by_id(&self, subscription_id: i32) -> Result<Subscription> {
939 self.client
940 .get(&format!("/subscriptions/{}", subscription_id))
941 .await
942 }
943
944 pub async fn update_subscription(
949 &self,
950 subscription_id: i32,
951 request: &BaseSubscriptionUpdateRequest,
952 ) -> Result<TaskStateUpdate> {
953 self.client
954 .put(&format!("/subscriptions/{}", subscription_id), request)
955 .await
956 }
957
958 pub async fn get_cidr_allowlist(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
963 self.client
964 .get(&format!("/subscriptions/{}/cidr", subscription_id))
965 .await
966 }
967
968 pub async fn update_subscription_cidr_allowlist(
973 &self,
974 subscription_id: i32,
975 request: &CidrAllowlistUpdateRequest,
976 ) -> Result<TaskStateUpdate> {
977 self.client
978 .put(&format!("/subscriptions/{}/cidr", subscription_id), request)
979 .await
980 }
981
982 pub async fn get_subscription_maintenance_windows(
987 &self,
988 subscription_id: i32,
989 ) -> Result<SubscriptionMaintenanceWindows> {
990 self.client
991 .get(&format!(
992 "/subscriptions/{}/maintenance-windows",
993 subscription_id
994 ))
995 .await
996 }
997
998 pub async fn update_subscription_maintenance_windows(
1003 &self,
1004 subscription_id: i32,
1005 request: &SubscriptionMaintenanceWindowsSpec,
1006 ) -> Result<TaskStateUpdate> {
1007 self.client
1008 .put(
1009 &format!("/subscriptions/{}/maintenance-windows", subscription_id),
1010 request,
1011 )
1012 .await
1013 }
1014
1015 pub async fn get_subscription_pricing(
1020 &self,
1021 subscription_id: i32,
1022 ) -> Result<SubscriptionPricings> {
1023 self.client
1024 .get(&format!("/subscriptions/{}/pricing", subscription_id))
1025 .await
1026 }
1027
1028 pub async fn delete_regions_from_active_active_subscription(
1033 &self,
1034 subscription_id: i32,
1035 request: &ActiveActiveRegionDeleteRequest,
1036 ) -> Result<TaskStateUpdate> {
1037 let _ = request; let response = self
1040 .client
1041 .delete_raw(&format!("/subscriptions/{}/regions", subscription_id))
1042 .await?;
1043 serde_json::from_value(response).map_err(Into::into)
1044 }
1045
1046 pub async fn get_regions_from_active_active_subscription(
1051 &self,
1052 subscription_id: i32,
1053 ) -> Result<ActiveActiveSubscriptionRegions> {
1054 self.client
1055 .get(&format!("/subscriptions/{}/regions", subscription_id))
1056 .await
1057 }
1058
1059 pub async fn add_new_region_to_active_active_subscription(
1064 &self,
1065 subscription_id: i32,
1066 request: &ActiveActiveRegionCreateRequest,
1067 ) -> Result<TaskStateUpdate> {
1068 self.client
1069 .post(
1070 &format!("/subscriptions/{}/regions", subscription_id),
1071 request,
1072 )
1073 .await
1074 }
1075}