- Добавлена колонка 'Тип' во все таблицы истории сборок - Для push операций отображается registry вместо платформ - Сохранение пользователя при создании push лога - Исправлена ошибка с logger в push_docker_image endpoint - Улучшено отображение истории сборок с визуальными индикаторами
87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
"""
|
|
API endpoints для экспорта ролей
|
|
Автор: Сергей Антропов
|
|
Сайт: https://devops.org.ru
|
|
"""
|
|
|
|
from fastapi import APIRouter, Request, HTTPException, Form
|
|
from fastapi.responses import HTMLResponse, JSONResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
import json
|
|
from app.core.config import settings
|
|
from app.services.export_service import ExportService
|
|
|
|
router = APIRouter()
|
|
templates_path = Path(__file__).parent.parent.parent.parent / "templates"
|
|
templates = Jinja2Templates(directory=str(templates_path))
|
|
export_service = ExportService()
|
|
|
|
|
|
@router.get("/roles/{role_name}/export", response_class=HTMLResponse)
|
|
async def export_role_page(request: Request, role_name: str):
|
|
"""Страница экспорта роли"""
|
|
# Проверка существования роли
|
|
roles_dir = settings.PROJECT_ROOT / "roles" / role_name
|
|
if not roles_dir.exists():
|
|
raise HTTPException(status_code=404, detail=f"Роль '{role_name}' не найдена")
|
|
|
|
# Получение доступных компонентов
|
|
components = export_service.get_role_components(role_name)
|
|
|
|
return templates.TemplateResponse(
|
|
"pages/roles/export.html",
|
|
{
|
|
"request": request,
|
|
"role_name": role_name,
|
|
"components": components
|
|
}
|
|
)
|
|
|
|
|
|
@router.post("/api/v1/roles/{role_name}/export")
|
|
async def export_role_api(
|
|
role_name: str,
|
|
repo_url: str = Form(...),
|
|
branch: str = Form("main"),
|
|
version: Optional[str] = Form(None),
|
|
components: str = Form(""), # JSON строка
|
|
include_secrets: bool = Form(False),
|
|
commit_message: Optional[str] = Form(None)
|
|
):
|
|
"""API endpoint для экспорта роли"""
|
|
try:
|
|
# Парсинг компонентов
|
|
components_list = []
|
|
if components:
|
|
components_list = json.loads(components)
|
|
|
|
# Запуск экспорта через Celery (в будущем)
|
|
# Пока синхронно
|
|
result = await export_service.export_role(
|
|
role_name=role_name,
|
|
repo_url=repo_url,
|
|
branch=branch,
|
|
version=version,
|
|
components=components_list if components_list else None,
|
|
include_secrets=include_secrets,
|
|
commit_message=commit_message
|
|
)
|
|
|
|
return JSONResponse(content=result, status_code=200)
|
|
except ValueError as e:
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"Ошибка при экспорте роли: {str(e)}")
|
|
|
|
|
|
@router.get("/api/v1/roles/{role_name}/export/components")
|
|
async def get_role_components_api(role_name: str):
|
|
"""Получение списка компонентов роли"""
|
|
try:
|
|
components = export_service.get_role_components(role_name)
|
|
return {"components": components}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|