64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
"""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}
|