""" Schémas Pydantic pour les hôtes - modèles API. Ces modèles sont utilisés pour les requêtes/réponses API, distincts des modèles de base de données. """ from datetime import datetime, timezone from typing import Optional, List, Literal from pydantic import BaseModel, Field, ConfigDict, field_validator class Host(BaseModel): """Modèle complet d'un hôte pour l'API.""" id: str name: str ip: str status: Literal["online", "offline", "warning", "unknown"] = "unknown" os: str = "Linux" last_seen: Optional[datetime] = None created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) groups: List[str] = Field(default_factory=list) bootstrap_ok: bool = False bootstrap_date: Optional[datetime] = None model_config = ConfigDict( json_encoders={datetime: lambda v: v.isoformat() if v else None} ) class HostRequest(BaseModel): """Requête de création d'un hôte.""" name: str = Field(..., min_length=3, max_length=100, description="Hostname (ex: server.domain.home)") ip: Optional[str] = Field(default=None, description="Adresse IP ou hostname (optionnel si hostname résolvable)") os: str = Field(default="Linux", min_length=3, max_length=50) ssh_user: Optional[str] = Field(default="root", min_length=1, max_length=50) ssh_port: int = Field(default=22, ge=1, le=65535) description: Optional[str] = Field(default=None, max_length=200) env_group: str = Field(..., description="Groupe d'environnement (ex: env_homelab, env_prod)") role_groups: List[str] = Field(default_factory=list, description="Groupes de rôles (ex: role_proxmox, role_sbc)") class HostUpdateRequest(BaseModel): """Requête de mise à jour d'un hôte.""" env_group: Optional[str] = Field(default=None, description="Nouveau groupe d'environnement") role_groups: Optional[List[str]] = Field(default=None, description="Nouveaux groupes de rôles") ansible_host: Optional[str] = Field(default=None, description="Nouvelle adresse ansible_host") class HostResponse(BaseModel): """Réponse API pour un hôte.""" id: str name: str ip: Optional[str] = None status: str = "unknown" os: str = "Linux" last_seen: Optional[datetime] = None created_at: Optional[datetime] = None groups: List[str] = Field(default_factory=list) bootstrap_ok: bool = False bootstrap_date: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) class AnsibleInventoryHost(BaseModel): """Hôte de l'inventaire Ansible.""" name: str ansible_host: str group: str groups: List[str] = Field(default_factory=list) vars: dict = Field(default_factory=dict)