config.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. """Orchestration configuration."""
  2. from dataclasses import dataclass
  3. from math import isfinite
  4. from typing import Optional
  5. @dataclass(frozen=True)
  6. class OrchestrationConfig:
  7. max_parallel_tasks: int = 4
  8. max_repair_continuations: int = 1
  9. default_worker_preset: str = "worker"
  10. default_validator_preset: str = "validator"
  11. worker_timeout_seconds: Optional[float] = None
  12. validator_timeout_seconds: Optional[float] = None
  13. stop_grace_seconds: float = 5.0
  14. def __post_init__(self) -> None:
  15. if isinstance(self.max_parallel_tasks, bool) or self.max_parallel_tasks < 1:
  16. raise ValueError("max_parallel_tasks must be at least 1")
  17. if (
  18. isinstance(self.max_repair_continuations, bool)
  19. or self.max_repair_continuations < 0
  20. ):
  21. raise ValueError("max_repair_continuations cannot be negative")
  22. for name, value in (
  23. ("worker_timeout_seconds", self.worker_timeout_seconds),
  24. ("validator_timeout_seconds", self.validator_timeout_seconds),
  25. ):
  26. if value is not None and (
  27. isinstance(value, bool) or not isfinite(value) or value <= 0
  28. ):
  29. raise ValueError(f"{name} must be positive when configured")
  30. if (
  31. isinstance(self.stop_grace_seconds, bool)
  32. or not isfinite(self.stop_grace_seconds)
  33. or self.stop_grace_seconds < 0
  34. ):
  35. raise ValueError("stop_grace_seconds must be finite and non-negative")