feat(chv): 架构/可维护性/前端只读侧推进——生产实验分离、配置片段化、VM 只读展示
架构:WarmPool 从 cloud/chv/pool.py 移到 experimental_pool.py, 生产残留清理彻底分文件到 cloud/chv/orphans.py(facade 直接读 registry 文件清理,不构造池、不碰 prewarm/acquire/release); cloud/chv 与 cloud/sandbox 不再导出 WarmPool,旧路径一律 ImportError(CHV 未合并、无生产用户,兼容保留已无保留理由); worker 改走 orphans facade,不再持有 _warm_pool;#215 对齐从 接口形状推进到 REPLACEMENT_POINTS 替换清单(R1/R2 可机械替换、 R3 永不替换,#215 模块当前不存在由测试钉住)。 可维护性:build_chv_config 拆成 base/ssh/network/quota/disk/ timeout 六片段(组装只做 dict 合并,键冲突即报错;38 字段集 与取值不变,单项非法报错文案逐字一致);ADR-12 模块职责图 与禁 import 清单(AST 钉住);cloud/chv/ 公开 API 全量类型 标注、无 Any 逃逸,并修正三处旧标注错误;死代码扫一遍 (删实验池已无调用的 _quarantine 委托与未用 _LOGGER)。 前端(只读侧,不做控制按钮):chv.ts 新增纯逻辑谓词与文案 (执行器精确匹配、附件守卫、VM 状态文案、列表徽标);列表 行新增 VM 已报告死亡徽标;详情对全部 CHV 任务显示 VM 行 (已报告死亡/未报告死亡,不猜 live);WorkersSection 与成本 卡沿用已有数据,不新开池管理/成本页;服务端未新增第二个 生命周期字段(持久化事实只有三项,chv_vm_dead 已是完整派生), 只把派生抽成 _chv_vm_dead_from_row 并补 goal 回落形态测试。
This commit is contained in:
1 parent
42de20da68
commit
df8c64bd64
30 files changed
+1263
-331
No files matched your search
+31
-9
@@ -1766,6 +1766,30 @@ def _row_get(row, name):
|
||||
return None
|
||||
|
||||
|
||||
def _chv_vm_dead_from_row(row):
|
||||
"""CHV 只读字段 chv_vm_dead 的派生规则(本轨命名抽出,
|
||||
行为与 feat-chv-arch95plus 逐字一致,见 ADR-11/14)。
|
||||
|
||||
来源链(缺一环字段就不出现,绝不编造):
|
||||
执行器 _vm_death_result 写 result["vm_dead"]=True →
|
||||
worker 终局仅当 status='interrupted' 时把原因写进
|
||||
tasks.interrupted_reason(非 goal 形态是完整原因文本,
|
||||
goal 形态无 interrupted_reason 字段时回落为纯文本
|
||||
“VM 中途死亡”)→ 本函数只在 executor 为
|
||||
cloud-hypervisor 且原因文本含“VM 中途死亡”时返回
|
||||
True,其它情形返回 None(调用方不写字段)。
|
||||
本字段是“已报告死亡”,不是 live 状态:server 进程
|
||||
没有 VM 登记表,VM 活着/死了的 live 状态编不出来;
|
||||
前端无该字段时必须显示“未报告死亡”,不得写成活着。
|
||||
"""
|
||||
if _row_get(row, "executor") != "cloud-hypervisor":
|
||||
return None
|
||||
reason = _row_get(row, "interrupted_reason")
|
||||
if reason and "VM 中途死亡" in str(reason):
|
||||
return True
|
||||
return None
|
||||
|
||||
|
||||
def _task_to_dict(row, attachments=None, total_tokens=None):
|
||||
depends_on = row["depends_on"]
|
||||
try:
|
||||
@@ -1826,16 +1850,14 @@ def _task_to_dict(row, attachments=None, total_tokens=None):
|
||||
# 列表接口由 _task_tokens_map 一次聚合传入;其它调用方
|
||||
# 不传时为 None(前端显示占位),绝不把“未算”写成 0。
|
||||
"total_tokens": total_tokens,
|
||||
# feat-chv-arch95plus 只读字段:仅当 CHV 任务且 worker
|
||||
# 已把 VM 死亡写进 interrupted_reason 时才出现,值为
|
||||
# True;其它情形一律不返回该字段(绝不把“未报告死亡”
|
||||
# 写成“VM 活着”,live VM 状态不在 server 进程里,
|
||||
# server 没有 VM 登记表,编不出来也不编)。
|
||||
# feat-chv-arch-maint-fe:只读字段经
|
||||
# _chv_vm_dead_from_row 派生(规则见该函数;本轨
|
||||
# 未新增第二个生命周期字段——server 持久化的 CHV
|
||||
# 生命周期事实只有 executor/status/interrupted_reason
|
||||
# 三项,chv_vm_dead 已是其完整派生,再编字段就是
|
||||
# 复制 interrupted_reason 或猜 live 状态,两者都不做)。
|
||||
**({"chv_vm_dead": True}
|
||||
if _row_get(row, "executor") == "cloud-hypervisor"
|
||||
and _row_get(row, "interrupted_reason")
|
||||
and "VM 中途死亡" in str(_row_get(row, "interrupted_reason"))
|
||||
else {}),
|
||||
if _chv_vm_dead_from_row(row) else {}),
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user