feat: CHV 执行器优化(拆模块/去重复/SSH 钉死/池持久化/中途死亡分类)
- 拆模块:CHV 从 cloud/sandbox.py 巨类拆到 cloud/chv/(executor/ pool/config/api_client/ssh_transport/disk/errors),sandbox 只留 兼容 re-export,旧导入路径与新路径是同一对象 - 去重复:goal 解析、host 顶层参数、runner 超时抽成共享 helper, Local 与 CHV 在矩阵输入下结论全等(Docker goal-resume 变体 有意保留内联版,见 PR 描述) - 安全:SSH host key 按 VM 钉死(state_dir/<vm>/known_hosts, ssh-keyscan 首次捕获 TOFU),废除 no + /dev/null;CHV_SSH_USER 空串与 CHV_SSH_PORT 越界直接拒绝,不静默 fallback - execute 语义:只读已运行 VM,未运行报 vm_not_running,不为 status 起 VM - 预热池:registry 落盘、重启载入只当孤儿、reconcile 清理、 损坏 quarantine;条目仍一次性,绝不复用脏 VM - 长任务:VM 中途死亡判 interrupted(断点可续跑);中途心跳 经评估不做(无客内进度信号可采) - #215 未合并:只列复用清单,不复制模块 测试:原 42 项 + 新 24 项全过;相关旧套件与 cloud 全量 1496 项 全过(skipped=4)。验证仍是 mock + 干跑 + 单元测试,未做真机、 压测、安全审计;堆叠于 #216 之上,base 为 feat-cloud-hypervisor。
This commit is contained in:
1 parent
c371bbdf1e
commit
fde7bf4c3e
14 files changed
+2706
-1408
No files matched your search
+21
-3
@@ -1288,8 +1288,9 @@ interrupted 且终态任务 cancel 返回 400、心跳后 sweep 不扫刚心跳
|
||||
错误文本或返回结果。worker CLI 的 `--executor` 新增 cloud 选项,
|
||||
构造 CloudExecutor;worker 的 run_one 走 dispatch_task,
|
||||
CloudExecutor 的 dispatch_task/run_task 直接委托给 execute。
|
||||
- CloudHypervisorExecutor(生产级 v1,`cloud/sandbox.py`,
|
||||
执行器名 `cloud-hypervisor`,绝不用 `cloud` 缩写):
|
||||
- CloudHypervisorExecutor(生产级 v1,`cloud/chv/`,旧路径
|
||||
`cloud/sandbox.py` 只留兼容 re-export,执行器名
|
||||
`cloud-hypervisor`,绝不用 `cloud` 缩写):
|
||||
单任务单 VM:一个任务一个 VM、独立内核/文件系统/网络,
|
||||
任务结束销毁,租户之间无共享路径、无东西向互访;VM 内
|
||||
agent 可有 root,但只能影响本 VM。密钥按现有惯例走运行
|
||||
@@ -1307,7 +1308,24 @@ interrupted 且终态任务 cancel 返回 400、心跳后 sweep 不扫刚心跳
|
||||
用 pause + snapshot + shutdown 等价实现,恢复走 restore。
|
||||
预热池 `WarmPool`:预热条目是一次性干净快照 VM,acquire
|
||||
消耗、release 一律销毁,绝不跨任务复用脏 VM;池空回落
|
||||
冷启动,绝不降级 Docker/Local。关闭与清理:任务结束/
|
||||
冷启动,绝不降级 Docker/Local;池状态另落
|
||||
`state_dir/warm-pool.json` registry,worker 重启后载入的
|
||||
条目一律当孤儿、只能 `reconcile_orphans()` 清理,绝不
|
||||
重新发给任务,registry 损坏时 quarantine 成 `.corrupt` 并
|
||||
从空池开始。SSH host key 按 VM 钉死(#216 的
|
||||
`StrictHostKeyChecking=no` + `/dev/null` 已废除):每 VM
|
||||
在 `state_dir/<vm>/known_hosts` 有独立文件,首次启动经
|
||||
ssh-keyscan 在本机回环端口捕获 key 写入该文件(首次信任
|
||||
TOFU,只防首次之后的替换,不验证首次本身),此后 SSH
|
||||
一律 `StrictHostKeyChecking=yes` + 该文件校验;客机用户
|
||||
(`CHV_SSH_USER`,默认 root,显式空串直接拒绝)与端口
|
||||
(`CHV_SSH_PORT`,默认 2222,1-65535)为显式配置。
|
||||
`execute()` 只读已运行 VM:未运行报 `vm_not_running`
|
||||
分类失败,不为一次 status 起 VM。长任务中途死亡
|
||||
(传输异常、或结果已 failed 且登记 VMM 进程已死)判
|
||||
`interrupted` 而非笼统 failed;中途心跳经评估未做
|
||||
(host.py 单次 SSH 长回合无客内进度信号可采,另起轮询
|
||||
只能证明 VM 活着)。关闭与清理:任务结束/
|
||||
失败/取消时 `shutdown_vm`(ch-remote shutdown + 杀进程 +
|
||||
删 socket),`cleanup_stale_vms` 处理已死/已关/socket 残留
|
||||
三种情况。审计:VM 的 create/boot/ready/pause/resume/
|
||||
|
||||
Reference in new issue
Block a user