| |
| import random |
| from typing import Dict, List, Optional |
|
|
| class InfraSimulator: |
| """Simulates a dynamic infrastructure. Maintains per‑session state.""" |
| def __init__(self): |
| self.reset() |
|
|
| def reset(self): |
| self.components = { |
| "switch-1": {"type": "switch", "status": "up", "connections": ["server-1", "server-2"]}, |
| "server-1": {"type": "server", "status": "up", "connections": ["switch-1"], "services": ["db"]}, |
| "server-2": {"type": "server", "status": "up", "connections": ["switch-1"], "services": ["web"]}, |
| "service-db": {"type": "service", "status": "up", "runs_on": "server-1"}, |
| "service-web": {"type": "service", "status": "up", "runs_on": "server-2"}, |
| } |
| self.fault_mode: Optional[str] = None |
|
|
| def set_fault(self, fault: str): |
| self.reset() |
| self.fault_mode = fault |
| if fault == "switch_down": |
| self.components["switch-1"]["status"] = "down" |
| elif fault == "server_overload": |
| self.components["server-1"]["status"] = "overloaded" |
| elif fault == "cascade": |
| self.components["switch-1"]["status"] = "down" |
| self.components["server-1"]["status"] = "down" |
| self.components["service-db"]["status"] = "down" |
| |
|
|
| def read_state(self) -> Dict: |
| return self.components |