74 lines
2.7 KiB
Python
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)
|