openenv / server /conditions /crash_loop.py
Sandeep Suresh
Renamed COEnv with coenv
0394a5e
"""
CrashLoopCondition - Simulates pods stuck in CrashLoopBackOff
"""
from typing import Dict, List, Any, Optional
from ..coenv_environment import World
class CrashLoopCondition:
"""Injects CrashLoopBackOff failures into pods"""
def __init__(self, world: World, config: Dict[str, Any]):
self.world = world
self.config = config
def inject(self, target_deployment: Optional[str] = None, failure_rate: Optional[float] = None):
"""
Inject crash loop failures into pods
Args:
target_deployment: Specific deployment to target (None for random)
failure_rate: Probability of each pod failing (0.0-1.0)
"""
if failure_rate is None:
failure_rate = self.config.get("crash_loop_failure_rate", 0.8)
else:
failure_rate = float(failure_rate)
deployments = self.world.get_deployments()
if target_deployment is not None:
target_deps = [d for d in deployments if d.name == target_deployment]
else:
target_deps = [self.world.rng.choice(deployments)] if deployments else []
for deployment in target_deps:
pods = [p for p in self.world.get_pods() if p.deployment == deployment.name]
for pod in pods:
if failure_rate is not None and float(self.world.rng.random()) < failure_rate:
patch = {
"status": "CrashLoopBackOff",
"restarts": int(self.world.rng.integers(5, 21))
}
self.world.apply_patch("pod", pod.name, patch)
self._add_crashloop_event(pod.name)
def _add_crashloop_event(self, pod_name: str):
"""Add a crashloop event"""
from ..models import ClusterEvent
from datetime import datetime
event = ClusterEvent(
event_id=f"event-crashloop-{int(self.world.rng.integers(1000, 10000))}",
timestamp=datetime.now().isoformat(),
type="Warning",
reason="BackOff",
message=f"Back-off restarting failed container pod/{pod_name}",
involved_object=pod_name
)
self.world.events.append(event)