from __future__ import annotations from datetime import datetime from enum import StrEnum from pydantic import BaseModel, Field, JsonValue class SelfCheckStatus(StrEnum): PASS = "pass" # noqa: S105 - diagnostic status, not a credential WARN = "warn" FAIL = "fail" UNKNOWN = "unknown" class SelfCheckKey(StrEnum): API = "api" DATABASE = "database" REDIS = "redis" MANIFESTS = "manifests" STORAGE = "storage" NODES = "nodes" SCHEDULER = "scheduler" DEPLOYMENTS = "deployments" BACKUP = "backup" CREDENTIALS = "credentials" CONFIGURATION = "configuration" RELEASE = "release" class SelfCheckActionCode(StrEnum): NONE_REQUIRED = "none_required" REVIEW_API_IDENTITY = "review_api_identity" CHECK_DATABASE = "check_database" CHECK_REDIS = "check_redis" REVIEW_MANIFESTS = "review_manifests" REVIEW_STORAGE = "review_storage" REVIEW_NODE_FRESHNESS = "review_node_freshness" REVIEW_SCHEDULER_INPUTS = "review_scheduler_inputs" REVIEW_DEPLOYMENTS = "review_deployments" VERIFY_BACKUP_PAYLOAD = "verify_backup_payload" REVIEW_CREDENTIALS = "review_credentials" COMPLETE_CONFIGURATION = "complete_configuration" VERIFY_RELEASE_IDENTITY = "verify_release_identity" class SelfCheckOverall(StrEnum): HEALTHY = "healthy" DEGRADED = "degraded" UNHEALTHY = "unhealthy" class SelfCheckNextAction(BaseModel): code: SelfCheckActionCode summary: str class SelfCheckResult(BaseModel): key: SelfCheckKey label: str status: SelfCheckStatus summary: str detail: str | None = None evidence: dict[str, JsonValue] = Field(default_factory=dict) next_action: SelfCheckNextAction class SelfCheckReport(BaseModel): observed_at: datetime overall: SelfCheckOverall read_only: bool = True checks: list[SelfCheckResult] = Field(default_factory=list)