Files
getDomain/domain-api/app/api/routes/ops_agent.py
Your Name 7cbde2aa78 d
2026-04-22 14:13:21 +08:00

98 lines
4.7 KiB
Python

from typing import Optional
from fastapi import APIRouter, Header
from app.schemas.common import ApiResponse
from app.services.ops_agent_service import (
agent_append_job_event,
agent_complete_job,
agent_heartbeat,
agent_mark_job_started,
agent_pull_jobs,
agent_pull_runtime_config,
agent_register,
build_node_agent_bootstrap_plan,
issue_node_agent_token,
)
router = APIRouter(tags=["ops-agent"])
def _resolve_agent_token(x_domaincheck_agent_token: Optional[str]) -> str:
return str(x_domaincheck_agent_token or "").strip()
def _build_agent_response(ok: bool, message: str, data: object) -> ApiResponse:
detail_code = None
if isinstance(data, dict):
detail_code = str(data.get("detail_code") or "").strip() or None
return ApiResponse(code=0 if ok else 1, message=message, data=data, detail_code=detail_code)
@router.post("/ops/agent/tokens", response_model=ApiResponse)
def ops_agent_issue_token(payload: dict) -> ApiResponse:
ok, message, data = issue_node_agent_token(
node_code=str(payload.get("node_code") or "").strip(),
issued_by=str(payload.get("issued_by") or "api").strip() or "api",
expires_in_hours=int(payload.get("expires_in_hours") or 72),
metadata=payload.get("metadata") or {},
)
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/bootstrap-plan", response_model=ApiResponse)
def ops_agent_bootstrap_plan(payload: dict) -> ApiResponse:
ok, message, data = build_node_agent_bootstrap_plan(
node_code=str(payload.get("node_code") or "").strip(),
node_region=str(payload.get("node_region") or "mainland").strip() or "mainland",
node_role=str(payload.get("node_role") or "worker").strip() or "worker",
issued_by=str(payload.get("issued_by") or "api").strip() or "api",
expires_in_hours=int(payload.get("expires_in_hours") or 72),
control_plane_base_url=str(payload.get("control_plane_base_url") or "").strip(),
root_dir=str(payload.get("root_dir") or "/opt/domaincheck").strip() or "/opt/domaincheck",
metadata=payload.get("metadata") or {},
)
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/register", response_model=ApiResponse)
def ops_agent_register(payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_register(payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/heartbeat", response_model=ApiResponse)
def ops_agent_heartbeat(payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_heartbeat(payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/pull", response_model=ApiResponse)
def ops_agent_pull(payload: dict, limit: int = 1, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_pull_jobs(payload, token=_resolve_agent_token(x_domaincheck_agent_token), limit=limit)
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/runtime-config", response_model=ApiResponse)
def ops_agent_runtime_config(payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_pull_runtime_config(payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/jobs/{job_id}/start", response_model=ApiResponse)
def ops_agent_job_start(job_id: int, payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_mark_job_started(job_id, payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/jobs/{job_id}/complete", response_model=ApiResponse)
def ops_agent_job_complete(job_id: int, payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_complete_job(job_id, payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)
@router.post("/ops/agent/jobs/{job_id}/events", response_model=ApiResponse)
def ops_agent_job_event(job_id: int, payload: dict, x_domaincheck_agent_token: Optional[str] = Header(default=None)) -> ApiResponse:
ok, message, data = agent_append_job_event(job_id, payload, token=_resolve_agent_token(x_domaincheck_agent_token))
return _build_agent_response(ok, message, data)