Files
chongming-plugins/aibox_sophon_adapter/router/list_devices.py
T

72 lines
2.7 KiB
Python
Raw Normal View History

2026-07-27 14:28:07 +08:00
"""
查询所有设备状态 — GET /aibox/list_devices
"""
2026-08-23 04:34:38 +08:00
import orjson
2026-07-27 14:28:07 +08:00
import logging
from datetime import datetime
from chongming_worker import rpc_method
logger = logging.getLogger(__name__)
@rpc_method(
subject="aibox_sophon_adapter.list_devices",
method="GET",
summary="查询所有设备状态",
)
async def list_devices(worker_id: str = "") -> dict:
"""返回所有已上报过心跳的设备及其在线状态"""
from ..global_var import db, heartbeat_timeout
devices = []
try:
if db is None:
raise RuntimeError("Database not initialized")
2026-07-27 14:28:07 +08:00
async with db.get_session() as session:
from ..models.orm import BoardHeartbeat
from sqlalchemy import select, desc
2026-07-27 14:28:07 +08:00
stmt = select(BoardHeartbeat).order_by(desc(BoardHeartbeat.updated_at)) # type: ignore
2026-07-27 14:28:07 +08:00
result = await session.execute(stmt)
records = result.scalars().all()
now = datetime.now()
for record in records:
# 检查是否超时
elapsed = (now - record.last_ping_time).total_seconds()
is_online = elapsed <= heartbeat_timeout
ping_data = {}
try:
2026-08-23 04:34:38 +08:00
ping_data = orjson.loads(record.ping_data.encode("utf-8")) if record.ping_data else {}
except orjson.JSONDecodeError:
2026-07-27 14:28:07 +08:00
pass
devices.append({
"board_id": record.board_id,
"board_ip": record.board_ip,
"board_platform": record.board_platform,
"board_type": record.board_type,
"board_temp": record.board_temp,
"status": record.status,
"version": record.version,
"system_info": record.system_info,
"grant_code": record.grant_code,
"grant_desc": record.grant_desc,
"is_online": is_online,
"last_ping_time": record.last_ping_time.isoformat() if record.last_ping_time else None,
"elapsed_seconds": round(elapsed, 1),
"host_disk": ping_data.get("HostDisk", {}),
"host_memory": ping_data.get("HostMemory", []),
"medias_count": len(ping_data.get("Medias", [])),
"tasks_count": len(ping_data.get("Tasks", [])),
"tpu": ping_data.get("Tpu", []),
})
except Exception as e:
logger.error(f"[list_devices] 查询失败: {e}")
return {"devices": [], "total": 0, "error": str(e)}
return {"devices": devices, "total": len(devices)}