1use crate::types::{Link, ProcessorResponse};
49use crate::{CloudClient, Result};
50use serde::{Deserialize, Serialize};
51use serde_json::Value;
52use std::collections::HashMap;
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct AccountFixedSubscriptionDatabases {
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub account_id: Option<i32>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub links: Option<Vec<Link>>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
72#[serde(rename_all = "camelCase")]
73pub struct FixedDatabaseImportRequest {
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub subscription_id: Option<i32>,
76
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub database_id: Option<i32>,
79
80 pub source_type: String,
82
83 pub import_from_uri: Vec<String>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub command_type: Option<String>,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase")]
93pub struct DatabaseTagUpdateRequest {
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub subscription_id: Option<i32>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub database_id: Option<i32>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub key: Option<String>,
102
103 pub value: String,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub command_type: Option<String>,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct DynamicEndpoints {
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub public: Option<String>,
115
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub private: Option<String>,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122#[serde(rename_all = "camelCase")]
123pub struct Tag {
124 pub key: String,
126
127 pub value: String,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub command_type: Option<String>,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
136#[serde(rename_all = "camelCase")]
137pub struct DatabaseTagsUpdateRequest {
138 #[serde(skip_serializing_if = "Option::is_none")]
139 pub subscription_id: Option<i32>,
140
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub database_id: Option<i32>,
143
144 pub tags: Vec<Tag>,
146
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub command_type: Option<String>,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
153#[serde(rename_all = "camelCase")]
154pub struct DatabaseSyncSourceSpec {
155 pub endpoint: String,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub encryption: Option<bool>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub server_cert: Option<String>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
169#[serde(rename_all = "camelCase")]
170pub struct DatabaseCertificateSpec {
171 pub public_certificate_pem_string: String,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
177#[serde(rename_all = "camelCase")]
178pub struct CloudTag {
179 #[serde(skip_serializing_if = "Option::is_none")]
180 pub key: Option<String>,
181
182 #[serde(skip_serializing_if = "Option::is_none")]
183 pub value: Option<String>,
184
185 #[serde(skip_serializing_if = "Option::is_none")]
186 pub created_at: Option<String>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub updated_at: Option<String>,
190
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub links: Option<Vec<Link>>,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
198#[serde(rename_all = "camelCase")]
199pub struct DatabaseSlowLogEntry {
200 #[serde(skip_serializing_if = "Option::is_none")]
201 pub id: Option<i32>,
202
203 #[serde(skip_serializing_if = "Option::is_none")]
204 pub start_time: Option<String>,
205
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub duration: Option<i32>,
208
209 #[serde(skip_serializing_if = "Option::is_none")]
210 pub arguments: Option<String>,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
215#[serde(rename_all = "camelCase")]
216pub struct DatabaseTagCreateRequest {
217 pub key: String,
219
220 pub value: String,
222
223 #[serde(skip_serializing_if = "Option::is_none")]
224 pub subscription_id: Option<i32>,
225
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub database_id: Option<i32>,
228
229 #[serde(skip_serializing_if = "Option::is_none")]
230 pub command_type: Option<String>,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
235#[serde(rename_all = "camelCase")]
236pub struct FixedDatabaseBackupRequest {
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub subscription_id: Option<i32>,
239
240 #[serde(skip_serializing_if = "Option::is_none")]
241 pub database_id: Option<i32>,
242
243 #[serde(skip_serializing_if = "Option::is_none")]
245 pub adhoc_backup_path: Option<String>,
246
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub command_type: Option<String>,
249}
250
251#[derive(Debug, Clone, Serialize, Deserialize)]
253pub struct DatabaseModuleSpec {
254 pub name: String,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub parameters: Option<HashMap<String, Value>>,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize)]
264#[serde(rename_all = "camelCase")]
265pub struct ReplicaOfSpec {
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub description: Option<String>,
269
270 #[serde(default)]
272 pub sync_sources: Vec<DatabaseSyncSourceSpec>,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize)]
277#[serde(rename_all = "camelCase")]
278pub struct DatabaseBackupStatus {
279 #[serde(skip_serializing_if = "Option::is_none")]
281 pub enabled: Option<bool>,
282
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub status: Option<String>,
286
287 #[serde(skip_serializing_if = "Option::is_none")]
289 pub interval: Option<String>,
290
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub destination: Option<String>,
294}
295
296#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct DatabaseAlertSpec {
299 pub name: String,
301
302 pub value: i32,
304}
305
306#[derive(Debug, Clone, Serialize, Deserialize)]
308#[serde(rename_all = "camelCase")]
309pub struct CloudTags {
310 #[serde(skip_serializing_if = "Option::is_none")]
311 pub account_id: Option<i32>,
312
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub links: Option<Vec<Link>>,
316}
317
318#[derive(Debug, Clone, Serialize, Deserialize)]
320#[serde(rename_all = "camelCase")]
321pub struct FixedDatabase {
322 #[serde(skip_serializing_if = "Option::is_none")]
323 pub database_id: Option<i32>,
324
325 #[serde(skip_serializing_if = "Option::is_none")]
326 pub name: Option<String>,
327
328 #[serde(skip_serializing_if = "Option::is_none")]
329 pub protocol: Option<String>,
330
331 #[serde(skip_serializing_if = "Option::is_none")]
332 pub provider: Option<String>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
335 pub region: Option<String>,
336
337 #[serde(skip_serializing_if = "Option::is_none")]
338 pub redis_version: Option<String>,
339
340 #[serde(skip_serializing_if = "Option::is_none")]
341 pub redis_version_compliance: Option<String>,
342
343 #[serde(skip_serializing_if = "Option::is_none")]
344 pub resp_version: Option<String>,
345
346 #[serde(skip_serializing_if = "Option::is_none")]
347 pub status: Option<String>,
348
349 #[serde(skip_serializing_if = "Option::is_none")]
350 pub plan_memory_limit: Option<f64>,
351
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub plan_dataset_size: Option<f64>,
354
355 #[serde(skip_serializing_if = "Option::is_none")]
356 pub memory_limit_measurement_unit: Option<String>,
357
358 #[serde(skip_serializing_if = "Option::is_none")]
359 pub memory_limit_in_gb: Option<f64>,
360
361 #[serde(skip_serializing_if = "Option::is_none")]
362 pub dataset_size_in_gb: Option<f64>,
363
364 #[serde(skip_serializing_if = "Option::is_none")]
365 pub memory_used_in_mb: Option<f64>,
366
367 #[serde(skip_serializing_if = "Option::is_none")]
368 pub network_monthly_usage_in_byte: Option<f64>,
369
370 #[serde(skip_serializing_if = "Option::is_none")]
371 pub memory_storage: Option<String>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
374 pub redis_flex: Option<bool>,
375
376 #[serde(skip_serializing_if = "Option::is_none")]
377 pub support_oss_cluster_api: Option<bool>,
378
379 #[serde(skip_serializing_if = "Option::is_none")]
380 pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
381
382 #[serde(skip_serializing_if = "Option::is_none")]
383 pub data_persistence: Option<String>,
384
385 #[serde(skip_serializing_if = "Option::is_none")]
386 pub replication: Option<bool>,
387
388 #[serde(skip_serializing_if = "Option::is_none")]
389 pub data_eviction_policy: Option<String>,
390
391 #[serde(skip_serializing_if = "Option::is_none")]
392 pub activated_on: Option<String>,
393
394 #[serde(skip_serializing_if = "Option::is_none")]
395 pub last_modified: Option<String>,
396
397 #[serde(skip_serializing_if = "Option::is_none")]
398 pub public_endpoint: Option<String>,
399
400 #[serde(skip_serializing_if = "Option::is_none")]
401 pub private_endpoint: Option<String>,
402
403 #[serde(skip_serializing_if = "Option::is_none")]
404 pub dynamic_endpoints: Option<DynamicEndpoints>,
405
406 #[serde(skip_serializing_if = "Option::is_none")]
408 pub enable_default_user: Option<bool>,
409
410 #[serde(skip_serializing_if = "Option::is_none")]
412 pub enable_tls: Option<bool>,
413
414 #[serde(skip_serializing_if = "Option::is_none")]
416 pub password: Option<String>,
417
418 #[serde(skip_serializing_if = "Option::is_none")]
420 pub source_ips: Option<Vec<String>>,
421
422 #[serde(skip_serializing_if = "Option::is_none")]
424 pub ssl_client_authentication: Option<bool>,
425
426 #[serde(skip_serializing_if = "Option::is_none")]
428 pub tls_client_authentication: Option<bool>,
429
430 #[serde(skip_serializing_if = "Option::is_none")]
432 pub replica: Option<ReplicaOfSpec>,
433
434 #[serde(skip_serializing_if = "Option::is_none")]
436 pub clustering_enabled: Option<bool>,
437
438 #[serde(skip_serializing_if = "Option::is_none")]
440 pub regex_rules: Option<Vec<String>>,
441
442 #[serde(skip_serializing_if = "Option::is_none")]
444 pub hashing_policy: Option<String>,
445
446 #[serde(skip_serializing_if = "Option::is_none")]
448 pub modules: Option<Vec<DatabaseModuleSpec>>,
449
450 #[serde(skip_serializing_if = "Option::is_none")]
452 pub alerts: Option<Vec<DatabaseAlertSpec>>,
453
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub backup: Option<DatabaseBackupStatus>,
457
458 #[serde(skip_serializing_if = "Option::is_none")]
460 pub links: Option<Vec<Link>>,
461}
462
463#[derive(Debug, Clone, Serialize, Deserialize)]
465pub struct DatabaseSlowLogEntries {
466 #[serde(skip_serializing_if = "Option::is_none")]
467 pub entries: Option<Vec<DatabaseSlowLogEntry>>,
468
469 #[serde(skip_serializing_if = "Option::is_none")]
471 pub links: Option<Vec<Link>>,
472}
473
474#[derive(Debug, Clone, Serialize, Deserialize)]
476#[serde(rename_all = "camelCase")]
477pub struct TaskStateUpdate {
478 #[serde(skip_serializing_if = "Option::is_none")]
479 pub task_id: Option<String>,
480
481 #[serde(skip_serializing_if = "Option::is_none")]
482 pub command_type: Option<String>,
483
484 #[serde(skip_serializing_if = "Option::is_none")]
485 pub status: Option<String>,
486
487 #[serde(skip_serializing_if = "Option::is_none")]
488 pub description: Option<String>,
489
490 #[serde(skip_serializing_if = "Option::is_none")]
491 pub timestamp: Option<String>,
492
493 #[serde(skip_serializing_if = "Option::is_none")]
494 pub response: Option<ProcessorResponse>,
495
496 #[serde(skip_serializing_if = "Option::is_none")]
498 pub links: Option<Vec<Link>>,
499}
500
501#[derive(Debug, Clone, Serialize, Deserialize)]
503#[serde(rename_all = "camelCase")]
504pub struct FixedDatabaseCreateRequest {
505 #[serde(skip_serializing_if = "Option::is_none")]
506 pub subscription_id: Option<i32>,
507
508 pub name: String,
510
511 #[serde(skip_serializing_if = "Option::is_none")]
513 pub protocol: Option<String>,
514
515 #[serde(skip_serializing_if = "Option::is_none")]
517 pub memory_limit_in_gb: Option<f64>,
518
519 #[serde(skip_serializing_if = "Option::is_none")]
521 pub dataset_size_in_gb: Option<f64>,
522
523 #[serde(skip_serializing_if = "Option::is_none")]
525 pub support_oss_cluster_api: Option<bool>,
526
527 #[serde(skip_serializing_if = "Option::is_none")]
529 pub redis_version: Option<String>,
530
531 #[serde(skip_serializing_if = "Option::is_none")]
533 pub resp_version: Option<String>,
534
535 #[serde(skip_serializing_if = "Option::is_none")]
537 pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
538
539 #[serde(skip_serializing_if = "Option::is_none")]
541 pub enable_database_clustering: Option<bool>,
542
543 #[serde(skip_serializing_if = "Option::is_none")]
545 pub number_of_shards: Option<i32>,
546
547 #[serde(skip_serializing_if = "Option::is_none")]
549 pub data_persistence: Option<String>,
550
551 #[serde(skip_serializing_if = "Option::is_none")]
553 pub data_eviction_policy: Option<String>,
554
555 #[serde(skip_serializing_if = "Option::is_none")]
557 pub replication: Option<bool>,
558
559 #[serde(skip_serializing_if = "Option::is_none")]
561 pub periodic_backup_path: Option<String>,
562
563 #[serde(skip_serializing_if = "Option::is_none")]
565 pub source_ips: Option<Vec<String>>,
566
567 #[serde(skip_serializing_if = "Option::is_none")]
569 pub regex_rules: Option<Vec<String>>,
570
571 #[serde(skip_serializing_if = "Option::is_none")]
573 pub replica_of: Option<Vec<String>>,
574
575 #[serde(skip_serializing_if = "Option::is_none")]
576 pub replica: Option<ReplicaOfSpec>,
577
578 #[serde(skip_serializing_if = "Option::is_none")]
580 pub client_ssl_certificate: Option<String>,
581
582 #[serde(skip_serializing_if = "Option::is_none")]
584 pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
585
586 #[serde(skip_serializing_if = "Option::is_none")]
588 pub enable_tls: Option<bool>,
589
590 #[serde(skip_serializing_if = "Option::is_none")]
592 pub password: Option<String>,
593
594 #[serde(skip_serializing_if = "Option::is_none")]
596 pub alerts: Option<Vec<DatabaseAlertSpec>>,
597
598 #[serde(skip_serializing_if = "Option::is_none")]
600 pub modules: Option<Vec<DatabaseModuleSpec>>,
601
602 #[serde(skip_serializing_if = "Option::is_none")]
603 pub command_type: Option<String>,
604}
605
606#[derive(Debug, Clone, Serialize, Deserialize)]
608#[serde(rename_all = "camelCase")]
609pub struct FixedDatabaseUpdateRequest {
610 #[serde(skip_serializing_if = "Option::is_none")]
611 pub subscription_id: Option<i32>,
612
613 #[serde(skip_serializing_if = "Option::is_none")]
614 pub database_id: Option<i32>,
615
616 #[serde(skip_serializing_if = "Option::is_none")]
618 pub name: Option<String>,
619
620 #[serde(skip_serializing_if = "Option::is_none")]
622 pub memory_limit_in_gb: Option<f64>,
623
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub dataset_size_in_gb: Option<f64>,
627
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub support_oss_cluster_api: Option<bool>,
631
632 #[serde(skip_serializing_if = "Option::is_none")]
634 pub resp_version: Option<String>,
635
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
639
640 #[serde(skip_serializing_if = "Option::is_none")]
642 pub enable_database_clustering: Option<bool>,
643
644 #[serde(skip_serializing_if = "Option::is_none")]
646 pub number_of_shards: Option<i32>,
647
648 #[serde(skip_serializing_if = "Option::is_none")]
650 pub data_persistence: Option<String>,
651
652 #[serde(skip_serializing_if = "Option::is_none")]
654 pub data_eviction_policy: Option<String>,
655
656 #[serde(skip_serializing_if = "Option::is_none")]
658 pub replication: Option<bool>,
659
660 #[serde(skip_serializing_if = "Option::is_none")]
662 pub periodic_backup_path: Option<String>,
663
664 #[serde(skip_serializing_if = "Option::is_none")]
666 pub source_ips: Option<Vec<String>>,
667
668 #[serde(skip_serializing_if = "Option::is_none")]
670 pub replica_of: Option<Vec<String>>,
671
672 #[serde(skip_serializing_if = "Option::is_none")]
673 pub replica: Option<ReplicaOfSpec>,
674
675 #[serde(skip_serializing_if = "Option::is_none")]
677 pub regex_rules: Option<Vec<String>>,
678
679 #[serde(skip_serializing_if = "Option::is_none")]
681 pub client_ssl_certificate: Option<String>,
682
683 #[serde(skip_serializing_if = "Option::is_none")]
685 pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
686
687 #[serde(skip_serializing_if = "Option::is_none")]
689 pub enable_tls: Option<bool>,
690
691 #[serde(skip_serializing_if = "Option::is_none")]
693 pub password: Option<String>,
694
695 #[serde(skip_serializing_if = "Option::is_none")]
697 pub enable_default_user: Option<bool>,
698
699 #[serde(skip_serializing_if = "Option::is_none")]
701 pub alerts: Option<Vec<DatabaseAlertSpec>>,
702
703 #[serde(skip_serializing_if = "Option::is_none")]
704 pub command_type: Option<String>,
705}
706
707pub struct FixedDatabaseHandler {
716 client: CloudClient,
717}
718
719impl FixedDatabaseHandler {
720 #[must_use]
722 pub fn new(client: CloudClient) -> Self {
723 Self { client }
724 }
725
726 pub async fn list(
731 &self,
732 subscription_id: i32,
733 offset: Option<i32>,
734 limit: Option<i32>,
735 ) -> Result<AccountFixedSubscriptionDatabases> {
736 let mut query = Vec::new();
737 if let Some(v) = offset {
738 query.push(format!("offset={v}"));
739 }
740 if let Some(v) = limit {
741 query.push(format!("limit={v}"));
742 }
743 let query_string = if query.is_empty() {
744 String::new()
745 } else {
746 format!("?{}", query.join("&"))
747 };
748 self.client
749 .get(&format!(
750 "/fixed/subscriptions/{subscription_id}/databases{query_string}"
751 ))
752 .await
753 }
754
755 pub async fn create(
760 &self,
761 subscription_id: i32,
762 request: &FixedDatabaseCreateRequest,
763 ) -> Result<TaskStateUpdate> {
764 self.client
765 .post(
766 &format!("/fixed/subscriptions/{subscription_id}/databases"),
767 request,
768 )
769 .await
770 }
771
772 pub async fn delete_by_id(
777 &self,
778 subscription_id: i32,
779 database_id: i32,
780 ) -> Result<TaskStateUpdate> {
781 let response = self
782 .client
783 .delete_raw(&format!(
784 "/fixed/subscriptions/{subscription_id}/databases/{database_id}"
785 ))
786 .await?;
787 serde_json::from_value(response).map_err(Into::into)
788 }
789
790 pub async fn get_by_id(&self, subscription_id: i32, database_id: i32) -> Result<FixedDatabase> {
795 self.client
796 .get(&format!(
797 "/fixed/subscriptions/{subscription_id}/databases/{database_id}"
798 ))
799 .await
800 }
801
802 pub async fn update(
807 &self,
808 subscription_id: i32,
809 database_id: i32,
810 request: &FixedDatabaseUpdateRequest,
811 ) -> Result<TaskStateUpdate> {
812 self.client
813 .put(
814 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}"),
815 request,
816 )
817 .await
818 }
819
820 pub async fn get_backup_status(
825 &self,
826 subscription_id: i32,
827 database_id: i32,
828 ) -> Result<TaskStateUpdate> {
829 self.client
830 .get(&format!(
831 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/backup"
832 ))
833 .await
834 }
835
836 pub async fn backup(
841 &self,
842 subscription_id: i32,
843 database_id: i32,
844 request: &FixedDatabaseBackupRequest,
845 ) -> Result<TaskStateUpdate> {
846 self.client
847 .post(
848 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}/backup"),
849 request,
850 )
851 .await
852 }
853
854 pub async fn get_import_status(
859 &self,
860 subscription_id: i32,
861 database_id: i32,
862 ) -> Result<TaskStateUpdate> {
863 self.client
864 .get(&format!(
865 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/import"
866 ))
867 .await
868 }
869
870 pub async fn import(
875 &self,
876 subscription_id: i32,
877 database_id: i32,
878 request: &FixedDatabaseImportRequest,
879 ) -> Result<TaskStateUpdate> {
880 self.client
881 .post(
882 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}/import"),
883 request,
884 )
885 .await
886 }
887
888 pub async fn get_slow_log(
893 &self,
894 subscription_id: i32,
895 database_id: i32,
896 ) -> Result<DatabaseSlowLogEntries> {
897 self.client
898 .get(&format!(
899 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/slow-log"
900 ))
901 .await
902 }
903
904 pub async fn get_tags(&self, subscription_id: i32, database_id: i32) -> Result<CloudTags> {
909 self.client
910 .get(&format!(
911 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/tags"
912 ))
913 .await
914 }
915
916 pub async fn create_tag(
921 &self,
922 subscription_id: i32,
923 database_id: i32,
924 request: &DatabaseTagCreateRequest,
925 ) -> Result<CloudTag> {
926 self.client
927 .post(
928 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}/tags"),
929 request,
930 )
931 .await
932 }
933
934 pub async fn update_tags(
939 &self,
940 subscription_id: i32,
941 database_id: i32,
942 request: &DatabaseTagsUpdateRequest,
943 ) -> Result<CloudTags> {
944 self.client
945 .put(
946 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}/tags"),
947 request,
948 )
949 .await
950 }
951
952 pub async fn delete_tag(
957 &self,
958 subscription_id: i32,
959 database_id: i32,
960 tag_key: String,
961 ) -> Result<HashMap<String, Value>> {
962 let response = self
963 .client
964 .delete_raw(&format!(
965 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/tags/{tag_key}"
966 ))
967 .await?;
968 serde_json::from_value(response).map_err(Into::into)
969 }
970
971 pub async fn update_tag(
976 &self,
977 subscription_id: i32,
978 database_id: i32,
979 tag_key: String,
980 request: &DatabaseTagUpdateRequest,
981 ) -> Result<CloudTag> {
982 self.client
983 .put(
984 &format!(
985 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/tags/{tag_key}"
986 ),
987 request,
988 )
989 .await
990 }
991
992 pub async fn get_available_target_versions(
1001 &self,
1002 subscription_id: i32,
1003 database_id: i32,
1004 ) -> Result<Value> {
1005 self.client
1006 .get_raw(&format!(
1007 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/available-target-versions"
1008 ))
1009 .await
1010 }
1011
1012 pub async fn get_upgrade_status(
1017 &self,
1018 subscription_id: i32,
1019 database_id: i32,
1020 ) -> Result<Value> {
1021 self.client
1022 .get_raw(&format!(
1023 "/fixed/subscriptions/{subscription_id}/databases/{database_id}/upgrade"
1024 ))
1025 .await
1026 }
1027
1028 pub async fn upgrade_redis_version(
1033 &self,
1034 subscription_id: i32,
1035 database_id: i32,
1036 target_version: &str,
1037 ) -> Result<Value> {
1038 let request = serde_json::json!({
1039 "targetVersion": target_version
1040 });
1041 self.client
1042 .post_raw(
1043 &format!("/fixed/subscriptions/{subscription_id}/databases/{database_id}/upgrade"),
1044 request,
1045 )
1046 .await
1047 }
1048}