use crate::types::{Link, ProcessorResponse};
use crate::{CloudClient, Result};
use async_stream::try_stream;
use futures_core::Stream;
use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountSubscriptionDatabases {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(default, deserialize_with = "deserialize_subscription_info")]
pub subscription: Vec<SubscriptionDatabasesInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionDatabasesInfo {
pub subscription_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub number_of_databases: Option<i32>,
#[serde(default)]
pub databases: Vec<Database>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
fn deserialize_subscription_info<'de, D>(
deserializer: D,
) -> std::result::Result<Vec<SubscriptionDatabasesInfo>, D::Error>
where
D: Deserializer<'de>,
{
let value: Option<Value> = Option::deserialize(deserializer)?;
match value {
None => Ok(Vec::new()),
Some(Value::Array(arr)) => {
serde_json::from_value(Value::Array(arr)).map_err(serde::de::Error::custom)
}
Some(Value::Object(obj)) => {
let item: SubscriptionDatabasesInfo =
serde_json::from_value(Value::Object(obj)).map_err(serde::de::Error::custom)?;
Ok(vec![item])
}
Some(other) => Err(serde::de::Error::custom(format!(
"expected array or object for subscription, got {other:?}"
))),
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LocalThroughput {
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub write_operations_per_second: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_operations_per_second: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseTagUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Tag {
pub key: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CrdbFlushRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseCertificate {
#[serde(skip_serializing_if = "Option::is_none")]
pub public_certificate_pem_string: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseTagsUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
pub tags: Vec<Tag>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseSyncSourceSpec {
pub endpoint: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub encryption: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_cert: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseCertificateSpec {
pub public_certificate_pem_string: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudTag {
#[serde(skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BdbVersionUpgradeStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_redis_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub progress: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub upgrade_status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CrdbUpdatePropertiesRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dry_run: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_limit_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dataset_size_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_ssl_certificate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_tls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regions: Option<Vec<LocalRegionProperties>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_eviction_policy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseSlowLogEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseTagCreateRequest {
pub key: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseThroughputSpec {
pub by: String,
pub value: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseBackupConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub active: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub interval: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backup_interval: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_utc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub database_backup_time_utc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub storage_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backup_storage_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub storage_path: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseModuleSpec {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReplicaOfSpec {
pub sync_sources: Vec<DatabaseSyncSourceSpec>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegexRule {
pub ordinal: i32,
pub pattern: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Backup {
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_remote_backup: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_utc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub interval: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Security {
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_default_user: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ssl_client_authentication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tls_client_authentication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_ips: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_tls: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Clustering {
#[serde(skip_serializing_if = "Option::is_none")]
pub number_of_shards: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regex_rules: Option<Vec<RegexRule>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hashing_policy: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ActiveActiveDatabase {
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub protocol: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_storage: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_active_redis: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub activated_on: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_modified: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_eviction_policy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<Security>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modules: Option<Vec<DatabaseModuleSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_enable_default_user: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub crdb_databases: Option<Vec<CrdbDatabase>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_minor_version_upgrade: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CrdbDatabase {
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_version_compliance: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub public_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub private_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_limit_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dataset_size_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_used_in_mb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_operations_per_second: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub write_operations_per_second: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<Security>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backup: Option<Backup>,
#[serde(skip_serializing_if = "Option::is_none")]
pub query_performance_factor: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseBackupRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub region_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub adhoc_backup_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Database {
pub database_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resp_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_limit_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dataset_size_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_used_in_mb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub private_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub public_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_eviction_policy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub protocol: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub support_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_tls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub throughput_measurement: Option<DatabaseThroughputSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_throughput_measurement: Option<Vec<LocalThroughput>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub average_item_size_in_bytes: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub periodic_backup_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remote_backup: Option<DatabaseBackupConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_ssl_certificate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sasl_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sasl_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modules: Option<Vec<DatabaseModuleSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sharding_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub query_performance_factor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replica_of: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replica: Option<ReplicaOfSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_default_user: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_active_redis: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub memory_storage: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redis_version_compliance: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_minor_version_upgrade: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub number_of_shards: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regex_rules: Option<Vec<RegexRule>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ssl_client_authentication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tls_client_authentication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub activated: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_modified: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseAlertSpec {
pub name: String,
pub value: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseCreateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub dry_run: Option<bool>,
#[builder(setter(into))]
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub protocol: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub port: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub memory_limit_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub dataset_size_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub redis_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub resp_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub support_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub data_eviction_policy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replica_of: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replica: Option<ReplicaOfSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub throughput_measurement: Option<DatabaseThroughputSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub local_throughput_measurement: Option<Vec<LocalThroughput>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub average_item_size_in_bytes: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub periodic_backup_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub remote_backup: Option<DatabaseBackupConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub client_ssl_certificate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub enable_tls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub sasl_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub sasl_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub modules: Option<Vec<DatabaseModuleSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub sharding_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub query_performance_factor: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseImportRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub database_id: Option<i32>,
#[builder(setter(into))]
pub source_type: String,
pub import_from_uri: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudTags {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseUpgradeRedisVersionRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
pub target_redis_version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseSlowLogEntries {
#[serde(skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<DatabaseSlowLogEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LocalRegionProperties {
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remote_backup: Option<DatabaseBackupConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_throughput_measurement: Option<LocalThroughput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resp_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TaskStateUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub task_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<ProcessorResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TypedBuilder)]
#[serde(rename_all = "camelCase")]
pub struct DatabaseUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub dry_run: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub memory_limit_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub dataset_size_in_gb: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub resp_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub throughput_measurement: Option<DatabaseThroughputSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub data_persistence: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub data_eviction_policy: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replication: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub regex_rules: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replica_of: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub replica: Option<ReplicaOfSpec>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub support_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub use_external_endpoint_for_oss_cluster_api: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub sasl_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub sasl_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub source_ip: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub client_ssl_certificate: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub client_tls_certificates: Option<Vec<DatabaseCertificateSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub enable_tls: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub enable_default_user: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub periodic_backup_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub remote_backup: Option<DatabaseBackupConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub alerts: Option<Vec<DatabaseAlertSpec>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option, into))]
pub query_performance_factor: Option<String>,
}
pub struct DatabaseHandler {
client: CloudClient,
}
impl DatabaseHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_subscription_databases(
&self,
subscription_id: i32,
offset: Option<i32>,
limit: Option<i32>,
) -> Result<AccountSubscriptionDatabases> {
let mut query = Vec::new();
if let Some(v) = offset {
query.push(format!("offset={v}"));
}
if let Some(v) = limit {
query.push(format!("limit={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases{query_string}"
))
.await
}
pub async fn create_database(
&self,
subscription_id: i32,
request: &DatabaseCreateRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/databases"),
request,
)
.await
}
pub async fn delete_database_by_id(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}"
))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn get_subscription_database_by_id(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<Database> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}"
))
.await
}
pub async fn update_database(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(
&format!("/subscriptions/{subscription_id}/databases/{database_id}"),
request,
)
.await
}
pub async fn get_database_backup_status(
&self,
subscription_id: i32,
database_id: i32,
region_name: Option<String>,
) -> Result<TaskStateUpdate> {
let mut query = Vec::new();
if let Some(v) = region_name {
query.push(format!("regionName={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/backup{query_string}"
))
.await
}
pub async fn backup_database(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseBackupRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/backup"),
request,
)
.await
}
pub async fn get_subscription_database_certificate(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<DatabaseCertificate> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/certificate"
))
.await
}
pub async fn flush_crdb(
&self,
subscription_id: i32,
database_id: i32,
request: &CrdbFlushRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/flush"),
request,
)
.await
}
pub async fn get_database_import_status(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<TaskStateUpdate> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/import"
))
.await
}
pub async fn import_database(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseImportRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/import"),
request,
)
.await
}
pub async fn update_crdb_local_properties(
&self,
subscription_id: i32,
database_id: i32,
request: &CrdbUpdatePropertiesRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/regions"),
request,
)
.await
}
pub async fn get_slow_log(
&self,
subscription_id: i32,
database_id: i32,
region_name: Option<String>,
) -> Result<DatabaseSlowLogEntries> {
let mut query = Vec::new();
if let Some(v) = region_name {
query.push(format!("regionName={v}"));
}
let query_string = if query.is_empty() {
String::new()
} else {
format!("?{}", query.join("&"))
};
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/slow-log{query_string}"
))
.await
}
pub async fn get_tags(&self, subscription_id: i32, database_id: i32) -> Result<CloudTags> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/tags"
))
.await
}
pub async fn create_tag(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseTagCreateRequest,
) -> Result<CloudTag> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/tags"),
request,
)
.await
}
pub async fn update_tags(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseTagsUpdateRequest,
) -> Result<CloudTags> {
self.client
.put(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/tags"),
request,
)
.await
}
pub async fn delete_tag(
&self,
subscription_id: i32,
database_id: i32,
tag_key: String,
) -> Result<HashMap<String, Value>> {
let response = self
.client
.delete_raw(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/tags/{tag_key}"
))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn update_tag(
&self,
subscription_id: i32,
database_id: i32,
tag_key: String,
request: &DatabaseTagUpdateRequest,
) -> Result<CloudTag> {
self.client
.put(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/tags/{tag_key}"),
request,
)
.await
}
pub async fn get_database_redis_version_upgrade_status(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<BdbVersionUpgradeStatus> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/upgrade"
))
.await
}
pub async fn upgrade_database_redis_version(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseUpgradeRedisVersionRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/upgrade"),
request,
)
.await
}
pub async fn get_available_target_versions(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<Value> {
self.client
.get_raw(&format!(
"/subscriptions/{subscription_id}/databases/{database_id}/available-target-versions"
))
.await
}
pub async fn flush_database(
&self,
subscription_id: i32,
database_id: i32,
) -> Result<TaskStateUpdate> {
self.client
.put_raw(
&format!("/subscriptions/{subscription_id}/databases/{database_id}/flush"),
serde_json::json!({}),
)
.await
.and_then(|v| serde_json::from_value(v).map_err(Into::into))
}
pub fn stream_databases(
&self,
subscription_id: i32,
) -> impl Stream<Item = Result<Database>> + '_ {
self.stream_databases_with_page_size(subscription_id, 100)
}
pub fn stream_databases_with_page_size(
&self,
subscription_id: i32,
page_size: i32,
) -> impl Stream<Item = Result<Database>> + '_ {
try_stream! {
let mut offset = 0;
loop {
let response = self
.get_subscription_databases(subscription_id, Some(offset), Some(page_size))
.await?;
let databases = Self::extract_databases_from_response(&response);
if databases.is_empty() {
break;
}
let count = databases.len();
for db in databases {
yield db;
}
#[allow(clippy::cast_sign_loss)]
if count < page_size as usize {
break;
}
offset += page_size;
}
}
}
pub async fn get_all_databases(&self, subscription_id: i32) -> Result<Vec<Database>> {
let mut databases = Vec::new();
let mut offset = 0;
let page_size = 100;
loop {
let response = self
.get_subscription_databases(subscription_id, Some(offset), Some(page_size))
.await?;
let page = Self::extract_databases_from_response(&response);
let count = page.len();
databases.extend(page);
#[allow(clippy::cast_sign_loss)]
if count < page_size as usize {
break;
}
offset += page_size;
}
Ok(databases)
}
fn extract_databases_from_response(response: &AccountSubscriptionDatabases) -> Vec<Database> {
response
.subscription
.first()
.map(|sub| sub.databases.clone())
.unwrap_or_default()
}
pub async fn list(&self, subscription_id: i32) -> Result<Vec<Database>> {
let response = self
.get_subscription_databases(subscription_id, None, None)
.await?;
Ok(Self::extract_databases_from_response(&response))
}
pub async fn get(&self, subscription_id: i32, database_id: i32) -> Result<Database> {
self.get_subscription_database_by_id(subscription_id, database_id)
.await
}
pub async fn create(
&self,
subscription_id: i32,
request: &DatabaseCreateRequest,
) -> Result<TaskStateUpdate> {
self.create_database(subscription_id, request).await
}
pub async fn update(
&self,
subscription_id: i32,
database_id: i32,
request: &DatabaseUpdateRequest,
) -> Result<TaskStateUpdate> {
self.update_database(subscription_id, database_id, request)
.await
}
pub async fn delete(&self, subscription_id: i32, database_id: i32) -> Result<TaskStateUpdate> {
self.delete_database_by_id(subscription_id, database_id)
.await
}
}