Skip to content

<feature>[storage]: ZSV-12664 support ZBS volume encryption conversion - #4570

Closed
ZStack-Robot wants to merge 1 commit into
feature-zsv-5.1.0-encryptionfrom
sync/zstackio/codex/zbs-change-volume-encryption
Closed

<feature>[storage]: ZSV-12664 support ZBS volume encryption conversion#4570
ZStack-Robot wants to merge 1 commit into
feature-zsv-5.1.0-encryptionfrom
sync/zstackio/codex/zbs-change-volume-encryption

Conversation

@ZStack-Robot

Copy link
Copy Markdown
Collaborator

Summary

为 ZBS/CBD 云盘增加明文与加密格式双向转换,转换语义参考 RBD;云盘存在主存储快照时拒绝转换。

Changes

  • 新增 ZBS 加密转换器、主存储后端和 KVM 路由。
  • 使用同一物理池与逻辑池的新目标路径完成转换,并安全清理失败目标。
  • 增加快照拒绝、双向转换、路径与清理安全性自动化覆盖。

Testing

  • cbok zsv groovy_test:ZbsVolumeEncryptionCase 通过(1/1)
  • cbok zsv compile --no-deploy:header/storage/zbs/expon BUILD SUCCESS
  • CI pipeline

Resolves: ZSV-12664

sync from gitlab !10538

@coderabbitai

coderabbitaiBot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in:7 seconds

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8dffce05-86b9-4c11-a2fb-55ecfeb29579

📥 Commits

Reviewing files that changed from the base of the PR and between 652b81b and 2e62674.

