diff --git a/dashboard/backend/routers/cc_connect.py b/dashboard/backend/routers/cc_connect.py index 8d59573..bc8361d 100644 --- a/dashboard/backend/routers/cc_connect.py +++ b/dashboard/backend/routers/cc_connect.py @@ -10,15 +10,96 @@ router = APIRouter() client = docker.DockerClient(base_url=DOCKER_HOST, timeout=5) +def _get_cc_connect_container(): + matches = client.containers.list(all=True, filters={"name": "cc-connect"}) + return matches[0] if matches else None + + +@router.post("/start") +def start_cc_connect(): + try: + container = _get_cc_connect_container() + except Exception as exc: + return { + "ok": False, + "status": "down", + "container_status": None, + "error": f"docker check failed: {exc}", + } + + if not container: + return { + "ok": False, + "status": "down", + "container_status": "not_found", + "error": "cc-connect container not found", + } + + try: + container.start() + container.reload() + container_status = container.status + return { + "ok": container_status == "running", + "status": "up" if container_status == "running" else "down", + "container_status": container_status, + "error": None if container_status == "running" else "cc-connect failed to start", + } + except Exception as exc: + return { + "ok": False, + "status": "down", + "container_status": container.status, + "error": f"docker start failed: {exc}", + } + + +@router.post("/stop") +def stop_cc_connect(): + try: + container = _get_cc_connect_container() + except Exception as exc: + return { + "ok": False, + "status": "down", + "container_status": None, + "error": f"docker check failed: {exc}", + } + + if not container: + return { + "ok": False, + "status": "down", + "container_status": "not_found", + "error": "cc-connect container not found", + } + + try: + container.stop() + container.reload() + container_status = container.status + return { + "ok": container_status != "running", + "status": "down", + "container_status": container_status, + "error": None if container_status != "running" else "cc-connect failed to stop", + } + except Exception as exc: + return { + "ok": False, + "status": "down", + "container_status": container.status, + "error": f"docker stop failed: {exc}", + } + + @router.get("/health") async def cc_connect_health(): url = (CC_CONNECT_URL or "").strip() container = None try: - matches = client.containers.list(all=True, filters={"name": "cc-connect"}) - if matches: - container = matches[0] + container = _get_cc_connect_container() except Exception as exc: return { "ok": False, diff --git a/dashboard/frontend/src/lib/api.js b/dashboard/frontend/src/lib/api.js index 2c72c26..30dcb90 100644 --- a/dashboard/frontend/src/lib/api.js +++ b/dashboard/frontend/src/lib/api.js @@ -147,6 +147,14 @@ export function getCcConnectHealth() { return get("/cc-connect/health"); } +export function startCcConnect() { + return post("/cc-connect/start"); +} + +export function stopCcConnect() { + return post("/cc-connect/stop"); +} + export function getInfoEngineItems(params = {}) { const query = new URLSearchParams(); if (params.limit !== undefined) query.set("limit", String(params.limit)); diff --git a/dashboard/frontend/src/routes/CcConnect.svelte b/dashboard/frontend/src/routes/CcConnect.svelte index 237864f..7d72a9e 100644 --- a/dashboard/frontend/src/routes/CcConnect.svelte +++ b/dashboard/frontend/src/routes/CcConnect.svelte @@ -1,10 +1,11 @@