149 lines
5.4 KiB
Python

"""
Routes API pour la gestion des groupes Ansible.
"""
from fastapi import APIRouter, Depends, HTTPException
from app.core.dependencies import verify_api_key
from app.schemas.group import GroupRequest, GroupUpdateRequest, GroupDeleteRequest
from app.services import ansible_service
router = APIRouter()
@router.get("")
async def get_groups(api_key_valid: bool = Depends(verify_api_key)):
"""Récupère la liste de tous les groupes Ansible."""
groups = ansible_service.get_groups()
env_groups = ansible_service.get_env_groups()
role_groups = ansible_service.get_role_groups()
result = []
for group in groups:
group_type = "env" if group in env_groups else ("role" if group in role_groups else "other")
hosts = ansible_service.get_group_hosts(group)
result.append({
"name": group,
"type": group_type,
"display_name": group.replace("env_", "").replace("role_", "").replace("_", " ").title(),
"hosts_count": len(hosts),
"hosts": hosts,
})
return {
"groups": result,
"env_count": len(env_groups),
"role_count": len(role_groups),
}
@router.get("/{group_name}")
async def get_group(group_name: str, api_key_valid: bool = Depends(verify_api_key)):
"""Récupère les détails d'un groupe."""
if not ansible_service.group_exists(group_name):
raise HTTPException(status_code=404, detail=f"Groupe '{group_name}' non trouvé")
env_groups = ansible_service.get_env_groups()
role_groups = ansible_service.get_role_groups()
group_type = "env" if group_name in env_groups else ("role" if group_name in role_groups else "other")
hosts = ansible_service.get_group_hosts(group_name)
return {
"name": group_name,
"type": group_type,
"display_name": group_name.replace("env_", "").replace("role_", "").replace("_", " ").title(),
"hosts_count": len(hosts),
"hosts": hosts,
}
@router.post("")
async def create_group(request: GroupRequest, api_key_valid: bool = Depends(verify_api_key)):
"""Crée un nouveau groupe."""
# Valider le préfixe selon le type
expected_prefix = f"{request.type}_"
if not request.name.startswith(expected_prefix):
raise HTTPException(
status_code=400,
detail=f"Le nom du groupe de type '{request.type}' doit commencer par '{expected_prefix}'"
)
# Vérifier si le groupe existe déjà
if ansible_service.group_exists(request.name):
raise HTTPException(status_code=400, detail=f"Le groupe '{request.name}' existe déjà")
try:
ansible_service.add_group(request.name, request.type)
return {
"message": f"Groupe '{request.name}' créé avec succès",
"group": {
"name": request.name,
"type": request.type,
"hosts_count": 0,
}
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Erreur lors de la création du groupe: {str(e)}")
@router.put("/{group_name}")
async def update_group(
group_name: str,
request: GroupUpdateRequest,
api_key_valid: bool = Depends(verify_api_key)
):
"""Renomme un groupe."""
if not ansible_service.group_exists(group_name):
raise HTTPException(status_code=404, detail=f"Groupe '{group_name}' non trouvé")
# Vérifier que le nouveau nom a le même préfixe
old_prefix = group_name.split("_")[0] + "_" if "_" in group_name else ""
new_prefix = request.new_name.split("_")[0] + "_" if "_" in request.new_name else ""
if old_prefix and old_prefix != new_prefix:
raise HTTPException(
status_code=400,
detail=f"Le nouveau nom doit conserver le même préfixe '{old_prefix}'"
)
# Vérifier si le nouveau nom existe déjà
if ansible_service.group_exists(request.new_name):
raise HTTPException(status_code=400, detail=f"Le groupe '{request.new_name}' existe déjà")
try:
ansible_service.rename_group(group_name, request.new_name)
return {
"message": f"Groupe renommé de '{group_name}' vers '{request.new_name}'",
"old_name": group_name,
"new_name": request.new_name,
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Erreur lors du renommage: {str(e)}")
@router.delete("/{group_name}")
async def delete_group(
group_name: str,
move_hosts_to: str = None,
api_key_valid: bool = Depends(verify_api_key)
):
"""Supprime un groupe."""
if not ansible_service.group_exists(group_name):
raise HTTPException(status_code=404, detail=f"Groupe '{group_name}' non trouvé")
# Vérifier le groupe de destination si spécifié
if move_hosts_to and not ansible_service.group_exists(move_hosts_to):
raise HTTPException(status_code=400, detail=f"Groupe de destination '{move_hosts_to}' non trouvé")
hosts = ansible_service.get_group_hosts(group_name)
try:
ansible_service.delete_group(group_name, move_hosts_to)
return {
"message": f"Groupe '{group_name}' supprimé",
"hosts_moved": len(hosts) if move_hosts_to else 0,
"moved_to": move_hosts_to,
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Erreur lors de la suppression: {str(e)}")