70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
"""
|
|||
|
|
查询所有设备状态 — GET /aibox/list_devices
|
||
|
|
"""
|
||
|
|
import json
|
||
|
|
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:
|
||
|
|
async with db.get_session() as session:
|
||
|
|
from ..models.orm import BoardHeartbeat
|
||
|
|
from sqlalchemy import select
|
||
|
|
|
||
|
|
stmt = select(BoardHeartbeat).order_by(BoardHeartbeat.updated_at.desc())
|
||
|
|
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:
|
||
|
|
ping_data = json.loads(record.ping_data) if record.ping_data else {}
|
||
|
|
except json.JSONDecodeError:
|
||
|
|
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)}
|