File size: 3,562 Bytes
9846bab | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | """
Configuration management for ARF Demo
"""
from pydantic import BaseSettings, Field, validator
from typing import Optional, Dict, Any, List
from enum import Enum
import os
class ARFMode(str, Enum):
"""ARF operation modes"""
DEMO = "demo"
OSS = "oss"
ENTERPRISE = "enterprise"
class SafetyMode(str, Enum):
"""Safety modes for execution"""
ADVISORY = "advisory"
APPROVAL = "approval"
AUTONOMOUS = "autonomous"
class Settings(BaseSettings):
"""
Application settings with environment variable support
"""
# ===== System Mode =====
arf_mode: ARFMode = Field(
default=ARFMode.DEMO,
description="ARF operation mode"
)
use_mock_arf: bool = Field(
default=True,
description="Use mock ARF implementation (for demo mode)"
)
# ===== ARF Configuration =====
arf_api_key: Optional[str] = Field(
default=None,
description="ARF API key for real integration"
)
arf_base_url: str = Field(
default="https://api.arf.dev",
description="ARF API base URL"
)
# ===== Business Configuration =====
engineer_hourly_rate: float = Field(
default=150.0,
ge=50.0,
le=500.0,
description="Engineer hourly rate in USD"
)
engineer_annual_cost: float = Field(
default=125000.0,
ge=50000.0,
le=250000.0,
description="Engineer annual cost in USD"
)
default_savings_rate: float = Field(
default=0.82,
ge=0.5,
le=0.95,
description="Default savings rate with ARF"
)
# ===== UI Configuration =====
auto_refresh_seconds: int = Field(
default=30,
ge=5,
le=300,
description="Auto-refresh interval in seconds"
)
max_history_items: int = Field(
default=100,
ge=10,
le=1000,
description="Maximum history items to display"
)
# ===== Demo Configuration =====
default_scenario: str = Field(
default="Cache Miss Storm",
description="Default incident scenario"
)
scenario_config_path: str = Field(
default="config/scenarios",
description="Path to scenario configuration files"
)
# ===== Safety Configuration =====
default_safety_mode: SafetyMode = Field(
default=SafetyMode.ADVISORY,
description="Default safety mode"
)
require_approval: bool = Field(
default=True,
description="Require human approval for execution"
)
# ===== Validation =====
@validator("arf_api_key")
def validate_api_key(cls, v: Optional[str], values: Dict[str, Any]) -> Optional[str]:
if values.get("arf_mode") == ARFMode.ENTERPRISE and not v:
raise ValueError("ARF API key required for Enterprise mode")
return v
@validator("use_mock_arf")
def validate_mock_mode(cls, v: bool, values: Dict[str, Any]) -> bool:
if values.get("arf_mode") == ARFMode.DEMO:
return True
return v
class Config:
env_file = ".env"
env_file_encoding = "utf-8"
case_sensitive = False
use_enum_values = True
# Global settings instance
settings = Settings()
def get_settings() -> Settings:
"""Get settings instance (singleton pattern)"""
return settings
def reload_settings() -> Settings:
"""Reload settings from environment"""
global settings
settings = Settings()
return settings |