74 lines
2.7 KiB
Python

"""
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)