69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
"""
|
|
Schémas Pydantic pour la gestion des groupes Ansible.
|
|
"""
|
|
|
|
from typing import Optional, List
|
|
import re
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
|
|
class GroupRequest(BaseModel):
|
|
"""Requête pour créer un groupe."""
|
|
name: str = Field(..., min_length=3, max_length=50, description="Nom du groupe (ex: env_prod, role_web)")
|
|
type: str = Field(..., description="Type de groupe: 'env' ou 'role'")
|
|
|
|
@field_validator('name')
|
|
@classmethod
|
|
def validate_name(cls, v: str) -> str:
|
|
if not re.match(r'^[a-zA-Z0-9_-]+$', v):
|
|
raise ValueError('Le nom du groupe ne peut contenir que des lettres, chiffres, tirets et underscores')
|
|
return v
|
|
|
|
@field_validator('type')
|
|
@classmethod
|
|
def validate_type(cls, v: str) -> str:
|
|
if v not in ['env', 'role']:
|
|
raise ValueError("Le type doit être 'env' ou 'role'")
|
|
return v
|
|
|
|
|
|
class GroupUpdateRequest(BaseModel):
|
|
"""Requête pour modifier un groupe."""
|
|
new_name: str = Field(..., min_length=3, max_length=50, description="Nouveau nom du groupe")
|
|
|
|
@field_validator('new_name')
|
|
@classmethod
|
|
def validate_new_name(cls, v: str) -> str:
|
|
if not re.match(r'^[a-zA-Z0-9_-]+$', v):
|
|
raise ValueError('Le nom du groupe ne peut contenir que des lettres, chiffres, tirets et underscores')
|
|
return v
|
|
|
|
|
|
class GroupDeleteRequest(BaseModel):
|
|
"""Requête pour supprimer un groupe."""
|
|
move_hosts_to: Optional[str] = Field(default=None, description="Groupe vers lequel déplacer les hôtes")
|
|
|
|
|
|
class GroupResponse(BaseModel):
|
|
"""Réponse API pour un groupe."""
|
|
name: str
|
|
type: str
|
|
display_name: str
|
|
hosts_count: int = 0
|
|
hosts: List[str] = Field(default_factory=list)
|
|
|
|
|
|
class GroupsListResponse(BaseModel):
|
|
"""Réponse API pour la liste des groupes."""
|
|
groups: List[GroupResponse] = Field(default_factory=list)
|
|
env_count: int = 0
|
|
role_count: int = 0
|
|
|
|
|
|
class HostGroupsResponse(BaseModel):
|
|
"""Réponse API pour les groupes disponibles."""
|
|
env_groups: List[str] = Field(default_factory=list)
|
|
role_groups: List[str] = Field(default_factory=list)
|
|
all_groups: List[str] = Field(default_factory=list)
|