use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CloudCostMonitoringConfig {
pub enabled: bool,
pub granularity: CostTrackingGranularity,
pub budget_tracking: BudgetTrackingConfig,
pub optimization_tracking: CostOptimizationTrackingConfig,
pub allocation: CostAllocationConfig,
pub billing: BillingIntegrationConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CostTrackingGranularity {
PerHour,
PerDay,
PerWeek,
PerMonth,
PerProject,
PerDepartment,
PerUser,
PerResource,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetTrackingConfig {
pub track_utilization: bool,
pub track_variance: bool,
pub forecast_consumption: bool,
pub alert_thresholds: Vec<f64>,
pub budget_periods: Vec<BudgetPeriod>,
pub multi_level: MultilevelBudgetConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetPeriod {
pub name: String,
pub duration: Duration,
pub amount: f64,
pub currency: String,
pub rollover_policy: RolloverPolicy,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum RolloverPolicy {
NoRollover,
FullRollover,
PartialRollover(f64), Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultilevelBudgetConfig {
pub enabled: bool,
pub levels: Vec<BudgetLevel>,
pub allocation_strategies: Vec<AllocationStrategy>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BudgetLevel {
pub name: String,
pub parent: Option<String>,
pub amount: f64,
pub allocation_rules: Vec<AllocationRule>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AllocationStrategy {
EqualDistribution,
WeightedDistribution,
UsageBased,
PriorityBased,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AllocationRule {
pub name: String,
pub targets: Vec<String>,
pub percentage: f64,
pub conditions: Vec<AllocationCondition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AllocationCondition {
pub condition_type: ConditionType,
pub value: String,
pub operator: ComparisonOperator,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConditionType {
ResourceType,
Department,
Project,
User,
Tag,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ComparisonOperator {
Equals,
NotEquals,
Contains,
StartsWith,
EndsWith,
GreaterThan,
LessThan,
In(Vec<String>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostOptimizationTrackingConfig {
pub track_opportunities: bool,
pub track_implementations: bool,
pub roi_tracking: ROITrackingConfig,
pub recommendations: OptimizationRecommendationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ROITrackingConfig {
pub calculate_roi: bool,
pub calculation_period: Duration,
pub include_indirect_benefits: bool,
pub metrics: Vec<ROIMetric>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ROIMetric {
CostSavings,
ProductivityGains,
QualityImprovements,
RiskReduction,
TimeToMarket,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationRecommendationConfig {
pub enabled: bool,
pub types: Vec<RecommendationType>,
pub frequency: Duration,
pub savings_threshold: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RecommendationType {
RightSizing,
ReservedInstances,
SpotInstances,
ScheduledShutdown,
StorageOptimization,
NetworkOptimization,
QuantumCircuitOptimization,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostAllocationConfig {
pub enabled: bool,
pub methods: Vec<CostAllocationMethod>,
pub tag_based: TagBasedAllocationConfig,
pub usage_based: UsageBasedAllocationConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CostAllocationMethod {
Direct,
Proportional,
ActivityBased,
TagBased,
UsageBased,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TagBasedAllocationConfig {
pub primary_tags: Vec<String>,
pub secondary_tags: Vec<String>,
pub default_allocation: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageBasedAllocationConfig {
pub metrics: Vec<AllocationMetric>,
pub weights: std::collections::HashMap<AllocationMetric, f64>,
pub frequency: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AllocationMetric {
CPUHours,
MemoryHours,
StorageGB,
NetworkGBTransferred,
QuantumCircuitExecutions,
DatabaseQueries,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BillingIntegrationConfig {
pub enabled: bool,
pub providers: Vec<BillingProvider>,
pub frequency: BillingFrequency,
pub cost_center_mapping: CostCenterMappingConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BillingProvider {
AWS,
Azure,
GCP,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BillingFrequency {
RealTime,
Hourly,
Daily,
Weekly,
Monthly,
Custom(Duration),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostCenterMappingConfig {
pub rules: Vec<CostCenterRule>,
pub default_cost_center: String,
pub validation: CostCenterValidationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostCenterRule {
pub name: String,
pub conditions: Vec<AllocationCondition>,
pub target_cost_center: String,
pub priority: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CostCenterValidationConfig {
pub require_valid: bool,
pub valid_centers: Vec<String>,
pub validation_frequency: Duration,
}
impl Default for CloudCostMonitoringConfig {
fn default() -> Self {
Self {
enabled: true,
granularity: CostTrackingGranularity::PerDay,
budget_tracking: BudgetTrackingConfig::default(),
optimization_tracking: CostOptimizationTrackingConfig::default(),
allocation: CostAllocationConfig::default(),
billing: BillingIntegrationConfig::default(),
}
}
}
impl Default for BudgetTrackingConfig {
fn default() -> Self {
Self {
track_utilization: true,
track_variance: true,
forecast_consumption: false,
alert_thresholds: vec![50.0, 75.0, 90.0, 100.0],
budget_periods: vec![],
multi_level: MultilevelBudgetConfig::default(),
}
}
}
impl Default for MultilevelBudgetConfig {
fn default() -> Self {
Self {
enabled: false,
levels: vec![],
allocation_strategies: vec![AllocationStrategy::EqualDistribution],
}
}
}
impl Default for CostOptimizationTrackingConfig {
fn default() -> Self {
Self {
track_opportunities: true,
track_implementations: false,
roi_tracking: ROITrackingConfig::default(),
recommendations: OptimizationRecommendationConfig::default(),
}
}
}
impl Default for ROITrackingConfig {
fn default() -> Self {
Self {
calculate_roi: false,
calculation_period: Duration::from_secs(86400 * 30), include_indirect_benefits: false,
metrics: vec![ROIMetric::CostSavings],
}
}
}
impl Default for OptimizationRecommendationConfig {
fn default() -> Self {
Self {
enabled: false,
types: vec![RecommendationType::RightSizing],
frequency: Duration::from_secs(86400 * 7), savings_threshold: 100.0, }
}
}
impl Default for CostAllocationConfig {
fn default() -> Self {
Self {
enabled: false,
methods: vec![CostAllocationMethod::TagBased],
tag_based: TagBasedAllocationConfig::default(),
usage_based: UsageBasedAllocationConfig::default(),
}
}
}
impl Default for TagBasedAllocationConfig {
fn default() -> Self {
Self {
primary_tags: vec!["Project".to_string(), "Department".to_string()],
secondary_tags: vec!["Environment".to_string()],
default_allocation: "Unallocated".to_string(),
}
}
}
impl Default for UsageBasedAllocationConfig {
fn default() -> Self {
let mut weights = std::collections::HashMap::new();
weights.insert(AllocationMetric::CPUHours, 0.4);
weights.insert(AllocationMetric::MemoryHours, 0.3);
weights.insert(AllocationMetric::StorageGB, 0.2);
weights.insert(AllocationMetric::NetworkGBTransferred, 0.1);
Self {
metrics: vec![
AllocationMetric::CPUHours,
AllocationMetric::MemoryHours,
AllocationMetric::StorageGB,
],
weights,
frequency: Duration::from_secs(3600), }
}
}
impl Default for BillingIntegrationConfig {
fn default() -> Self {
Self {
enabled: false,
providers: vec![],
frequency: BillingFrequency::Daily,
cost_center_mapping: CostCenterMappingConfig::default(),
}
}
}
impl Default for CostCenterMappingConfig {
fn default() -> Self {
Self {
rules: vec![],
default_cost_center: "Default".to_string(),
validation: CostCenterValidationConfig::default(),
}
}
}
impl Default for CostCenterValidationConfig {
fn default() -> Self {
Self {
require_valid: false,
valid_centers: vec![],
validation_frequency: Duration::from_secs(86400), }
}
}