Веб-UI кластера: страница деталей, kubectl по карточкам, мета 3 колонки

- Страница /cluster/<имя>: сводка, ресурсы узлов полосами, отдельные карточки на каждый kubectl get … -o json, рестарт пода.
- API: overview с блоками k8s_*, POST pods/restart, расширенный набор ресурсов (-A).
- Панель: спиннер загрузки, правки дашборда и стилей; документация api_routes, compose и прочие сопутствующие изменения.
This commit is contained in:
Sergey Antropoff
2026-04-04 09:13:08 +03:00
parent 4546f50aef
commit af0d1705cc
17 changed files with 2605 additions and 208 deletions
+23
View File
@@ -22,6 +22,7 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from api.v1.router import api_router
from core.cluster_lifecycle import validate_cluster_name
from core.config import get_settings
_BASE = Path(__file__).resolve().parent
@@ -75,6 +76,28 @@ async def dashboard(request: Request) -> HTMLResponse:
)
@app.get("/cluster/{cluster_name}", response_class=HTMLResponse, summary="Страница кластера")
async def cluster_detail_page(request: Request, cluster_name: str) -> HTMLResponse:
"""Ресурсы узлов, сводка, kubectl (поды, Deployments и др.), действия как в таблице на главной."""
if not _templates_dir.is_dir():
return HTMLResponse(
content="<p>Шаблоны не найдены. Ожидается каталог app/templates/</p>",
status_code=500,
)
n = cluster_name.strip()
if not validate_cluster_name(n):
raise HTTPException(status_code=404, detail="Некорректное имя кластера")
return templates.TemplateResponse(
request,
"cluster_detail.html",
{
"app_title": settings.app_title,
"nav_active": "panel",
"cluster_name": n,
},
)
@app.get("/cluster-create", response_class=HTMLResponse, summary="Создание кластера и задания")
async def cluster_create_page(request: Request) -> HTMLResponse:
"""Форма создания кластера, прогресс и список последних заданий."""