⛔ Files ignored due to path filters (1)
  • conf/springConfigXml/VolumeManager.xml is excluded by !**/*.xml
📒 Files selected for processing (16)
  • header/src/main/java/org/zstack/header/storage/addon/primary/CreateVolumeSpec.java
  • header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionBackend.java
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java
  • plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java
  • plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java
  • plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsVolumeEncryptionBackendImpl.java
  • storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsEncryptedEmptyVolumeCreator.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionCommands.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionConstants.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionConverter.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionExtension.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionMaterialFactory.java
  • storage/src/main/java/org/zstack/storage/volume/VolumeBase.java
  • test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsVolumeEncryptionCase.groovy

Walkthrough

新增 ZBS/CBD 卷明文与 LUKS 加密双向转换能力,包含消息路由、目标卷创建、KVM 转换、快照门禁、容量回填、失败清理及集成测试。

Changes

ZBS 卷加密转换

Layer / File(s)Summary
转换设计与实施边界
docs/superpowers/...
新增转换架构、数据流、失败语义、测试范围和实施计划。
消息契约与主存储路由
header/src/main/java/org/zstack/header/storage/addon/primary/*, storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java, plugin/{expon,zbs}/...
新增转换消息接口、ZBS 后端扩展、主存储处理和控制器转发。
CBD 路径与转换目标管理
storage/src/main/java/org/zstack/storage/volume/VolumeBase.java, plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsVolumeEncryptionBackendImpl.java
支持 CBD 路径识别、快照拒绝、同池校验、目标创建及删除。
KVM 转换编排与结果回填
storage/src/main/java/org/zstack/storage/encrypt/*
完成请求校验、DEK 准备、KVM LUKS 转换、容量查询和失败清理。
转换场景与失败语义验证
test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsVolumeEncryptionCase.groovy
覆盖双向转换、快照门禁、参数验证、容量回退、冲突和目标清理。

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
participant ExternalPrimaryStorage
participant ZbsStorageController
participant ZbsVolumeEncryptionConverter
participant ZbsVolumeEncryptionBackend
participant KVMHost
ExternalPrimaryStorage->>ZbsStorageController: 转发转换消息
ZbsStorageController->>ZbsVolumeEncryptionConverter: 执行转换
ZbsVolumeEncryptionConverter->>ZbsVolumeEncryptionBackend: 创建目标卷
ZbsVolumeEncryptionConverter->>KVMHost: 执行 LUKS 转换
KVMHost-->>ZbsVolumeEncryptionConverter: 返回实际容量或错误
ZbsVolumeEncryptionConverter->>ZbsVolumeEncryptionBackend: 失败时删除目标卷
ZbsVolumeEncryptionConverter-->>ExternalPrimaryStorage: 返回转换结果
Loading

Poem

我是兔子蹦蹦跳,
CBD 新路铺得妙。
LUKS 来回换装忙,
快照门前先停跑。
失败只清新目标,
胡萝卜庆祝代码好!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ Passed标题简洁且准确概括了为 ZBS/CBD 云盘新增加密转换支持的主要变更。
Description check✅ Passed描述与变更内容一致,概括了双向转换、快照拒绝和相关测试覆盖。
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/zstackio/codex/zbs-change-volume-encryption

Comment @coderabbitai help to get the list of available commands.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
docs/superpowers/plans/2026-07-15-zbs-change-volume-encryption-implementation.md (1)

37-40: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

不要把开发者本机路径写进执行步骤。

命令硬编码 /Users/mizar/... worktree 和固定 /tmp/... 目录,其他开发者或 CI 无法直接复现,且可能误用错误分支。请统一使用环境变量或仓库相对路径,并让 groovy_test 与最终 compile 复用同一组变量。

Also applies to: 131-135, 194-202, 271-288, 376-405

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@docs/superpowers/plans/2026-07-15-zbs-change-volume-encryption-implementation.md`
around lines 37 - 40, 移除执行步骤中的开发者本机 worktree 路径和固定临时目录,改用仓库相对路径或统一定义的环境变量;让
groovy_test、最终 compile 及相关命令复用同一组路径变量,并同步更新所列其他步骤,确保开发者和 CI 可直接复现且使用当前仓库版本。
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java`:
- Around line 39-40: 为 PrimaryStorageControllerSvc.convertVolumeEncryption 和
ZbsVolumeEncryptionExtensionPoint 中对应的新增接口方法补充有效
Javadoc;前者说明主存储控制器的转换请求、ReturnValueCompletion 回调结果及失败行为,后者说明 ZBS
后端的输入约束和异步回调语义。涉及文件
header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java(39-40)和
header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java(28-29),分别直接添加方法契约文档,保持现有接口签名不变。
In
`@header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionBackend.java`:
- Around line 24-29: 为接口中的 validateConversionPaths、createConversionTarget 和
deleteConversionTarget 方法补充有效 Javadoc:说明源路径与目标路径的约束,描述 targetEncrypted
对分配大小的影响,明确 createConversionTarget 回调返回路径的语义,并说明 deleteConversionTarget
仅在目标成功删除时触发成功回调。
In
`@plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsVolumeEncryptionBackendImpl.java`:
- Around line 223-234: Update the cleanup path in the conversion error branch of
ZbsVolumeEncryptionBackendImpl to pass createdInstallPath to
deleteConversionTarget instead of targetInstallPath, ensuring the unexpectedly
created volume is removed without affecting data at the expected path.
---
Nitpick comments:
In
`@docs/superpowers/plans/2026-07-15-zbs-change-volume-encryption-implementation.md`:
- Around line 37-40: 移除执行步骤中的开发者本机 worktree 路径和固定临时目录,改用仓库相对路径或统一定义的环境变量;让
groovy_test、最终 compile 及相关命令复用同一组路径变量,并同步更新所列其他步骤,确保开发者和 CI 可直接复现且使用当前仓库版本。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: fb301811-c9b3-430c-b8b6-1915cf66ab73

📥 Commits

Reviewing files that changed from the base of the PR and between 27aafe6 and 652b81b.

⛔ Files ignored due to path filters (1)
  • conf/springConfigXml/VolumeManager.xml is excluded by !**/*.xml
📒 Files selected for processing (15)
  • docs/superpowers/plans/2026-07-15-zbs-change-volume-encryption-implementation.md
  • docs/superpowers/specs/2026-07-15-zbs-change-volume-encryption-design.md
  • header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionBackend.java
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java
  • plugin/expon/src/main/java/org/zstack/expon/ExponStorageController.java
  • plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsStorageController.java
  • plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsVolumeEncryptionBackendImpl.java
  • storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionCommands.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionConstants.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionConverter.java
  • storage/src/main/java/org/zstack/storage/encrypt/ZbsVolumeEncryptionExtension.java
  • storage/src/main/java/org/zstack/storage/volume/VolumeBase.java
  • test/src/test/groovy/org/zstack/test/integration/storage/primary/addon/zbs/ZbsVolumeEncryptionCase.groovy

Comment on lines +39 to +40
void convertVolumeEncryption(ConvertVolumeEncryptionOnPrimaryStorageMsg msg,
ReturnValueCompletion<ConvertVolumeEncryptionOnPrimaryStorageReply> completion);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

为两个新增接口方法补充有效 Javadoc。

这两个新增接口方法共同缺少契约说明,违反接口方法文档规范:

  • header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java#L39-L40:说明主存储控制器的转换请求、回调结果及失败行为。
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java#L28-L29:说明 ZBS 后端转换扩展点的输入约束和异步回调语义。

