Sanitized mirror from private repository - 2026-04-18 11:19:59 UTC
This commit is contained in:
63
dashboard/api/routers/containers.py
Normal file
63
dashboard/api/routers/containers.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""Container listing, logs, and management."""
|
||||
|
||||
from fastapi import APIRouter, Query, HTTPException
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||
|
||||
from lib_bridge import (
|
||||
portainer_list_containers,
|
||||
portainer_get_container_logs,
|
||||
portainer_restart_container,
|
||||
ENDPOINTS,
|
||||
)
|
||||
|
||||
router = APIRouter(tags=["containers"])
|
||||
|
||||
|
||||
@router.get("/containers")
|
||||
def list_containers(endpoint: str | None = None):
|
||||
"""List all containers across endpoints, optional endpoint filter."""
|
||||
targets = [endpoint] if endpoint and endpoint in ENDPOINTS else list(ENDPOINTS)
|
||||
results = []
|
||||
for ep in targets:
|
||||
try:
|
||||
containers = portainer_list_containers(ep)
|
||||
for c in containers:
|
||||
names = c.get("Names", [])
|
||||
name = names[0].lstrip("/") if names else c.get("Id", "")[:12]
|
||||
results.append({
|
||||
"id": c.get("Id", "")[:12],
|
||||
"name": name,
|
||||
"image": c.get("Image", ""),
|
||||
"state": c.get("State", ""),
|
||||
"status": c.get("Status", ""),
|
||||
"endpoint": ep,
|
||||
})
|
||||
except Exception as e:
|
||||
results.append({"endpoint": ep, "error": str(e)})
|
||||
return results
|
||||
|
||||
|
||||
@router.get("/containers/{container_id}/logs")
|
||||
def container_logs(container_id: str, endpoint: str = Query(...)):
|
||||
"""Get container logs. Requires endpoint query param."""
|
||||
if endpoint not in ENDPOINTS:
|
||||
raise HTTPException(400, f"Unknown endpoint: {endpoint}")
|
||||
try:
|
||||
logs = portainer_get_container_logs(endpoint, container_id)
|
||||
return {"container_id": container_id, "endpoint": endpoint, "logs": logs}
|
||||
except Exception as e:
|
||||
raise HTTPException(502, f"Failed to get logs: {e}")
|
||||
|
||||
|
||||
@router.post("/containers/{container_id}/restart")
|
||||
def restart_container(container_id: str, endpoint: str = Query(...)):
|
||||
"""Restart a container. Requires endpoint query param."""
|
||||
if endpoint not in ENDPOINTS:
|
||||
raise HTTPException(400, f"Unknown endpoint: {endpoint}")
|
||||
success = portainer_restart_container(endpoint, container_id)
|
||||
if not success:
|
||||
raise HTTPException(502, "Restart failed")
|
||||
return {"status": "restarted", "container_id": container_id, "endpoint": endpoint}
|
||||
Reference in New Issue
Block a user