问题概述
这个问题不是自定义工作流,而是官方文档 best_practice(最佳实践)中的示例工作流本身无法跑通。
按照文档 best_practice 中的工作流操作时,如果 host_node/create_resource 的 res_id 指向一个已存在的 container,本地执行器会直接崩溃。
这会导致文档里的两步工作流无法跑通:
creat_resource 向已有 container 中加入水
PumpTransferProtocol 将液体传输到 container1
版本信息
- Uni-Lab-OS
v0.10.19
- tag/main commit:
c001f6a1512affb48e9ae5c068e201bda3412679
文档位置
docs/user_guide/best_practice.md
第 7.5 - 7.9 节当前给出的配置是:
-
creat_resource
class_name: container
device_id: workstation
parent: workstation
res_id: container
liquid_type: water
liquid_volume: 50
-
PumpTransferProtocol
from_vessel: water
to_vessel: container1
复现步骤
- 启动 Uni-Lab,并完成 registry 上传。
- 在 Web UI 中创建实验室,包含:
workstation(其 protocol_type 包含 PumpTransferProtocol)
virtual_transfer_pump
container
container1
- 严格按照
best_practice.md 的说明创建工作流。
- 运行
creat_resource,参数为:
res_id=container
liquid_type=water
liquid_volume=50
期望行为
作为最佳实践文档中的示例工作流,这个流程应该可以直接跑通:
- 已有的
container 被更新为包含 water
- 然后工作流继续执行
PumpTransferProtocol
实际行为
本地 host executor 在线程中崩溃,还没有执行到 PumpTransferProtocol。
报错堆栈如下:
File "unilabos/ros/nodes/base_device_node.py", line 433, in append_resource
logger.info(f"更新物料{container_instance.name}的数据{found_resource.state}")
AttributeError: 'RegularContainer' object has no attribute 'state'
怀疑的根因
这看起来像一次不完整的重构 / 回归。
在提交 a79c0a8(fix container volume)中,RegularContainer.state 似乎已经被移除:
unilabos/resources/container.py 中不再定义 self.state
load_state() 也改为调用 super().load_state(state)
但是 append_resource 仍然在使用旧接口:
logger.info(f"更新物料{container_instance.name}的数据{found_resource.state}")
found_resource.state.update(container_instance.state)
因此,文档中“create_resource 更新已有 container”这条路径在 v0.10.19 上会直接崩溃。
额外说明
文档下一步里还有一个可能的文档 / 实现不一致:
- 文档写的是
from_vessel: water
- 当前
PumpTransferProtocol 的实现看起来更像是要求传入 vessel/resource id,而不是液体名
不过当前最直接的阻塞问题,还是上面的 create_resource 崩溃。
问题概述
这个问题不是自定义工作流,而是官方文档
best_practice(最佳实践)中的示例工作流本身无法跑通。按照文档
best_practice中的工作流操作时,如果host_node/create_resource的res_id指向一个已存在的container,本地执行器会直接崩溃。这会导致文档里的两步工作流无法跑通:
creat_resource向已有container中加入水PumpTransferProtocol将液体传输到container1版本信息
v0.10.19c001f6a1512affb48e9ae5c068e201bda3412679文档位置
docs/user_guide/best_practice.md第 7.5 - 7.9 节当前给出的配置是:
creat_resourceclass_name: containerdevice_id: workstationparent: workstationres_id: containerliquid_type: waterliquid_volume: 50PumpTransferProtocolfrom_vessel: waterto_vessel: container1复现步骤
workstation(其protocol_type包含PumpTransferProtocol)virtual_transfer_pumpcontainercontainer1best_practice.md的说明创建工作流。creat_resource,参数为:res_id=containerliquid_type=waterliquid_volume=50期望行为
作为最佳实践文档中的示例工作流,这个流程应该可以直接跑通:
container被更新为包含waterPumpTransferProtocol实际行为
本地 host executor 在线程中崩溃,还没有执行到
PumpTransferProtocol。报错堆栈如下:
怀疑的根因
这看起来像一次不完整的重构 / 回归。
在提交
a79c0a8(fix container volume)中,RegularContainer.state似乎已经被移除:unilabos/resources/container.py中不再定义self.stateload_state()也改为调用super().load_state(state)但是
append_resource仍然在使用旧接口:因此,文档中“
create_resource更新已有container”这条路径在v0.10.19上会直接崩溃。额外说明
文档下一步里还有一个可能的文档 / 实现不一致:
from_vessel: waterPumpTransferProtocol的实现看起来更像是要求传入 vessel/resource id,而不是液体名不过当前最直接的阻塞问题,还是上面的
create_resource崩溃。