149 lines
5.4 KiB
Python
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)}")
|