- 拆模块: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。
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
"""Cloud Hypervisor 每任务磁盘供给(叶子模块)。
|
||
|
||
单任务单 VM 的文件系统独立性就靠这里:copy 模式每任务
|
||
复制一份基础镜像,两个任务绝不写同一文件;reuse 模式
|
||
直接返回基础镜像路径(仅单租户实验,生产禁用,见
|
||
CloudHypervisorExecutor 的类 docstring)。
|
||
"""
|
||
|
||
import os
|
||
import shutil
|
||
|
||
from cloud.chv.errors import ChvFailure
|
||
|
||
|
||
def check_disk_quota(rootfs, disk_gb):
|
||
"""磁盘配额门:CHV_DISK_GB 已设且基础镜像超过该 GB 数
|
||
即拒绝(kind=disk_quota_exceeded)。未设则不检查;
|
||
镜像读不到时不拦(preflight 自会报 image_missing,
|
||
这里不抢它的错)。"""
|
||
if disk_gb is None or not rootfs:
|
||
return
|
||
try:
|
||
size = os.path.getsize(rootfs)
|
||
except OSError:
|
||
return
|
||
if size > disk_gb * 1024 ** 3:
|
||
raise ChvFailure(
|
||
"disk_quota_exceeded",
|
||
"磁盘镜像 %d 字节超过配额 %.1f GB" % (size, disk_gb))
|
||
|
||
|
||
def provision_task_disk(state_dir, vm_name, rootfs, disk_mode):
|
||
"""每任务磁盘路径:copy 模式复制到
|
||
state_dir/<vm>/disk.raw(已存在则复用,不重复复制);
|
||
reuse 模式直接返回基础镜像路径。"""
|
||
if disk_mode == "reuse":
|
||
return rootfs
|
||
task_dir = os.path.join(state_dir, vm_name)
|
||
os.makedirs(task_dir, exist_ok=True)
|
||
task_disk = os.path.join(task_dir, "disk.raw")
|
||
if not os.path.exists(task_disk):
|
||
shutil.copyfile(rootfs, task_disk)
|
||
return task_disk
|