feat: Cloud Hypervisor 执行器生产级 v1(cloud-hypervisor)

单任务单 VM:API 唤醒(preflight→vmm.ping→vm.create→vm.boot→SSH 就绪)、
暂停/快照/休眠等价/关闭/回收、预热快照池、每任务磁盘 copy、容量与磁盘配额门、
受控 egress fail-closed、VM 事件审计与分类失败;worker/server/autoscaler 接线
(executor=cloud-hypervisor,任务内 LLM 不可自选);默认关闭,不进生产路由。
未做真实 VM 验证:生产主机与本 VM 均无 /dev/kvm、无嵌套虚拟化,验证为 mock +
干跑命令 + 单元测试;真 VM、快照恢复、压测、安全审计见
docs/chv-production-readiness.md。CI 账单故障仍是硬门禁,本提交只到 PR OPEN。
This commit is contained in:
host committed 2026-10-30 18:54:16 +00:00
1 parent aebc6238a6
commit c371bbdf1e
9 files changed
+2364 -11

No files matched your search

+51
View File
@@ -1288,6 +1288,57 @@ 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` 缩写):
单任务单 VM:一个任务一个 VM、独立内核/文件系统/网络,
任务结束销毁,租户之间无共享路径、无东西向互访;VM 内
agent 可有 root,但只能影响本 VM。密钥按现有惯例走运行
时环境变量名注入,不进镜像、不进代码、不进任务 prompt
落库(SSH argv 里只有 key 文件路径,绝无 key 值)。
唤醒是 API 模式:preflight(见下)→ 容量门 → 磁盘配额门
→ 每任务磁盘供给(copy 模式复制基础镜像)→ 只以
`--api-socket` 起 VMM → 等 `vmm.ping` 通 → `PUT vm.create`
(VmConfig)→ `PUT vm.boot` → 等 guest SSH 就绪(默认
120 秒)才跑 host.py;超时关 VM 并报分类失败。直接启动
命令(`build_vm_command`)只作手动等价写法,执行器不走它。
暂停/快照/休眠:`pause_vm`/`resume_vm` 走 ch-remote;
`restore_vm` 先 restore 再显式 resume(恢复后默认 paused,
不 resume 不算醒);CHV 无原生 hibernate 端点,`hibernate_vm`
用 pause + snapshot + shutdown 等价实现,恢复走 restore。
预热池 `WarmPool`:预热条目是一次性干净快照 VM,acquire
消耗、release 一律销毁,绝不跨任务复用脏 VM;池空回落
冷启动,绝不降级 Docker/Local。关闭与清理:任务结束/
失败/取消时 `shutdown_vm`(ch-remote shutdown + 杀进程 +
删 socket),`cleanup_stale_vms` 处理已死/已关/socket 残留
三种情况。审计:VM 的 create/boot/ready/pause/resume/
snapshot/restore/shutdown/destroy/failed/recycled 均经
audit_callback 发出,worker 接线后转 AuthStore 审计;失败
带 kind 分类(kvm_missing/image_missing/guest_not_ready/
api_timeout/host_capacity_exceeded/disk_quota_exceeded 等),
不笼统 failed。资源与成本:每 VM 的 CPU/内存/磁盘配额、
超时、最大轮次(goal 上限 100)复用 worker 现有 quota 语义,
不另起一套计费;空闲休眠省成本;autoscaler 按 executor 过
滤队列深度并透传 `--executor` 给拉起的 worker。网络与治理:
VM 出口默认必须过 CHV_EGRESS_PROXY 白名单代理(未设且未
显式允许直连时 preflight 直接失败);审批门仍走任务的
approval 与 server 的 merge_gate,VM 内 agent 不能自批。
配置(环境变量,见该类 docstring 全表):CHV_BINARY、
CHV_KERNEL、CHV_ROOTFS(或 CHV_IMAGE 别名)、CHV_CPU、
CHV_MEM、CHV_STATE_DIR、CHV_SSH_KEY/USER/PORT、CHV_CMDLINE、
CHV_NET(直接命令用)/CHV_NET_JSON(API 用)、CHV_REMOTE、
CHV_MAX_VMS、CHV_DISK_MODE(copy 默认/reuse 仅实验)、
CHV_DISK_GB、CHV_EGRESS_PROXY、CHV_TASK_TIMEOUT、
CHV_SNAPSHOT_URL、CHV_WARM_POOL_SIZE、CHV_API_TIMEOUT、
CHV_READY_TIMEOUT/INTERVAL。默认关闭:server 默认执行器仍
是 docker,worker 默认 local,CHV 只在任务创建时显式选
`executor=cloud-hypervisor` 且有 CHV worker 认领时才跑;
任务内 LLM 绝不能发现/调用它(调度层选择,只在创建层可见:
POST /tasks 可选值、本文档、控制台选项,不新增任务内 MCP/
工具)。真实验证边界:未做真实 VM 启动验证——生产主机
本身是 CVM、无 /dev/kvm、无嵌套虚拟化,本 VM 容器内同样
无 /dev/kvm;真 VM、快照恢复、压测、安全审计均在
`docs/chv-production-readiness.md` 里标为待办,绝不声称
已生产可用。客机镜像内容清单与构建骨架见 `chv-guest/`。
- 自动 PR(默认关闭,显式触发,`POST /tasks/{id}/pr`,需项目
maintainer 以上权限 approve_merge):仅当任务状态为 merged 时
可调(其它状态 409;任务不存在 404;权限不足 403)。逻辑按顺序