# Sandbox Restore 测试用例

| 里程碑 | 用例名称 | 用例编号 | 特性名称（IR/SR名称） | 用例类型 | 优先级 | 前置条件 | 步骤描述 | 预期结果 | 可自动化 | 对应自动化用例 | 开发负责人 | 测试负责人 | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |:------| :--- | :--- |
| 26.06 | Controller识别Restore注解并创建RestorePod | RESTORE-IT-001 | Sandbox Restore | 功能测试 | P0 | 1.集群已部署 agent-sandbox-controller；<br>2.已创建 Phase=Succeeded 的 Checkpoint CR；<br>3.Checkpoint 包含 ArchiveLocation 和 RuntimeType<br><br>```yaml<br>metadata:<br>  name: ckpt-test-001<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/local/test-archive.tar.gz<br>  runtimeType: kata-qemu<br>  archiveSize: 1024<br>  nodeName: test-node<br>``` | 1.创建 Sandbox 并设置 Annotation restore-from 指向 Checkpoint；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-test-001<br>```<br>2.观察 Sandbox Phase 和 Conditions；<br>`kubectl get sandbox <name> -n <ns> -o jsonpath='{.status.conditions}'`<br>3.检查 Controller 创建的 Pod 注解 | 1.Sandbox Phase 先变为 Restoring；<br>2.Conditions 中 Restoring=True, reason=PodCreated；<br>```json<br>[<br>  {<br>    "type": "Restoring",<br>    "status": "True",<br>    "reason": "PodCreated",<br>    "message": "Pod created; kata-shim will download snapshot from ..."<br>  }<br>]<br>```<br>3.Controller 创建 Pod，Pod 带有以下注解；<br>```json<br>{<br>  "agents.kruise.io/archive-location": "local:///var/lib/checkpoints/local/test-archive.tar.gz",<br>  "agents.kruise.io/restore-checkpoint-ref": "ckpt-test-001",<br>  "agents.kruise.io/restore-runtime-type": "kata-qemu",<br>  "agents.kruise.io/restore-vmm-type": "qemu"<br>}<br>```<br>4.Pod Running 后 Sandbox Phase 变为 Running；<br>5.Conditions 中 Restoring=False, reason=RestoreCompleted；<br>6.Conditions 中 Ready=True；<br>7.Status.RestoreFromCheckpoint = checkpoint.Name；<br>8.Status.RestoreCompletionTime 不为 nil | 是 | RESTORE-E2E-001 | 张江伟 z00471793 | | 核心正向流程 |
| 26.06 | Controller引用Failed的Checkpoint | RESTORE-IT-002 | Sandbox Restore | 异常测试 | P1 | 1.已创建 Phase=Failed 的 Checkpoint CR<br><br>```yaml<br>metadata:<br>  name: ckpt-failed<br>status:<br>  phase: Failed<br>  message: "checkpoint creation failed"<br>``` | 1.创建 Sandbox 并设置 Annotation restore-from 指向该 Failed Checkpoint；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-failed<br>```<br>2.观察 Sandbox Phase 和 Message<br><br>`kubectl get sandbox <name> -n <ns> -o jsonpath='Phase: {.status.phase}\nMessage: {.status.message}\n'` | 1.Sandbox Phase 变为 Failed；<br>2.Message 包含 "is not Succeeded" 和 Checkpoint 名称<br><br>```<br>Phase: Failed<br>Message: Checkpoint ckpt-failed is not Succeeded (phase: Failed)<br>``` | 是 | RESTORE-E2E-002 | 张江伟 z00471793 | | |
| 26.06 | Controller引用不存在的Checkpoint | RESTORE-IT-003 | Sandbox Restore | 异常测试 | P1 | 1.集群中不存在指定名称的 Checkpoint CR | 1.创建 Sandbox 并设置 Annotation restore-from 指向不存在的 Checkpoint；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: nonexistent-checkpoint-xyz<br>```<br>2.观察 Sandbox Phase 和 Message<br><br>`kubectl get sandbox <name> -n <ns> -o jsonpath='Phase: {.status.phase}\nMessage: {.status.message}\n'` | 1.Sandbox Phase 变为 Failed；<br>2.Message 包含 "not found"<br><br>```<br>Phase: Failed<br>Message: Checkpoint nonexistent-checkpoint-xyz not found<br>``` | 是 | RESTORE-E2E-003 | 张江伟 z00471793 | | |
| 26.06 | Controller引用无ArchiveLocation的Checkpoint | RESTORE-IT-004 | Sandbox Restore | 异常测试 | P1 | 1.已创建 Succeeded 的 Checkpoint 但 Status.ArchiveLocation 为空<br><br>```yaml<br>metadata:<br>  name: ckpt-no-archive<br>status:<br>  phase: Succeeded<br>  runtimeType: kata-qemu<br>``` | 1.创建 Sandbox 并设置 Annotation restore-from 指向该 Checkpoint；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-no-archive<br>```<br>2.观察 Sandbox Phase 和 Message | 1.Sandbox Phase 变为 Failed；<br>2.Message 包含 "has no ArchiveLocation"<br><br>```<br>Phase: Failed<br>Message: Checkpoint ckpt-no-archive has no ArchiveLocation<br>``` | 是 | RESTORE-E2E-004 | 张江伟 z00471793 | | |
| 26.06 | Controller引用无RuntimeType的Checkpoint | RESTORE-IT-005 | Sandbox Restore | 异常测试 | P1 | 1.已创建 Succeeded 的 Checkpoint 但 Status.RuntimeType 为空<br><br>```yaml<br>metadata:<br>  name: ckpt-no-runtime<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/local/test-archive.tar.gz<br>``` | 1.创建 Sandbox 并设置 Annotation restore-from 指向该 Checkpoint；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-no-runtime<br>```<br>2.观察 Sandbox Phase 和 Message | 1.Sandbox Phase 变为 Failed；<br>2.Message 包含 "has no RuntimeType"<br><br>```<br>Phase: Failed<br>Message: Checkpoint ckpt-no-runtime has no RuntimeType<br>``` | 是 | RESTORE-E2E-005 | 张江伟 z00471793 | | |
| 26.06 | RestorePod注解注入验证（含vmm-type） | RESTORE-IT-006 | Sandbox Restore | 功能测试 | P0 | 1.已创建 Succeeded 的 Checkpoint，RuntimeType=kata-qemu<br><br>```yaml<br>metadata:<br>  name: ckpt-anno-006<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/local/kata-qemu-archive.tar.gz<br>  runtimeType: kata-qemu<br>``` | 1.创建 Sandbox 并设置 restore-from 注解；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-anno-006<br>```<br>2.等待 Sandbox 进入 Restoring 阶段；<br>3.检查 Controller 创建的 Pod 注解<br><br>`kubectl get pod <pod-name> -n <ns> -o jsonpath='{.metadata.annotations}'` | 1.Sandbox Phase = Restoring；<br>2.Pod 注解包含以下 4 个字段：<br>```json<br>{<br>  "agents.kruise.io/archive-location": "local:///var/lib/checkpoints/local/kata-qemu-archive.tar.gz",<br>  "agents.kruise.io/restore-checkpoint-ref": "ckpt-anno-006",<br>  "agents.kruise.io/restore-runtime-type": "kata-qemu",<br>  "agents.kruise.io/restore-vmm-type": "qemu"<br>}<br>```<br>3.restore-vmm-type 值从 RuntimeType 中提取（kata-qemu → qemu） | 是 | RESTORE-E2E-006 | 张江伟 z00471793 | | |
| 26.06 | 无restore注解的Sandbox正常创建 | RESTORE-IT-007 | Sandbox Restore | 功能测试 | P1 | 1.不设置 restore-from 注解 | 1.创建 Sandbox，不设置任何 restore 相关注解；<br>```yaml<br>metadata:<br>  name: sandbox-normal-007<br>```<br>2.观察 Sandbox Phase 和 Status 字段 | 1.Sandbox Phase 直接变为 Running（不经过 Restoring）；<br>2.Status.RestoreFromCheckpoint 为空；<br>3.Status.RestoreCompletionTime 为 nil；<br>4.Conditions 中无 Restoring 类型的 Condition<br><br>```json<br>{<br>  "phase": "Running",<br>  "restoreFromCheckpoint": "",<br>  "restoreCompletionTime": null<br>}<br>``` | 是 | RESTORE-E2E-007 | 张江伟 z00471793 | | |
| 26.06 | DownloadSnapshot失败阻断sandbox创建 | RESTORE-IT-008 | Sandbox Restore | 功能测试 | P0 | 1.集群已部署 agent-sandbox-controller；<br>2.节点使用自定义 openfuyao-shim（含 detectRestoreSnapshot 逻辑）；<br>3.已创建 Succeeded 的 Checkpoint，archiveLocation 指向不存在的文件<br><br>```yaml<br>metadata:<br>  name: ckpt-invalid-008<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/does-not-exist.tar.gz<br>  runtimeType: kata-qemu<br>``` | 1.创建 Sandbox 并设置 restore-from 注解；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-invalid-008<br>```<br>2.等待 Sandbox 进入 Restoring 阶段；<br>3.检查 FailedCreatePodSandBox 事件；<br>```bash<br>kubectl get events -n <ns> \| grep FailedCreatePodSandBox<br>```<br>4.检查 Pod 状态；<br>```bash<br>kubectl get pod <pod-name> -n <ns> -o jsonpath='{.status.phase}'<br>```<br>5.检查 kata-shim 日志；<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep "detectRestoreSnapshot failed"<br>```<br>6.持续观察 Sandbox Phase 30 秒，确认不转为 Running | 1.Sandbox Phase 先变为 Restoring；<br>2.kata-shim 日志显示 "detectRestoreSnapshot: DownloadSnapshot failed"；<br>3.kubelet 产生 FailedCreatePodSandBox 事件，包含 "detectRestoreSnapshot failed"；<br>4.Pod 保持 Pending 状态；<br>5.kata-shim 日志包含多次 "detectRestoreSnapshot failed" 记录（kubelet 退避重试）；<br>6.Restoring Condition 保持 True, reason=PodCreated；Ready Condition 不存在<br>```<br>[2026-06-03T...] detectRestoreSnapshot: DownloadSnapshot failed podUID=xxx error=DownloadSnapshot failed: download failed: ...<br>[2026-06-03T...] detectRestoreSnapshot failed container=xxx error=DownloadSnapshot failed: ...<br>``` | 是 | RESTORE-E2E-008 | 张江伟 z00471793 | | 自定义 openfuyao-shim 环境，核心错误路径 |
| 26.06 | 有效archive路径下Sandbox冷启动成功 | RESTORE-IT-009 | Sandbox Restore | 功能测试 | P0 | 1.已创建 Succeeded 的 Checkpoint，archiveLocation 指向有效归档<br><br>```yaml<br>metadata:<br>  name: ckpt-valid-009<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/valid-archive.tar.gz<br>  runtimeType: kata-qemu<br>``` | 1.创建 Sandbox 并设置 restore-from 注解；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-valid-009<br>```<br>2.等待 Sandbox 进入 Running 阶段；<br>3.检查 Sandbox Status 字段和 Conditions | 1.Sandbox Phase 变为 Running；<br>2.Status 字段：<br>```json<br>{<br>  "phase": "Running",<br>  "restoreFromCheckpoint": "ckpt-valid-009",<br>  "restoreCompletionTime": "2026-06-03T...Z",<br>  "nodeName": "k8s-master"<br>}<br>```<br>3.Conditions：<br>```json<br>[<br>  {<br>    "type": "Restoring",<br>    "status": "False",<br>    "reason": "RestoreCompleted",<br>    "message": "Sandbox restored from checkpoint ckpt-valid-009"<br>  },<br>  {<br>    "type": "Ready",<br>    "status": "True",<br>    "reason": "PodReady"<br>  }<br>]<br>``` | 是 | RESTORE-E2E-009 | 张江伟 z00471793 | | |
| 26.06 | Restore完成状态转换（Restoring→Running） | RESTORE-IT-010 | Sandbox Restore | 异常测试 | P0 | 1.已创建 Succeeded 的 Checkpoint，archiveLocation 指向有效归档<br><br>```yaml<br>metadata:<br>  name: ckpt-transition-010<br>status:<br>  phase: Succeeded<br>  archiveLocation: local:///var/lib/checkpoints/valid-archive.tar.gz<br>  runtimeType: kata-qemu<br>``` | 1.创建 Sandbox 并设置 restore-from 注解；<br>```yaml<br>annotations:<br>  agents.kruise.io/restore-from: ckpt-transition-010<br>```<br>2.等待 Sandbox 进入 Restoring 阶段；<br>3.验证 Restoring Condition 为 True, reason=PodCreated；<br>4.等待 Sandbox 进入 Running 阶段；<br>5.验证 Restoring Condition 转换为 False, reason=RestoreCompleted | 1.Sandbox Phase 先变为 Restoring；<br>2.Restoring Condition 初始状态：<br>```json<br>{<br>  "type": "Restoring",<br>  "status": "True",<br>  "reason": "PodCreated",<br>  "message": "Pod created; kata-shim will download snapshot from ..."<br>}<br>```<br>3.Sandbox Phase 变为 Running；<br>4.Restoring Condition 最终状态：<br>```json<br>{<br>  "type": "Restoring",<br>  "status": "False",<br>  "reason": "RestoreCompleted",<br>  "message": "Sandbox restored from checkpoint ckpt-transition-010"<br>}<br>``` | 是 | RESTORE-E2E-010 | 张江伟 z00471793 | | 核心状态转换验证 |
| 26.06 | kata-shim检测RestorePod并下载快照 | RESTORE-IT-011 | Sandbox Restore | 功能测试 | P0 | 1.Node Agent 已部署且 gRPC 服务可用（端口 9090）；<br>2.containerd pod_annotations 已配置传递 agents.kruise.io/*；<br>3.存在有效的 archive-location 指向可访问的归档；<br>4.使用自定义 kata-shim | 1.通过 Controller 创建 Restore Pod（带 archive-location、restore-checkpoint-ref、restore-runtime-type、pod.Uid 注解）；<br>2.检查 kata-shim 日志（/run/kata-containers/openfuyao-shim.log）；<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep detectRestoreSnapshot<br>```<br>3.检查约定路径 /var/lib/kata-restore/\<pod-uid\>/ 下的文件<br>```bash<br>ls -la /var/lib/kata-restore/<pod-uid>/<br>``` | 1.kata-shim 日志显示 "detectRestoreSnapshot invoked"；<br>2.kata-shim 调用 Node Agent DownloadSnapshot（传 ArchiveLocation + CheckpointId + RuntimeType + PodUid）；<br>3.快照解压到约定路径 /var/lib/kata-restore/\<pod-uid\>/；<br>4.写入 marker file /var/lib/kata-restore/\<pod-uid\>/restore-ready；<br>5.pod 正常冷启动（不执行 restore）<br><br>```<br>[2026-06-03T...] detectRestoreSnapshot invoked container=xxx containerType=pod_sandbox<br>[2026-06-03T...] calling node-agent DownloadSnapshot podUID=xxx archiveLocation=...<br>[2026-06-03T...] snapshot prepared successfully podUID=xxx snapshotPath=/var/lib/kata-restore/xxx<br>``` | 是 | | 张江伟 z00471793 | | 需自定义 openfuyao-shim 环境 |
| 26.06 | kata-shim非RestorePod透传 | RESTORE-IT-012 | Sandbox Restore | 功能测试 | P1 | 1.kata-shim 已部署；<br>2.使用自定义 kata-shim | 1.创建普通 Pod（无 archive-location 注解）；<br>2.检查 kata-shim 日志<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep detectRestoreSnapshot<br>``` | 1.kata-shim 的 detectRestoreSnapshot 返回空字符串（archiveLocation 为空）；Pod 正常启动；<br>2.kata-shim 日志无 "Detected restore snapshot" 记录<br><br>```<br>[2026-06-03T...] detectRestoreSnapshot invoked container=xxx containerType=pod_sandbox<br>// 无后续 DownloadSnapshot 调用<br>``` | 是 | | 张江伟 z00471793 | | 需自定义 openfuyao-shim 环境 |
| 26.06 | kata-shim无archiveLocation注解或注解为空 | RESTORE-IT-013 | Sandbox Restore | 异常测试 | P1 | 1.自定义kata-shim 已部署；<br>2.Pod 有其他注解但无 archive-location 或 archive-location 为空字符串；<br> | 1.创建 Pod 带其他注解但不带 archive-location；<br>2.再创建一个 Pod 带 archive-location=""（空值）；<br>3.观察 kata-shim 行为<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep -A2 detectRestoreSnapshot<br>``` | 1.两次情况 kata-shim 的 detectRestoreSnapshot 均返回空字符串（archiveLocation 为空直接返回）；<br>2.Pod 正常创建；<br>3.不触发 DownloadSnapshot<br><br>```go<br>// create.go line 537-539<br>archiveLocation := ociSpec.Annotations[restoreAnnotationKey]<br>if archiveLocation == "" {<br>    return "", nil<br>}<br>``` | 是 | | 张江伟 z00471793 | | 需自定义 openfuyao-shim 环境 |
| 26.06 | kata-shim重复CreateSandbox（幂等检查） | RESTORE-IT-014 | Sandbox Restore | 异常测试 | P1 | 1.自定义kata-shim 已部署；<br>2.同一 Pod 已被处理过一次（download 成功）；<br>3./var/lib/kata-restore/\<pod-uid\>/restore-ready 已存在；<br> | 1.第一次 CreateSandbox 触发下载；<br>2.模拟 containerd 重试 CreateSandbox 对同一 Pod；<br>3.检查 kata-shim 日志<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep "marker already exists"<br>``` | 1.第一次: kata-shim 下载快照成功；<br>2.第二次: kata-shim 日志 "restore-ready marker already exists"，不调用 DownloadSnapshot，直接使用已有快照；<br>3.不重复下载，不覆盖已有文件<br><br>```<br>[2026-06-03T...] restore-ready marker already exists podUID=xxx conventionPath=/var/lib/kata-restore/xxx<br>``` | 是 | | 张江伟 z00471793 | | 需自定义 openfuyao-shim 环境 |
| 26.06 | kata-shim DownloadSnapshot失败 | RESTORE-IT-015 | Sandbox Restore | 功能测试 | P0 | 1.自定义kata-shim 已部署；<br>2.archive-location 指向不可达或损坏的归档 | 1.创建带无效 archive-location 的 Restore Pod；<br>2.观察 Pod 状态、Sandbox Phase 和 kata-shim 日志<br>```bash<br>cat /run/kata-containers/openfuyao-shim.log \| grep "detectRestoreSnapshot failed"<br>kubectl get events -n <ns> \| grep FailedCreatePodSandBox<br>kubectl get pod <pod-name> -n <ns> -o jsonpath='{.status.phase}'<br>``` | 1.kata-shim 日志显示 "detectRestoreSnapshot: DownloadSnapshot failed"；<br>2.kubelet 产生 FailedCreatePodSandBox 事件，Pod 保持 Pending 状态；<br>3.Controller 看到 Pod Pending 持续 requeue，Sandbox 保持 Restoring 状态（不会 fallback 到冷启动）；<br>4.kata-shim 日志包含多次 "detectRestoreSnapshot failed" 记录（kubelet 退避重试）<br><br>```<br>[2026-06-03T...] detectRestoreSnapshot: DownloadSnapshot failed podUID=xxx error=DownloadSnapshot failed: download failed: ...<br>[2026-06-03T...] detectRestoreSnapshot failed container=xxx error=DownloadSnapshot failed: ...<br>``` | 是 | | 张江伟 z00471793 | | 需自定义 openfuyao-shim 环境，核心错误路径 |
| 26.06 | Kata shim冷启动（无约定路径） | RESTORE-IT-016 | Sandbox Restore 快照下载 | 功能测试 | P0 | 1.kata-shim 已部署；<br>2.节点上 /var/lib/kata-restore/\<pod-uid\>/restore-ready 不存在；<br>3.Pod 使用 kata-qemu RuntimeClass | 1.kubelet 创建 Pod → containerd → kata-shim CreateSandbox → startVM；<br>2.观察 kata-shim 日志；<br>3.观察 Sandbox 状态 | 1.detectRestoreSnapshot 返回空字符串（marker 不存在）；<br>2.VM 正常冷启动（QEMU 进程创建，无 -incoming 参数）；<br>3.kata-agent 启动完成，Sandbox Running | 是 | | 张江伟 z00471793 | | |
| 26.06 | Kata shim下载快照但不执行restore（约定路径存在） | RESTORE-IT-017 | Sandbox Restore 快照下载 | 功能测试 | P0 | 1.约定路径 /var/lib/kata-restore/\<pod-uid\>/ 下存在 restore-ready marker、vm-state.bin、disk.qcow2；<br>2.Pod 使用 kata-qemu RuntimeClass；<br>3.Containerd pod_annotations 已配置传递 agents.kruise.io/* | 1.kubelet 创建 Pod → containerd → kata-shim CreateSandbox → startVM；<br>2.观察 kata-shim 日志；<br>3.观察 Sandbox 状态；<br>4.检查 /var/lib/kata-restore/\<pod-uid\>/ 目录 | 1.detectRestoreSnapshot 检测到 marker，返回约定路径；<br>2.kata 调用 node-agent DownloadSnapshot 下载快照文件；<br>3.kata-agent 启动完成，Sandbox Running；<br>4./var/lib/kata-restore/\<pod-uid\>/ 目录包含 vm-state.bin、disk.qcow2、restore-ready marker；<br> | 是 | | 张江伟 z00471793 | | 核心用例 |
| 26.06 | Controller Restore完成状态转换 | RESTORE-IT-018 | Sandbox Restore | 功能测试 | P0 | 1.Pod 已从快照恢复并进入 Running；<br>2.kata-shim 已完成 VM restore | 1.观察 Controller 日志；<br>2.检查 Sandbox CR Status<br>```bash<br>kubectl get sandbox <name> -n <ns> -o jsonpath='{.status}'<br>``` | 1.Sandbox Phase 变为 Running；<br>2.Conditions 中 Restoring=False, reason=RestoreCompleted；<br>Conditions 中 Ready=True, reason=PodReady；<br>Status.RestoreFromCheckpoint = checkpoint.Name；<br>Status.RestoreSnapshotPath = /var/lib/kata-restore/\<pod-uid\>；<br>Status.RestoreCompletionTime 不为 nil；<br>Status.NodeName = pod.Spec.NodeName<br><br>```json<br>{<br>  "phase": "Running",<br>  "restoreFromCheckpoint": "ckpt-018",<br>  "restoreSnapshotPath": "/var/lib/kata-restore/abc-123",<br>  "restoreCompletionTime": "2026-06-03T...Z",<br>  "nodeName": "k8s-master",<br>  "sandboxIp": "10.244.0.5"<br>}<br>``` | 是 | | 张江伟 z00471793 | | |
| 26.06 | Controller Restore完成后清理本地快照 | RESTORE-IT-019 | Sandbox Restore | 功能测试 | P1 | 1.Sandbox 已成功 Restore 完成（Phase=Running）；<br>2.Node Agent 配置为 agentClient != nil | 1.等待 Controller 调用 CleanupLocalSnapshot；<br>2.检查节点文件系统<br> | 1.Controller 异步调用 Agent.CleanupLocalSnapshot(ctx, /var/lib/kata-restore/\<pod-uid\>, nodeName, checkpointID)；<br>2.节点上 /var/lib/kata-restore/\<pod-uid\>/ 目录被删除；<br>3.Agent 日志显示 "local snapshot cleaned up"；<br>4.快照文件在 Restore 完成后被异步清理（预期行为） | 是 | | 张江伟 z00471793 | | |
| 26.06 | kata-shim重复CreateSandbox不重复下载 | RESTORE-IT-020 | Sandbox Restore | 异常测试 | P1 | 1.kata-shim 已下载快照到 /var/lib/kata-restore/\<pod-uid\>/；<br>2.restore-ready marker 已存在 | 1.模拟 containerd 重试 CreateSandbox 对同一 Pod；<br>2.检查 kata-shim 日志和 /var/lib/kata-restore/\<pod-uid\>/ 目录 | 1.kata-shim 日志 "restore-ready marker already exists"，不调用 DownloadSnapshot；<br>2.直接使用已有快照文件；<br>3.不覆盖已有文件 | 是 | | 张江伟 z00471793 | | |
| 26.06 | NodeAgent CleanupLocalSnapshot删除本地快照目录 | RESTORE-IT-021 | Sandbox Restore | 功能测试 | P1 | 1.节点上存在 /var/lib/kata-restore/\<pod-uid\>/ 目录；<br>2.Node Agent gRPC 可用 | 1.Controller 调用 CleanupLocalSnapshot；<br>2.检查文件系统和 Agent 日志<br>```bash<br>grpcurl -plaintext -d '{"local_snapshot_path":"/var/lib/kata-restore/xxx"}' 127.0.0.1:9090 nodeagent.NodeAgent/CleanupLocalSnapshot<br>``` | 1.整个 /var/lib/kata-restore/\<pod-uid\>/ 目录被 RemoveAll 删除；<br>2.Agent 日志 "local snapshot cleaned up"；<br>3.返回 Success=true<br><br>```json<br>{ "success": true }<br>``` | 是 | | 张江伟 z00471793 | | |
| 26.06 | VMMType提取及Pod注解传递 | RESTORE-IT-022 | Sandbox Restore | 功能测试 | P1 | 1.存在 RuntimeType=kata-qemu 的 Succeeded Checkpoint | 1.创建 Restore Sandbox 指向该 Checkpoint；<br>2.观察 Controller 创建的 Pod 注解<br>```bash<br>kubectl get pod <pod-name> -n <ns> -o jsonpath='{.metadata.annotations.agents\.kruise\.io/restore-vmm-type}'<br>``` | 1.Pod 带注解 restore-vmm-type=qemu（extractVMMType 从 kata-qemu 提取 qemu）；<br>2.Pod 同时带 archive-location、restore-checkpoint-ref、restore-runtime-type 注解<br><br>```json<br>{<br>  "agents.kruise.io/restore-vmm-type": "qemu"<br>}<br>``` | 是 | | 张江伟 z00471793 | | |
