use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CloudResourceMonitoringConfig {
pub enabled: bool,
pub resource_types: Vec<ResourceType>,
pub granularity: MonitoringGranularity,
pub usage_tracking: UsageTrackingConfig,
pub capacity_planning: CapacityPlanningConfig,
pub optimization: ResourceOptimizationConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ResourceType {
Compute,
Storage,
Network,
Quantum,
Database,
Memory,
GPU,
FPGA,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MonitoringGranularity {
PerSecond,
PerMinute,
PerHour,
PerDay,
Custom(Duration),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageTrackingConfig {
pub track_utilization: bool,
pub track_allocation: bool,
pub track_efficiency: bool,
pub analytics: UsageAnalyticsConfig,
pub tagging: ResourceTaggingConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageAnalyticsConfig {
pub enabled: bool,
pub methods: Vec<UsageAnalyticsMethod>,
pub frequency: Duration,
pub historical_analysis: HistoricalAnalysisConfig,
pub predictive_analytics: PredictiveAnalyticsConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum UsageAnalyticsMethod {
TrendAnalysis,
SeasonalAnalysis,
AnomalyDetection,
CapacityPlanning,
EfficiencyAnalysis,
CostAnalysis,
ResourceRightSizing,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoricalAnalysisConfig {
pub window: Duration,
pub comparison_periods: Vec<Duration>,
pub statistical_methods: Vec<StatisticalMethod>,
pub retention: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum StatisticalMethod {
Mean,
Median,
StandardDeviation,
Percentiles,
Correlation,
Regression,
TimeSeries,
SeasonalDecomposition,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PredictiveAnalyticsConfig {
pub enabled: bool,
pub horizon: Duration,
pub models: Vec<PredictiveModel>,
pub accuracy_threshold: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PredictiveModel {
LinearRegression,
TimeSeriesForecasting,
MachineLearning,
NeuralNetwork,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceTaggingConfig {
pub auto_tagging: bool,
pub required_tags: Vec<String>,
pub categories: Vec<TagCategory>,
pub validation_rules: Vec<TagValidationRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagCategory {
pub name: String,
pub description: String,
pub allowed_values: Vec<String>,
pub required: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagValidationRule {
pub name: String,
pub key_pattern: String,
pub value_validation: ValueValidation,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ValueValidation {
Regex(String),
Enum(Vec<String>),
Range { min: f64, max: f64 },
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CapacityPlanningConfig {
pub enabled: bool,
pub horizon: Duration,
pub growth_models: Vec<GrowthModel>,
pub threshold_planning: ThresholdPlanningConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum GrowthModel {
Linear,
Exponential,
Seasonal,
MachineLearning,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThresholdPlanningConfig {
pub utilization_thresholds: std::collections::HashMap<ResourceType, f64>,
pub provisioning_lead_time: Duration,
pub buffer_capacity: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceOptimizationConfig {
pub enabled: bool,
pub strategies: Vec<OptimizationStrategy>,
pub automation_level: AutomationLevel,
pub frequency: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptimizationStrategy {
RightSizing,
Consolidation,
ScheduledScaling,
AutoScaling,
ResourcePooling,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AutomationLevel {
Manual,
SemiAutomatic,
Automatic,
FullyAutomated,
}
impl Default for CloudResourceMonitoringConfig {
fn default() -> Self {
Self {
enabled: true,
resource_types: vec![
ResourceType::Compute,
ResourceType::Storage,
ResourceType::Network,
ResourceType::Memory,
],
granularity: MonitoringGranularity::PerMinute,
usage_tracking: UsageTrackingConfig::default(),
capacity_planning: CapacityPlanningConfig::default(),
optimization: ResourceOptimizationConfig::default(),
}
}
}
impl Default for UsageTrackingConfig {
fn default() -> Self {
Self {
track_utilization: true,
track_allocation: true,
track_efficiency: false,
analytics: UsageAnalyticsConfig::default(),
tagging: ResourceTaggingConfig::default(),
}
}
}
impl Default for UsageAnalyticsConfig {
fn default() -> Self {
Self {
enabled: true,
methods: vec![
UsageAnalyticsMethod::TrendAnalysis,
UsageAnalyticsMethod::AnomalyDetection,
],
frequency: Duration::from_secs(3600), historical_analysis: HistoricalAnalysisConfig::default(),
predictive_analytics: PredictiveAnalyticsConfig::default(),
}
}
}
impl Default for HistoricalAnalysisConfig {
fn default() -> Self {
Self {
window: Duration::from_secs(86400 * 30), comparison_periods: vec![
Duration::from_secs(86400), Duration::from_secs(86400 * 7), Duration::from_secs(86400 * 30), ],
statistical_methods: vec![StatisticalMethod::Mean, StatisticalMethod::Percentiles],
retention: Duration::from_secs(86400 * 365), }
}
}
impl Default for PredictiveAnalyticsConfig {
fn default() -> Self {
Self {
enabled: false,
horizon: Duration::from_secs(86400 * 30), models: vec![PredictiveModel::LinearRegression],
accuracy_threshold: 0.8,
}
}
}
impl Default for ResourceTaggingConfig {
fn default() -> Self {
Self {
auto_tagging: false,
required_tags: vec!["Environment".to_string(), "Project".to_string()],
categories: vec![],
validation_rules: vec![],
}
}
}
impl Default for CapacityPlanningConfig {
fn default() -> Self {
Self {
enabled: false,
horizon: Duration::from_secs(86400 * 90), growth_models: vec![GrowthModel::Linear],
threshold_planning: ThresholdPlanningConfig::default(),
}
}
}
impl Default for ThresholdPlanningConfig {
fn default() -> Self {
let mut thresholds = std::collections::HashMap::new();
thresholds.insert(ResourceType::Compute, 80.0);
thresholds.insert(ResourceType::Storage, 85.0);
thresholds.insert(ResourceType::Memory, 75.0);
Self {
utilization_thresholds: thresholds,
provisioning_lead_time: Duration::from_secs(86400), buffer_capacity: 20.0,
}
}
}
impl Default for ResourceOptimizationConfig {
fn default() -> Self {
Self {
enabled: false,
strategies: vec![OptimizationStrategy::RightSizing],
automation_level: AutomationLevel::Manual,
frequency: Duration::from_secs(86400 * 7), }
}
}