Skip to main content
像 lager CLI 一样,用 Rust 设置 Lager Box。您可以:
  • 创建和删除已保存的 Net,并编辑 Net 和 Box 的元数据
  • 安装自定义驱动、上传二进制文件并下载文件
  • 把 USB 串口线分配给设备定义,并运行诊断
这样,CI 作业就能在测试运行之前搭建好实验台,无需任何 Python 步骤。 这些调用位于 admin 功能之后,该功能不增加任何依赖:

句柄

AsyncLagerBox::admin() 为异步客户端返回相同的方法。
Box 在这些路由上不检查 Box 锁。lager CLI 会在发送更改之前检查它。请在更改期间持有 lock_guard(),这样其他用户的会话就无法与您的更改交错进行。

方法

已保存的 Net

save_net(record: &NetRecord) -> Result<()>

创建一个 Net,或替换名称和角色都相同的已保存记录。NetRecord::new(name, role, instrument) 构造一条记录,其构建器方法设置其余字段:
nets() 返回的记录可以修改后再保存回去。crate 会像 CLI 一样,去掉 Box 派生出的 live_path。 Box 以名称和角色作为记录的键。名称相同、角色不同的记录会保留在新记录旁边。要更改 Net 的角色,请先删除旧记录。

rename_net(old_name: &str, record: &NetRecord) -> Result<()>

用 record 替换 old_name。Box 会删除所有名为 old_name 的记录(无论角色如何),然后保存 record。

delete_net(name: &str, role: Option<&str>) -> Result<()> 和 delete_all_nets() -> Result<()>

带角色的 delete_net 只删除角色完全相同的那条记录。不带角色时,它删除所有同名的记录。未知的 Net 是 HTTP 404 的 Error::Box。
delete_all_nets() 会删除 Box 上所有已保存的 Net,且无法撤销。如果需要恢复它们,请先读取 nets()。

元数据

net_metadata(name: &str) -> Result<NetMetadata>

读取 Net 的元数据。它需要 Box 软件 0.46.0 或更高版本。

set_net_metadata(name: &str, update: &NetMetadataUpdate) -> Result<NetMetadata>

在所有同名记录上修改 Net 的元数据。更新中没有设置的字段保持原值。clear() 会移除一个字段。
对于未知的字段名,以及为更新中没有设置的字段提供的时间戳,Box 会以 HTTP 400 的 Error::Box 拒绝。

box_metadata() 和 set_box_metadata(description, updated_at)

读取和替换 Box 的描述。写入会替换整条记录:描述传入 None 会清除它。

仪器和实验台清单

instruments() -> Result<Vec<Instrument>>

列出 Box 看到的仪器。每个 Instrument 都有供 NetRecord::new 使用的 name、一个 address、它可以承担的 net_type 角色以及它的 channels。扫描报告的其余部分在 extra 中。 每次调用都会重新扫描硬件。为了找到机械臂,扫描会向没有已保存 Net 使用的串口发送一次简短的握手。

bench_manifest() -> Result<BenchManifest>

读取实验台清单,即作为一个文档的整个 Box 配置。它需要 Box 软件 0.50.0 或更高版本。其模式归 Box 所有,因此 document 保存的是 JSON。box_id() 和 schema_version() 读取两个常用的键。

自定义驱动

这些调用需要 Box 软件 0.59.0 或更高版本。

install_driver(driver_type: &str, bundle: &[u8]) -> Result<DriverInstall>

上传驱动的 zip 包,并替换已安装的版本。Box 会安装清单中声明的 Python 包。这可能需要几分钟,因此该调用最多等待 6 分钟。
0.60.0 之前的 Box 不安装任何 Python 包。如果驱动包声明了依赖包,请先检查 status()?.capabilities.custom_driver_deps。Box 会以 HTTP 413 拒绝过大的驱动包,以 HTTP 504 拒绝运行超过 300 秒的 pip。

drivers()、driver(type)、reinstall_driver_deps(type) 和 remove_driver(type, force)

drivers() 为每个驱动返回一个 DriverEntry。每一项都有它的 status、version、deps 以及使用它的 nets。无法加载的驱动的 status 为 "error",并带有一条 error 信息。 不带 force 时,只要还有已保存的 Net 在使用该驱动,remove_driver() 就会以 HTTP 409 失败。信息中会列出这些 Net。带 force 时,Box 会移除该驱动,orphaned_nets 列出失去驱动的 Net。

二进制文件和文件

add_binary(name: &str, data: &[u8]) -> Result<BinaryAdded>

把一个可执行文件上传到 Box 的二进制文件目录,并替换同名文件。当容器需要重启才能看到该文件时,restart_required 为 true。lager update 会执行这次重启。 binaries() 列出该目录,remove_binary(name) 删除一个文件。

download_file(path: &str) -> Result<Vec<u8>>

以字节形式下载脚本留在 Box 上的文件。
Box 只提供 /tmp/lager-output、/tmp/lager-results 和 /tmp/lager-job-output 下的文件。其他任何路径都是 HTTP 403 的 Error::Box。download_file() 没有客户端超时。download_file_with_timeout(path, Some(duration)) 可以设置一个。

自定义设备

custom_devices() -> Result<CustomDevices>

列出 Box 知道的设备定义(catalog)、当前的分配(assignments),以及尚未分配的 USB 串口线(cables)。Box 会扫描这些串口线,需要几秒钟。

assign_custom_device(instrument: &str, cable: &CableId, baud: Option<u32>) -> Result<DeviceAssigned>

把一根 USB 串口线分配给一个设备定义。CableId 指定该串口线:
对于没有序列号的串口线,或与另一根串口线序列号相同的串口线,请使用 CableId::PortPath("1-1.4".into())。
分配会删除因它而过时的已保存 Net,以及同一根串口线上的通用 UART Net。deleted_nets 会列出它们。

remove_custom_device(cable: &CableId) -> Result<DeviceRemoval>

移除一根串口线的分配,以及使用它的已保存 Net。没有分配的串口线会返回 removed: false,而不是错误。

诊断

lager diagnose 背后的检查。每个结果都为常见事实提供带类型的字段,并用一个 extra 映射保存 Box 报告的其余部分。crate 会对地址进行 URL 编码。 VISA 探测失败或被跳过属于数据,而不是错误:error、error_class 和 skipped 说明发生了什么。
请不要在烧录期间调用 diagnose_jlink()。它可能会连接目标,并且可能需要 30 秒以上。

较旧的 Box

Box 不提供的路由会以 Error::UnsupportedByBox 失败。已知所需版本时,信息中会指明它。路由自身说明的拒绝(例如未知的 Net)是带有 Box 信息的 Error::Box。

示例:在 CI 中搭建实验台,然后测试