diff --git a/apps/web-dashboard/src/app/chaos/page.tsx b/apps/web-dashboard/src/app/chaos/page.tsx new file mode 100644 index 0000000..f1675a3 --- /dev/null +++ b/apps/web-dashboard/src/app/chaos/page.tsx @@ -0,0 +1,146 @@ +"use client"; + +import { useState } from "react"; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Shield, Zap, Clock, AlertTriangle, Server, Database, Wifi } from "lucide-react"; + +interface Experiment { + id: string; + name: string; + target: string; + type: string; + icon: typeof Server; + description: string; + status: "idle" | "running" | "completed" | "failed"; + lastRun?: string; + duration?: string; +} + +const initialExperiments: Experiment[] = [ + { + id: "exp_001", name: "API Latency Injection", target: "API Server", type: "latency", + icon: Server, description: "Inject 500ms latency on all API endpoints to test client timeout handling.", + status: "idle", lastRun: "2026-04-13 15:00", duration: "5m", + }, + { + id: "exp_002", name: "Database Connection Kill", target: "PostgreSQL", type: "kill", + icon: Database, description: "Terminate database connections to verify reconnection and circuit breaker logic.", + status: "idle", lastRun: "2026-04-12 10:30", duration: "2m", + }, + { + id: "exp_003", name: "Charging Engine Crash", target: "Charging Engine", type: "crash", + icon: Zap, description: "Simulate Rust charging engine crash to validate Go fallback and graceful degradation.", + status: "idle", lastRun: "2026-04-11 09:00", duration: "3m", + }, + { + id: "exp_004", name: "Network Partition", target: "AMF Gateway", type: "partition", + icon: Wifi, description: "Simulate network partition between API server and AMF to test session continuity.", + status: "idle", duration: "10m", + }, + { + id: "exp_005", name: "Redis Cache Flush", target: "Redis", type: "flush", + icon: Database, description: "Flush all Redis keys to test cache miss handling and cold-start performance.", + status: "idle", lastRun: "2026-04-10 14:00", duration: "1m", + }, + { + id: "exp_006", name: "High Load Simulation", target: "API Server", type: "load", + icon: AlertTriangle, description: "Send 10,000 concurrent requests to test rate limiting and autoscaling.", + status: "idle", duration: "15m", + }, +]; + +const statusVariant = (s: string) => + s === "running" ? "warning" : s === "completed" ? "success" : s === "failed" ? "destructive" : "secondary"; + +export default function ChaosPage() { + const [experiments, setExperiments] = useState(initialExperiments); + + const runExperiment = (id: string) => { + setExperiments((prev) => + prev.map((e) => + e.id === id ? { ...e, status: "running" as const } : e + ) + ); + // Simulate completion after a delay + setTimeout(() => { + setExperiments((prev) => + prev.map((e) => + e.id === id + ? { ...e, status: (Math.random() > 0.2 ? "completed" : "failed") as Experiment["status"], lastRun: new Date().toISOString().slice(0, 16).replace("T", " ") } + : e + ) + ); + }, 3000); + }; + + return ( +
Run controlled failure experiments to validate system resilience.
+Experiments Passed
+Experiments Failed
+Currently Running
+{exp.description}
+