use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub struct AutoScalingConfig {
pub enabled: bool,
pub hpa: HPAConfig,
pub vpa: VPAConfig,
pub cluster_autoscaler: ClusterAutoscalerConfig,
pub custom_metrics: Vec<CustomScalingMetric>,
}
impl Default for AutoScalingConfig {
fn default() -> Self {
Self {
enabled: true,
hpa: HPAConfig::default(),
vpa: VPAConfig::default(),
cluster_autoscaler: ClusterAutoscalerConfig::default(),
custom_metrics: vec![
CustomScalingMetric {
name: "stream_events_per_second".to_string(),
target_value: 1000.0,
metric_type: ScalingMetricType::Value,
},
CustomScalingMetric {
name: "memory_utilization".to_string(),
target_value: 70.0,
metric_type: ScalingMetricType::Utilization,
},
],
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HPAConfig {
pub enabled: bool,
pub min_replicas: u32,
pub max_replicas: u32,
pub target_cpu_utilization: f64,
pub target_memory_utilization: f64,
pub scale_down_stabilization_window: Duration,
pub scale_up_stabilization_window: Duration,
}
impl Default for HPAConfig {
fn default() -> Self {
Self {
enabled: true,
min_replicas: 2,
max_replicas: 100,
target_cpu_utilization: 70.0,
target_memory_utilization: 80.0,
scale_down_stabilization_window: Duration::from_secs(300),
scale_up_stabilization_window: Duration::from_secs(60),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VPAConfig {
pub enabled: bool,
pub update_mode: VPAUpdateMode,
pub resource_policy: VPAResourcePolicy,
}
impl Default for VPAConfig {
fn default() -> Self {
Self {
enabled: false, update_mode: VPAUpdateMode::Auto,
resource_policy: VPAResourcePolicy::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum VPAUpdateMode {
Off,
Initial,
Auto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VPAResourcePolicy {
pub min_allowed: ResourceRequirements,
pub max_allowed: ResourceRequirements,
}
impl Default for VPAResourcePolicy {
fn default() -> Self {
Self {
min_allowed: ResourceRequirements {
cpu: "100m".to_string(),
memory: "128Mi".to_string(),
},
max_allowed: ResourceRequirements {
cpu: "4".to_string(),
memory: "8Gi".to_string(),
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceRequirements {
pub cpu: String,
pub memory: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClusterAutoscalerConfig {
pub enabled: bool,
pub min_nodes: u32,
pub max_nodes: u32,
pub scale_down_delay_after_add: Duration,
pub scale_down_unneeded_time: Duration,
}
impl Default for ClusterAutoscalerConfig {
fn default() -> Self {
Self {
enabled: true,
min_nodes: 3,
max_nodes: 100,
scale_down_delay_after_add: Duration::from_secs(600),
scale_down_unneeded_time: Duration::from_secs(600),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustomScalingMetric {
pub name: String,
pub target_value: f64,
pub metric_type: ScalingMetricType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ScalingMetricType {
Value,
AverageValue,
Utilization,
}