52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
"""节点实例管理路由。
|
|
|
|
提供管理后台查看节点实例与手动停止实例的能力。实例生命周期仍由
|
|
NodeManager 控制,路由只转发停止请求。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
from app.db import Database
|
|
from app.node_manager import NodeManager
|
|
|
|
router = APIRouter(prefix="/api/admin/node-instances", tags=["node-instances"])
|
|
|
|
|
|
def _get_db() -> Database:
|
|
"""从应用状态延迟获取数据库实例。"""
|
|
from app.main import app
|
|
|
|
return app.state.db
|
|
|
|
|
|
def _get_manager() -> NodeManager:
|
|
"""从应用状态延迟获取节点管理器。"""
|
|
from app.main import app
|
|
|
|
return app.state.node_manager
|
|
|
|
|
|
@router.get("")
|
|
def list_instances(db: Database = Depends(_get_db)) -> list[dict]:
|
|
"""返回全部节点实例记录。"""
|
|
return db.list_instances()
|
|
|
|
|
|
@router.post("/{instance_id}/stop")
|
|
def stop_instance(
|
|
instance_id: str,
|
|
db: Database = Depends(_get_db),
|
|
manager: NodeManager = Depends(_get_manager),
|
|
) -> dict:
|
|
"""请求停止指定实例;停止后实例记录保留为 stopped 状态。"""
|
|
manager.stop_instance(instance_id)
|
|
instance = next(
|
|
(item for item in db.list_instances() if item["id"] == instance_id),
|
|
None,
|
|
)
|
|
if instance is None:
|
|
raise HTTPException(status_code=404, detail="instance not found")
|
|
return {"stopped": instance_id}
|