根据路径规范,接口方法必须配有有效的 Javadoc。

📍 Affects 2 files
  • header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java#L39-L40 (this comment)
  • header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java#L28-L29
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java`
around lines 39 - 40, 为 PrimaryStorageControllerSvc.convertVolumeEncryption 和
ZbsVolumeEncryptionExtensionPoint 中对应的新增接口方法补充有效
Javadoc;前者说明主存储控制器的转换请求、ReturnValueCompletion 回调结果及失败行为,后者说明 ZBS
后端的输入约束和异步回调语义。涉及文件
header/src/main/java/org/zstack/header/storage/addon/primary/PrimaryStorageControllerSvc.java(39-40)和
header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionExtensionPoint.java(28-29),分别直接添加方法契约文档,保持现有接口签名不变。

Source: Path instructions

Comment on lines +24 to +29
void validateConversionPaths(String sourceInstallPath, String targetInstallPath);

void createConversionTarget(String targetInstallPath, long virtualSize, boolean targetEncrypted,
ReturnValueCompletion<String> completion);

void deleteConversionTarget(String targetInstallPath, Completion completion);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

请为新增接口方法补充有效的 Javadoc。

至少应说明路径约束、targetEncrypted 对分配大小的影响、返回路径语义,以及删除回调的成功条件。

As per path instructions, “接口方法必须配有有效的 Javadoc 注释”。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@header/src/main/java/org/zstack/header/storage/addon/primary/ZbsVolumeEncryptionBackend.java`
around lines 24 - 29, 为接口中的 validateConversionPaths、createConversionTarget 和
deleteConversionTarget 方法补充有效 Javadoc:说明源路径与目标路径的约束,描述 targetEncrypted
对分配大小的影响,明确 createConversionTarget 回调返回路径的语义,并说明 deleteConversionTarget
仅在目标成功删除时触发成功回调。

Source: Path instructions

Comment on lines +223 to +234
String createdInstallPath = returnValue.getInstallPath();
if (targetInstallPath.equals(createdInstallPath)) {
completion.success(createdInstallPath);
return;
}

ErrorCode error = operr(
"ZBS volume encryption conversion target[%s] was created at unexpected path[%s]",
targetInstallPath, createdInstallPath);
String cleanupInstallPath = targetInstallPath;
try {
deleteConversionTarget(cleanupInstallPath, new Completion(completion) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

路径不匹配时应删除实际创建的目标。

当前清理 targetInstallPath,而不是 createdInstallPath。这会遗留意外创建的卷,并可能误删预期路径上已有的数据。

建议修改
 String createdInstallPath = returnValue.getInstallPath();
...
-String cleanupInstallPath = targetInstallPath;+String cleanupInstallPath = createdInstallPath;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
StringcreatedInstallPath = returnValue.getInstallPath();
if (targetInstallPath.equals(createdInstallPath)) {
completion.success(createdInstallPath);
return;
}
ErrorCodeerror = operr(
"ZBS volume encryption conversion target[%s] was created at unexpected path[%s]",
targetInstallPath, createdInstallPath);
StringcleanupInstallPath = targetInstallPath;
try {
deleteConversionTarget(cleanupInstallPath, newCompletion(completion) {
StringcreatedInstallPath = returnValue.getInstallPath();
if (targetInstallPath.equals(createdInstallPath)) {
completion.success(createdInstallPath);
return;
}
ErrorCodeerror = operr(
"ZBS volume encryption conversion target[%s] was created at unexpected path[%s]",
targetInstallPath, createdInstallPath);
StringcleanupInstallPath = createdInstallPath;
try {
deleteConversionTarget(cleanupInstallPath, newCompletion(completion) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@plugin/zbs/src/main/java/org/zstack/storage/zbs/ZbsVolumeEncryptionBackendImpl.java`
around lines 223 - 234, Update the cleanup path in the conversion error branch
of ZbsVolumeEncryptionBackendImpl to pass createdInstallPath to
deleteConversionTarget instead of targetInstallPath, ensuring the unexpectedly
created volume is removed without affecting data at the expected path.

@MatheMatrix
MatheMatrixforce-pushed the sync/zstackio/codex/zbs-change-volume-encryption branch 2 times, most recently from c47cbed to b29ef3bCompareJuly 15, 2026 05:06
Route ZBS conversion through a dedicated backend and KVM handler.
Tests: cbok zsv groovy_test ZbsVolumeEncryptionCase
Resolves: ZSV-12664
Change-Id: Ibd30f74dd17cb4dc817e57c713b0f32915487e7c
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ZStack-Robot@MatheMatrix