use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
pub struct ServiceMeshConfig {
pub provider: ServiceMeshProvider,
pub enabled: bool,
pub mtls: MutualTLSConfig,
pub traffic_management: TrafficManagementConfig,
pub observability: ServiceMeshObservabilityConfig,
pub security_policies: SecurityPolicyConfig,
}
impl Default for ServiceMeshConfig {
fn default() -> Self {
Self {
provider: ServiceMeshProvider::Istio,
enabled: true,
mtls: MutualTLSConfig::default(),
traffic_management: TrafficManagementConfig::default(),
observability: ServiceMeshObservabilityConfig::default(),
security_policies: SecurityPolicyConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ServiceMeshProvider {
Istio,
Linkerd,
ConsulConnect,
OpenServiceMesh,
Kuma,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MutualTLSConfig {
pub enabled: bool,
pub mode: MutualTLSMode,
pub ca_provider: CertificateAuthorityProvider,
pub cert_rotation_interval: ChronoDuration,
pub key_size: u32,
}
impl Default for MutualTLSConfig {
fn default() -> Self {
Self {
enabled: true,
mode: MutualTLSMode::Strict,
ca_provider: CertificateAuthorityProvider::Istio,
cert_rotation_interval: ChronoDuration::days(30),
key_size: 2048,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MutualTLSMode {
Disabled,
Permissive,
Strict,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CertificateAuthorityProvider {
Istio,
CertManager,
Vault,
External,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrafficManagementConfig {
pub load_balancing: LoadBalancingStrategy,
pub circuit_breaker: CircuitBreakerConfig,
pub retry: RetryConfig,
pub timeout: TimeoutConfig,
pub rate_limiting: ServiceMeshRateLimitConfig,
}
impl Default for TrafficManagementConfig {
fn default() -> Self {
Self {
load_balancing: LoadBalancingStrategy::RoundRobin,
circuit_breaker: CircuitBreakerConfig::default(),
retry: RetryConfig::default(),
timeout: TimeoutConfig::default(),
rate_limiting: ServiceMeshRateLimitConfig::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LoadBalancingStrategy {
RoundRobin,
LeastConnection,
Random,
WeightedRoundRobin,
ConsistentHash,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CircuitBreakerConfig {
pub enabled: bool,
pub consecutive_errors: u32,
pub error_threshold_percentage: f64,
pub min_request_amount: u32,
pub sleep_window: Duration,
}
impl Default for CircuitBreakerConfig {
fn default() -> Self {
Self {
enabled: true,
consecutive_errors: 5,
error_threshold_percentage: 50.0,
min_request_amount: 20,
sleep_window: Duration::from_secs(30),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryConfig {
pub attempts: u32,
pub per_try_timeout: Duration,
pub retry_on: Vec<RetryCondition>,
pub backoff: BackoffStrategy,
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
attempts: 3,
per_try_timeout: Duration::from_secs(5),
retry_on: vec![
RetryCondition::FiveXX,
RetryCondition::GatewayError,
RetryCondition::ConnectFailure,
],
backoff: BackoffStrategy::Exponential {
base_interval: Duration::from_millis(25),
max_interval: Duration::from_secs(30),
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RetryCondition {
FiveXX,
GatewayError,
ConnectFailure,
RefusedStream,
Cancelled,
DeadlineExceeded,
ResourceExhausted,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BackoffStrategy {
Fixed {
interval: Duration,
},
Exponential {
base_interval: Duration,
max_interval: Duration,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeoutConfig {
pub request_timeout: Duration,
pub connection_timeout: Duration,
pub stream_idle_timeout: Duration,
}
impl Default for TimeoutConfig {
fn default() -> Self {
Self {
request_timeout: Duration::from_secs(30),
connection_timeout: Duration::from_secs(10),
stream_idle_timeout: Duration::from_secs(300),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceMeshRateLimitConfig {
pub enabled: bool,
pub requests_per_second: u32,
pub burst_size: u32,
pub fill_interval: Duration,
}
impl Default for ServiceMeshRateLimitConfig {
fn default() -> Self {
Self {
enabled: true,
requests_per_second: 100,
burst_size: 200,
fill_interval: Duration::from_secs(1),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceMeshObservabilityConfig {
pub tracing: TracingConfig,
pub metrics: MetricsConfig,
pub access_logs: AccessLogsConfig,
}
impl Default for ServiceMeshObservabilityConfig {
fn default() -> Self {
Self {
tracing: TracingConfig::default(),
metrics: MetricsConfig::default(),
access_logs: AccessLogsConfig::default(),
}
}
}