142 lines
4.4 KiB
Python
142 lines
4.4 KiB
Python
"""可重复执行的演示数据。"""
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from .enums import DutStatus, HostStatus, PowerState
|
|
from .models import Dut, FirmwareArtifact, OobController, TestHost, Workflow, utcnow
|
|
|
|
|
|
def _spec_hash(spec: dict) -> str:
|
|
raw = json.dumps(spec, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
|
|
return hashlib.sha256(raw.encode("utf-8")).hexdigest()
|
|
|
|
|
|
async def ensure_seed_data(session: AsyncSession) -> None:
|
|
existing = await session.scalar(select(Workflow.id).limit(1))
|
|
if existing:
|
|
return
|
|
|
|
oob = OobController(
|
|
name="OOB-05",
|
|
kind="simulated",
|
|
endpoint="sim://oob-05",
|
|
capabilities={"power": True, "reset": True, "atx": True, "ac": True, "hdmi": True},
|
|
status=HostStatus.ONLINE.value,
|
|
power_state=PowerState.ON.value,
|
|
last_seen_at=utcnow(),
|
|
temperature_c=42.6,
|
|
)
|
|
session.add(oob)
|
|
await session.flush()
|
|
|
|
host = TestHost(
|
|
name="WS-05",
|
|
os_family="linux",
|
|
os_version="Ubuntu 22.04.4 LTS",
|
|
kernel="6.8.0-40-generic",
|
|
cpu="Intel Core i7-13700",
|
|
motherboard="FlashOps SIM-X1",
|
|
bios_version="F26b",
|
|
agent_version="0.1.0-sim",
|
|
ip_address="192.0.2.15",
|
|
status=HostStatus.ONLINE.value,
|
|
last_heartbeat_at=utcnow(),
|
|
oob_controller_id=oob.id,
|
|
toolchain={"fio": "3.36", "nvme-cli": "2.9.1"},
|
|
labels={"system_device_paths": ["/dev/nvme0n1"]},
|
|
)
|
|
session.add(host)
|
|
await session.flush()
|
|
|
|
dut = Dut(
|
|
serial="S6XNNA0T609",
|
|
model="NV-E1T92",
|
|
vendor="Lab Sample",
|
|
capacity_gb=1920,
|
|
form_factor="U.2",
|
|
current_firmware="3.2.1",
|
|
bdf="0000:03:00.0",
|
|
device_path="/dev/nvme1n1",
|
|
test_host_id=host.id,
|
|
status=DutStatus.IDLE.value,
|
|
allow_destructive=True,
|
|
health={"temperature_c": 43, "percentage_used": 12, "critical_warning": 0},
|
|
labels={"purpose": "test-only"},
|
|
)
|
|
session.add(dut)
|
|
|
|
firmware_a = FirmwareArtifact(
|
|
version="3.2.1",
|
|
label="A / 基线",
|
|
sha256="4bd1" + "0" * 56 + "08ce",
|
|
signature="simulated-valid-signature",
|
|
applicable_models=[dut.model],
|
|
file_uri="sim://firmware/FW_3.2.1.bin",
|
|
uploaded_by="seed",
|
|
)
|
|
firmware_b = FirmwareArtifact(
|
|
version="3.3.0-rc3",
|
|
label="B / 候选",
|
|
sha256="9f2c" + "0" * 56 + "41aa",
|
|
signature="simulated-valid-signature",
|
|
applicable_models=[dut.model],
|
|
file_uri="sim://firmware/FW_3.3.0-rc3.bin",
|
|
uploaded_by="seed",
|
|
)
|
|
session.add_all([firmware_a, firmware_b])
|
|
|
|
spec = {
|
|
"key": "fw-ab-regression",
|
|
"name": "固件 A/B 电源状态回归",
|
|
"version": 3,
|
|
"danger_level": "high",
|
|
"params": {"loops": {"type": "int", "default": 8, "min": 1, "max": 10000}},
|
|
"steps": [
|
|
{"key": "preflight", "type": "precheck", "adapter": "safety"},
|
|
{
|
|
"key": "flash-fw-b",
|
|
"type": "command",
|
|
"adapter": "nvme_cli",
|
|
"template": "nvme_fw_download_commit",
|
|
"danger": "high",
|
|
"idempotent": False,
|
|
"checkpoint": True,
|
|
},
|
|
{
|
|
"key": "regression-loop",
|
|
"type": "loop",
|
|
"body": [
|
|
{
|
|
"key": "workload",
|
|
"type": "command",
|
|
"adapter": "fio",
|
|
"idempotent": True,
|
|
"retry": 1,
|
|
},
|
|
{"key": "enumeration-check", "type": "device_check", "adapter": "nvme_cli"},
|
|
{"key": "integrity-check", "type": "command", "adapter": "shell"},
|
|
],
|
|
"checkpoint": True,
|
|
},
|
|
{"key": "report", "type": "report", "adapter": "builtin"},
|
|
],
|
|
}
|
|
workflow = Workflow(
|
|
key=spec["key"],
|
|
name=spec["name"],
|
|
version=spec["version"],
|
|
spec=spec,
|
|
spec_hash=_spec_hash(spec),
|
|
danger_level="high",
|
|
source_sop="内置模拟 SOP v1",
|
|
published=True,
|
|
approved_by="system-seed",
|
|
)
|
|
session.add(workflow)
|
|
await session.flush()
|