Skip to content

Conversation

@zstack-robot-1
Copy link
Collaborator

support dpu baremetal2 instance

Resolves/Related: ZSTAC-12345

Change-Id: I626d637a7168656a6c726c6769777a726e616973

sync from gitlab !9016

@coderabbitai
Copy link

coderabbitai bot commented Jan 13, 2026

Walkthrough

新增两张数据库表以支持 DPU 实体(BareMetal2DpuChassisVOBareMetal2DpuHostVO);调整 BareMetal2InstanceVO 外键指向 HostEO(uuid) 并在删除时设为 NULL;在集群创建 API 的 hypervisorType 有效值中加入 baremetal2DpuHostManagerImpl 添加对 baremetal2Dpu 的跳过逻辑;testlib 大量新增 API helper 方法。

Changes

Cohort / File(s) 变更说明
数据库架构迁移
conf/db/upgrade/V5.5.0__schema.sql
新增表 BareMetal2DpuChassisVOuuid PK/UNIQUE, config, hostUuiduuid FK→BareMetal2ChassisVO(uuid) ON DELETE CASCADE;hostUuid FK→HostEO(uuid) ON DELETE SET NULL)和 BareMetal2DpuHostVOuuid PK/UNIQUE, chassisUuid, vendorType, urluuid FK→HostEO(uuid) ON DELETE CASCADE;chassisUuid FK→BareMetal2ChassisVO(uuid) ON DELETE CASCADE);包含对 BareMetal2InstanceVO 约束的诊断 SELECT,并删除后重建两个外键使其引用 HostEO(uuid)(ON DELETE SET NULL)。
集群 API 参数扩展
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
@APIParam(validValues = {...}) 中新增有效值 "baremetal2Dpu"
API 文档(中文)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
同步在中文文档示例/说明中加入 "baremetal2Dpu"
主机管理逻辑
compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java
在添加主机的跳过条件中将 baremetal2Dpu 加入与 baremetal2 相同的跳过分支,影响架构一致性检查路径。
测试/辅助库扩展
testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
大量新增(数百个)API helper 方法,覆盖 IAM/组织、网络/安全、监控/告警、第三方云与存储等场景;均为新增函数,样式与现有模式一致,变更集中在单一文件。

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 新表像胡萝卜成行摆,
箱与主机并肩来相贷,
键约改指主机空位留,
集群名里添了新彩带,
小兔轻跳庆合并到位。

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring 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 (2 passed)
Check name Status Explanation
Title check ✅ Passed PR标题遵循了指定的[scope]: 格式,包含特征类型、范围和清晰的描述,长度为51字符,在72字符限制内。
Description check ✅ Passed PR描述与变更集相关,清楚地说明了添加DPU baremetal2实例支持的目标,包含相关问题追踪和变更标识。

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

68-75: APICreateClusterMsg 中新增的 "dpuBaremetal2" 存在多处同步缺失,将导致创建集群失败。

  1. SDK 层缺失:sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java 的 validValues 未包含 "dpuBaremetal2",与 header API 不一致。

  2. 插件注册缺失:代码中未找到 dpuBaremetal2 的任何 HypervisorFactory 实现或注册代码。调用时会在 HypervisorType.valueOf() 抛出 IllegalArgumentException: Hypervisor type: dpuBaremetal2 was not registered by any HypervisorFactory

  3. 文档过时@Choices 注释(第69-72行)仅列出 KVM、Simulator、baremetal,缺少 baremetal2、xdragon、dpuBaremetal2 的说明。

需要:补充 dpuBaremetal2 的工厂类注册、同步 SDK CreateClusterAction、更新 @Choices 文档。

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 480-498: BareMetal2DpuHostVO will fail to create because
chassisUuid is VARCHAR(255) while BareMetal2ChassisVO.uuid is VARCHAR(32) and
two constraints reuse names; change BareMetal2DpuHostVO.chassisUuid to
VARCHAR(32) to match BareMetal2ChassisVO(uuid), give each FOREIGN KEY a unique
name (e.g., use distinct names on BareMetal2DpuChassisVO and BareMetal2DpuHostVO
instead of reusing fkBareMetal2DpuChassisVOHostVO /
fkBareMetal2DpuChassisVOChassisVO), and fully qualify referenced tables in both
CONSTRAINT clauses with `zstack`.`BareMetal2ChassisVO` and `zstack`.`HostVO` to
avoid relying on default schema.
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5c0eddd and 8409ed8.

📒 Files selected for processing (2)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (3)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • conf/db/upgrade/V5.5.0__schema.sql
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (2)
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
🔍 Remote MCP AtlassianMCP

Perfect! Now I have gathered comprehensive information. Let me compile the findings:

Summary of Relevant Context for PR #3197 Review

DPU (Data Processing Unit) Concept DPU is a specialized hardware processor used to offload management, networking, and storage infrastructure operations from baremetal compute nodes. This enables diskless compute pools with separation of storage and compute resources, supporting minute-level baremetal instance delivery with zero resource consumption on the host side.

Related Jira Issues - DPU Baremetal2 Integration There are multiple active DPU baremetal integration tasks:

  • ZSTAC-80834 (Closed - lei.liu): "[亚格DPU] DPU裸金属对接" - focused on hardware planning, network configuration, and DPU command testing
  • ZSTAC-80830 (Open - yingzhe.hu): "[亚格DPU] DPU裸金属对接" - similar scope for DPU integration
  • ZSTAC-80832, ZSTAC-80833, ZSTAC-80831 (Open/Closed): Additional DPU integration tasks across the team

Database Schema Design The PR aligns with documented database design specifications:

  • BareMetal2DpuChassisVO: Stores DPU-managed baremetal chassis information, inheriting from ChassisVO with fields:

    • uuid (primary key, references BareMetal2ChassisVO)
    • config (generic JSON config for vendor-specific IPMI/management details)
    • hostUuid (foreign key to HostVO for hypervisor capabilities)
  • BareMetal2DpuHostVO: Stores DPU card system information, inheriting from HostVO with fields:

    • uuid (primary key, references HostVO)
    • chassisUuid (foreign key to BareMetal2ChassisVO)
    • vendorType (vendor identifier, e.g., "yucca")
    • url (SSH connection URL to DPU)

Hypervisor Type Extension The new hypervisor type introduced is "baremetal2.dpu" with cluster type remaining "baremetal2". The PR's addition of "dpuBaremetal2" as a valid APICreateClusterMsg hypervisor type aligns with this architecture where DPU operates as a specialized HostVO extension similar to gateways.

Schema Reference Note

The AI summary indicates the referenced Jira issue "ZSTAC-12345" does not relate to this DPU feature. That issue concerns licensing functionality, not baremetal2 DPU support.

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from 8409ed8 to 59ee53e Compare January 13, 2026 07:11
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 489-497: The chassisUuid column in the BareMetal2DpuHostVO table
uses VARCHAR(255) but must match the UUID size used elsewhere; change the column
definition for chassisUuid in the CREATE TABLE for BareMetal2DpuHostVO to
VARCHAR(32) so it matches BareMetal2ChassisVO(uuid) and other ZStack UUID
columns, preserving the foreign key CONSTRAINT fkBareMetal2DpuHostVOChassisVO
and ON DELETE CASCADE behavior.
🧹 Nitpick comments (2)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

67-74: Javadoc @choices 注释与实际 validValues 不一致。

文档注释(第 69-72 行)仅列出了 KVMSimulatorbaremetal,但实际 validValues 还包括 baremetal2xdragon 和新增的 dpuBaremetal2。建议更新注释以保持一致性。

📝 建议更新文档
     /**
      * @desc see field 'hypervisorType' of :ref:`ClusterInventory` for details
-     * @choices - KVM
-     * - Simulator
-     * - baremetal
+     * @choices - KVM
+     * - Simulator
+     * - baremetal
+     * - baremetal2
+     * - xdragon
+     * - dpuBaremetal2
      */
     @APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon", "dpuBaremetal2"})
conf/db/upgrade/V5.5.0__schema.sql (1)

489-497: 建议为新表添加 createDatelastOpDate 时间戳列。

BareMetal2DpuHostVO 表缺少 createDatelastOpDate 列。虽然不是强制要求,但添加这些列有助于审计和问题排查,与本文件中其他表的设计保持一致。

♻️ 建议添加时间戳列
 CREATE TABLE IF NOT EXISTS  `zstack`.`BareMetal2DpuHostVO` (
     `uuid` varchar(32) NOT NULL UNIQUE,
     `chassisUuid` VARCHAR(32) NOT NULL,
     `vendorType` VARCHAR(255) NOT NULL,
     `url` VARCHAR(255) NOT NULL,
+    `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP,
+    `createDate` timestamp DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY  (`uuid`),
     CONSTRAINT `fkBareMetal2DpuHostVOHostVO` FOREIGN KEY (`uuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE,
     CONSTRAINT `fkBareMetal2DpuHostVOChassisVO` FOREIGN KEY (`chassisUuid`) REFERENCES `BareMetal2ChassisVO` (`uuid`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

同样的建议也适用于 BareMetal2DpuChassisVO 表。

📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8409ed8 and 59ee53e.

📒 Files selected for processing (2)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (3)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧠 Learnings (8)
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🔍 Remote MCP AtlassianMCP

Additional context found for PR #3197

  • Jira ZSTAC-12345 (referenced in PR) is about a community-license issue: "community edition license — after adding sub-license for enterprise management, creating a user shows 'The license is not permitted for the operation'". Status: Open (P2). Assignee: pingping.shi. Created: 2018-05-24; last updated: 2025-12-25.
🔇 Additional comments (3)
conf/db/upgrade/V5.5.0__schema.sql (3)

88-89: 违反编码规范:使用了 DEFAULT '0000-00-00 00:00:00'

根据编码规范,不应使用 DEFAULT '0000-00-00 00:00:00',应改用 DEFAULT CURRENT_TIMESTAMP。这会导致在 MySQL 严格模式下出现问题。

此问题存在于多处(第 88-89、109-110、167-168、178-179、190-191 行),但这些是文件中已有的代码,非本次变更引入。仅作为提醒。

Also applies to: 109-110


480-487: BareMetal2DpuChassisVO 表结构合理。

表设计正确,使用了 TEXT 类型存储 config(符合规范中对不可控长度字符串的建议),外键约束和级联删除设置恰当。


480-497: 确认父表 BareMetal2ChassisVO 在此迁移脚本执行前已存在。

两个新表都通过外键约束引用 BareMetal2ChassisVO。请确保:

  1. BareMetal2ChassisVO 表已在该升级脚本中的更早位置定义,或在之前的迁移脚本中存在
  2. 在执行此迁移时,该父表不会被删除或修改,导致外键约束失败

Comment on lines 73 to 74
@APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon", "dpuBaremetal2"})
private String hypervisorType;
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for HypervisorType definition
echo "=== Searching for HypervisorType definition ==="
rg -n 'class HypervisorType|enum HypervisorType' --type=java -A 10

echo "=== Searching for HypervisorType as constant/enum with values ==="
rg -n 'HypervisorType\s*=' --type=java | head -20

Repository: MatheMatrix/zstack

Length of output: 2083


🏁 Script executed:

#!/bin/bash
# Search for dpuBaremetal2 references in the codebase
echo "=== Searching for dpuBaremetal2 ==="
rg -n 'dpuBaremetal2' -i

echo "=== Searching for BareMetal2Dpu related classes ==="
rg -n 'BareMetal2Dpu' --type=java

Repository: MatheMatrix/zstack

Length of output: 329


🏁 Script executed:

#!/bin/bash
# Search for baremetal2 references to understand the pattern
echo "=== Searching for baremetal2 references ==="
rg -n 'baremetal2' -i --type=java | head -30

echo "=== Look for HypervisorType usage patterns ==="
rg -n 'hypervisorType' -i --type=java -B 2 -A 2 | head -50

Repository: MatheMatrix/zstack

Length of output: 9510


🏁 Script executed:

#!/bin/bash
# Read the full HypervisorType class
echo "=== Reading HypervisorType.java ==="
cat header/src/main/java/org/zstack/header/host/HypervisorType.java

echo "=== Searching for where hypervisor types are registered ==="
rg -n 'new HypervisorType' --type=java -B 2 -A 2 | head -100

Repository: MatheMatrix/zstack

Length of output: 5849


🏁 Script executed:

#!/bin/bash
# Search for handlers or processors for different hypervisor types
echo "=== Searching for dpuBaremetal handler/processor ==="
rg -n 'dpuBaremetal|DpuBaremetal' --type=java

echo "=== Searching for baremetal2 handler to understand pattern ==="
rg -n 'class.*BareMetal2.*Host' --type=java | head -20

Repository: MatheMatrix/zstack

Length of output: 506


🏁 Script executed:

#!/bin/bash
# Check if SDK files need to be regenerated
echo "=== Check CreateClusterAction in SDK ==="
cat sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java | head -50

Repository: MatheMatrix/zstack

Length of output: 2193


需要完整实现 dpuBaremetal2 hypervisor 类型,当前仅在 API 层添加了验证值。

添加 dpuBaremetal2APICreateClusterMsg.javavalidValues 是必要的,但此变更目前不完整。需要补充以下工作:

  1. 缺少 HypervisorType 注册:未找到 dpuBaremetal2HypervisorType 类型注册。应参考 KVM/Simulator 的实现方式,在相应的 HypervisorFactory 中注册该类型。

  2. SDK 文件不同步:生成的 SDK 文件 CreateClusterAction.javahypervisorType 验证值仍为 {"KVM","Simulator","baremetal","baremetal2","xdragon"},不包含 dpuBaremetal2,需要重新生成。

  3. 缺少 handler/processor 实现:未在代码库中找到 dpuBaremetal2 的处理逻辑实现。

  4. VO 类不存在:所声称的 BareMetal2DpuChassisVOBareMetal2DpuHostVO 在代码库中未找到。搜索结果仅发现常规的 BareMetal2* 类,不存在 DPU 变体。

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch 2 times, most recently from daf7354 to 6a4044d Compare January 13, 2026 07:57
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 489-497: The column definition for chassisUuid in table
BareMetal2DpuHostVO is wrong length; change its type from VARCHAR(255) to
VARCHAR(32) so it matches the referenced BareMetal2ChassisVO(uuid) and project
UUID convention; update the CREATE TABLE for BareMetal2DpuHostVO (column
chassisUuid and any related definitions) so the FOREIGN KEY constraint
fkBareMetal2DpuHostVOChassisVO still references BareMetal2ChassisVO(uuid) with
matching VARCHAR(32) types.
🧹 Nitpick comments (2)
conf/db/upgrade/V5.5.0__schema.sql (2)

493-493: url 字段长度可能不足

url 字段定义为 VARCHAR(255),但 URL 长度可能超过 255 字符(例如包含长路径或查询参数)。根据编码规范,对于长度不可控的字符串应使用 TEXT 类型。

♻️ 建议修改
     `uuid` varchar(32) NOT NULL UNIQUE,
     `chassisUuid` VARCHAR(32) NOT NULL,
     `vendorType` VARCHAR(255) NOT NULL,
-    `url` VARCHAR(255) NOT NULL,
+    `url` TEXT NOT NULL,
     PRIMARY KEY  (`uuid`),

根据编码规范:如果字符串长度不可控,不要用 varchar,用 text 类型。


480-497: 两个新表缺少 createDatelastOpDate 时间戳字段

与本文件中其他表(如 HygonCcpDeviceVONfvInstGroupVO 等)相比,BareMetal2DpuChassisVOBareMetal2DpuHostVO 缺少用于审计追踪的时间戳字段。建议添加以保持一致性。

♻️ 建议添加时间戳字段
 CREATE TABLE IF NOT EXISTS  `zstack`.`BareMetal2DpuChassisVO` (
     `uuid` varchar(32) NOT NULL UNIQUE,
     `config` TEXT  DEFAULT NULL,
     `hostUuid` varchar(32) DEFAULT NULL,
+    `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP,
+    `createDate` timestamp DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY  (`uuid`),
     ...
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 CREATE TABLE IF NOT EXISTS  `zstack`.`BareMetal2DpuHostVO` (
     `uuid` varchar(32) NOT NULL UNIQUE,
     `chassisUuid` VARCHAR(32) NOT NULL,
     `vendorType` VARCHAR(255) NOT NULL,
     `url` TEXT NOT NULL,
+    `lastOpDate` timestamp ON UPDATE CURRENT_TIMESTAMP,
+    `createDate` timestamp DEFAULT CURRENT_TIMESTAMP,
     PRIMARY KEY  (`uuid`),
     ...
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 59ee53e and daf7354.

⛔ Files ignored due to path filters (2)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (3)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🚧 Files skipped from review as they are similar to previous changes (1)
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • conf/db/upgrade/V5.5.0__schema.sql
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (11)
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-25T03:52:37.301Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2504
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:775-819
Timestamp: 2025-08-25T03:52:37.301Z
Learning: 在ZStack项目的VolumeSnapshotTreeBase类中,当通过dbf.findByUuid()方法获取VolumeVO对象时,需要进行null检查,因为该方法可能在找不到对应记录时返回null,直接使用可能导致NullPointerException。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-22T06:31:57.406Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2489
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:179-179
Timestamp: 2025-08-22T06:31:57.406Z
Learning: 在ZStack项目的VolumeSnapshotAO类中,团队决定不为treeUuid字段添加Index注解,即使这可能会影响查询性能。团队优先考虑代码稳定性而非性能优化。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
🔍 Remote MCP AtlassianMCP

Relevant context for PR #3197

  • Jira ZSTAC-12345 (referenced by the PR) — summary: "community edition license — after adding enterprise sub-license, creating a user shows 'The license is not permitted for the operation'". Status: Open. Assignee: pingping.shi. Created: 2018-05-24; last updated: 2025-12-25. Recent comments indicate the issue reference in this PR may be incorrect (developer comment: "开发引用bug,贴错了").
🔇 Additional comments (2)
conf/db/upgrade/V5.5.0__schema.sql (1)

479-498: PR 中引用的 Jira 问题可能不正确

根据外部工具信息,PR 描述中引用的 ZSTAC-12345 是一个关于"license 权限"的问题,与 DPU baremetal2 功能无关。最近的评论也指出"开发引用bug,贴错了"。请确认并更正 PR 中引用的 issue。

header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy (1)

59-59: 修正文档中的 hypervisorType 值,使其与 API 定义一致。

发现严重的命名不一致:API 定义(APICreateClusterMsg.java 第 73 行)使用 "dpuBaremetal2",但当前文档(第 59 行)使用 "baremetal2Dpu"。文档应改为 "dpuBaremetal2" 以匹配实际的 API 实现。

详情
  • API 定义(header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java 第 73 行):"dpuBaremetal2"
  • 文档当前值(第 59 行):"baremetal2Dpu"

需要将第 59 行的 "baremetal2Dpu" 修正为 "dpuBaremetal2"

⛔ Skipped due to learnings
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnControllerTenantInventoryDoc_zh_cn.groovy:7-7
Timestamp: 2025-08-13T02:36:46.298Z
Learning: Documentation files ending with "_zh_cn" are automatically generated localization files for Chinese users and may be exempt from the coding guideline that prohibits Chinese text in code.
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2380
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotManagerImpl.java:1232-1232
Timestamp: 2025-08-06T05:53:38.558Z
Learning: 在ZStack项目中,代码注释应该准确反映实际实现。如果代码只查询特定类型的归档数据(如ArchiveVmNicBundle),注释不应该说成"所有设备地址归档",而应该具体说明查询的是哪种类型的归档。
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/APIPullSdnControllerTenantEventDoc_zh_cn.groovy:27-27
Timestamp: 2025-08-13T02:38:35.188Z
Learning: Auto-generated documentation files in ZStack, particularly those with "_zh_cn" suffix, are exempt from the coding guideline that prohibits Chinese text, as confirmed by user feedback that these files are automatically generated for localization purposes.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In
@header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy:
- Line 59: 文档中的枚举值与 API 定义不一致:在 APICreateClusterMsgDoc_zh_cn.groovy 的 values 列表将
"baremetal2Dpu" 改为与 APICreateClusterMsg.java 中的合法值一致,即使用
"dpuBaremetal2"(或相反,若决定改 API 则更新 APICreateClusterMsg.java 的枚举和值),确保值在
APICreateClusterMsg(参数校验处)与 APICreateClusterMsgDoc_zh_cn.groovy 的 values
列表完全一致以避免校验失败。
🧹 Nitpick comments (1)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

67-74: Javadoc @choices 注释已过时。

注释仅列出 KVMSimulatorbaremetal,但实际 validValues 已包含 baremetal2xdragondpuBaremetal2。建议同步更新文档注释以保持一致性。

建议修复
     /**
      * @desc see field 'hypervisorType' of :ref:`ClusterInventory` for details
      * @choices - KVM
      * - Simulator
      * - baremetal
+     * - baremetal2
+     * - xdragon
+     * - dpuBaremetal2
      */
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between daf7354 and 6a4044d.

⛔ Files ignored due to path filters (2)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (3)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🚧 Files skipped from review as they are similar to previous changes (1)
  • conf/db/upgrade/V5.5.0__schema.sql
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧠 Learnings (2)
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🔍 Remote MCP AtlassianMCP

Summary of additional context relevant to PR #3197

  • Jira ZSTAC-12345 details: open, summary about a license bug; recent comment by the assignee says "开发引用bug,贴错了" (developer referenced the wrong bug) — suggests the PR's reference to ZSTAC-12345 is likely incorrect. Key fields (summary, status, assignee, comments, changelog) reviewed.

  • Confluence search found multiple DPU / "dpu baremetal2" design and integration pages (examples):

    • "dpu裸金属管理(控制面)" — documents BareMetal2DpuHostVO and BareMetal2DpuChassisVO and DB design notes (matches new tables in schema).
    • "亚格DPU对接-后端", "DPU弹性裸金属管控面", "dpu (draft)", "nvidia dpu" — architecture, network/storage planning, and implementation notes relevant to the new hypervisor type and DB changes.

Sources used

  • AtlassianMCP_jira_get_issue (ZSTAC-12345) — Jira issue details and comments.
  • AtlassianMCP_confluence_search ("dpu baremetal2" / "baremetal2 dpu") — Confluence pages describing DPU integration and VO/table design that align with the PR's DB and API changes.
🔇 Additional comments (1)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

73-73: 修复 hypervisor 类型命名不一致:API 中使用 dpuBaremetal2,但 SDK 和文档中使用 baremetal2Dpu

API 消息类 APICreateClusterMsg.java 中定义了 dpuBaremetal2,但生成的 SDK 类 CreateClusterAction.java 和中文文档 APICreateClusterMsgDoc_zh_cn.groovy 中仍使用 baremetal2Dpu,这会导致 API 契约不一致,影响 SDK 客户端正常使用。

需要统一这两个命名:确保 SDK 和文档中的 hypervisorType 有效值与 API 头文件保持一致。

⛔ Skipped due to learnings
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2823
File: plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java:786-831
Timestamp: 2025-10-28T02:29:38.803Z
Learning: APIUpdateHostnameMsg 的主机名有效性已在 API 层(HostApiInterceptor/VmHostnameUtils)完成校验;KVMHost.handle(UpdateHostnameMsg) 不应重复校验。
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

optional false
since "0.6"
values ("KVM","Simulator","baremetal","baremetal2","xdragon")
values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu")
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

命名不一致:文档使用 baremetal2Dpu,但 API 代码使用 dpuBaremetal2

APICreateClusterMsg.java 中定义的有效值是 "dpuBaremetal2",而此处文档写的是 "baremetal2Dpu"。用户按照文档传入 baremetal2Dpu 将导致参数校验失败。

建议修复
-				values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu")
+				values ("KVM","Simulator","baremetal","baremetal2","xdragon","dpuBaremetal2")
📝 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
values ("KVM","Simulator","baremetal","baremetal2","xdragon","baremetal2Dpu")
values ("KVM","Simulator","baremetal","baremetal2","xdragon","dpuBaremetal2")
🤖 Prompt for AI Agents
In
@header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
at line 59, 文档中的枚举值与 API 定义不一致:在 APICreateClusterMsgDoc_zh_cn.groovy 的 values
列表将 "baremetal2Dpu" 改为与 APICreateClusterMsg.java 中的合法值一致,即使用
"dpuBaremetal2"(或相反,若决定改 API 则更新 APICreateClusterMsg.java 的枚举和值),确保值在
APICreateClusterMsg(参数校验处)与 APICreateClusterMsgDoc_zh_cn.groovy 的 values
列表完全一致以避免校验失败。

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from 6a4044d to 3a735d1 Compare January 13, 2026 08:20
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

67-74: Javadoc @choices 注释与实际 validValues 不一致。

第 69-72 行的 Javadoc @choices 仅列出了 KVMSimulatorbaremetal,但实际的 validValues 包含了 baremetal2xdragon 和新增的 baremetal2Dpu。建议更新 Javadoc 以保持文档一致性。

📝 建议修复
     /**
      * @desc see field 'hypervisorType' of :ref:`ClusterInventory` for details
-     * @choices - KVM
-     * - Simulator
-     * - baremetal
+     * @choices - KVM
+     * - Simulator
+     * - baremetal
+     * - baremetal2
+     * - xdragon
+     * - baremetal2Dpu
      */
     @APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon", "baremetal2Dpu"})
     private String hypervisorType;
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6a4044d and 3a735d1.

⛔ Files ignored due to path filters (2)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (3)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🚧 Files skipped from review as they are similar to previous changes (1)
  • conf/db/upgrade/V5.5.0__schema.sql
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧠 Learnings (3)
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🔍 Remote MCP AtlassianMCP

Relevant findings (concise)

  • Jira ZSTAC-12345 is an open issue about a community-license bug (creating users after adding a sub-license) — appears unrelated to DPU/baremetal2 feature; likely the PR referenced the wrong Jira.
    Source:

  • Confluence contains multiple DPU / “dpu baremetal2” design pages. Notable pages:

    • "dpu裸金属管理(控制面)" — explicitly documents BareMetal2DpuHostVO and BareMetal2DpuChassisVO and DB design (matches the new DB tables in this PR).
    • "亚格DPU对接-后端", "DPU弹性裸金属管控面", "dpu (draft)", "nvidia dpu" — architecture, network/storage, and integration notes relevant to the new hypervisor type and DB changes.
      Source:

No further Jira comments or blockers found related to this PR's feature (the referenced Jira appears incorrect).

🔇 Additional comments (1)
header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy (1)

51-60: LGTM!

hypervisorType 的文档更新与 APICreateClusterMsg.java 中的 validValues 保持一致,正确添加了 baremetal2Dpu 选项。

Comment on lines +73 to 74
@APIParam(validValues = {"KVM", "Simulator", "baremetal", "baremetal2", "xdragon", "baremetal2Dpu"})
private String hypervisorType;
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 搜索 baremetal2Dpu 的所有引用
echo "=== 搜索 baremetal2Dpu 引用 ==="
rg -i "baremetal2Dpu" --type java -n

echo ""
echo "=== 搜索 HypervisorType 枚举定义 ==="
fd -e java -x grep -l "enum HypervisorType" {} \;

echo ""
echo "=== 搜索 ClusterFactory 实现 ==="
fd -e java -x grep -l "ClusterFactory" {} \; | head -10

echo ""
echo "=== 搜索 baremetal 相关处理器 ==="
rg "class.*Baremetal.*Handler|class.*Baremetal.*Factory" --type java -n

Repository: MatheMatrix/zstack

Length of output: 1525


🏁 Script executed:

#!/bin/bash
# 检查 ClusterType 定义
echo "=== ClusterType.java 内容 ==="
cat header/src/main/java/org/zstack/header/cluster/ClusterType.java

echo ""
echo "=== 搜索所有集群工厂实现 ==="
rg "implements ClusterFactory" --type java -A 5

echo ""
echo "=== 搜索 baremetal2Dpu 字符串在整个代码库 ==="
rg -i "baremetal2dpu" --type java -l

Repository: MatheMatrix/zstack

Length of output: 2187


🏁 Script executed:

#!/bin/bash
# 搜索所有实现 ClusterFactory 的类
echo "=== 所有 ClusterFactory 实现类 ==="
fd -e java -x grep -l "implements ClusterFactory" {} \;

echo ""
echo "=== baremetal 相关的工厂/类定义 ==="
fd -e java -path "*baremetal*" | head -20

echo ""
echo "=== 搜索 baremetal2Dpu 在工厂中的注册 ==="
rg "baremetal2Dpu|baremetal2Dpu" --type java -B 3 -A 3

echo ""
echo "=== 检查 baremetal2 工厂是否存在 ==="
fd -e java -path "*baremetal2*Factory*"

Repository: MatheMatrix/zstack

Length of output: 148


🏁 Script executed:

#!/bin/bash
# 搜索所有 Factory 实现类
echo "=== 搜索 ClusterFactory 实现 ==="
rg "implements ClusterFactory" --type java -l

echo ""
echo "=== 搜索 baremetal 相关目录 ==="
find . -type d -name "*baremetal*" 2>/dev/null | head -10

echo ""
echo "=== 检查是否存在 baremetal2Dpu 工厂类 ==="
find . -type f -name "*BareMetal2Dpu*Factory*.java" 2>/dev/null

Repository: MatheMatrix/zstack

Length of output: 224


🏁 Script executed:

#!/bin/bash
# 搜索 BareMetal2DpuChassisInventory 类
echo "=== 搜索 BareMetal2DpuChassisInventory 类 ==="
find . -type f -name "*BareMetal2DpuChassisInventory*" 2>/dev/null

echo ""
echo "=== 搜索 BareMetal2DpuHostInventory 类 ==="
find . -type f -name "*BareMetal2DpuHostInventory*" 2>/dev/null

echo ""
echo "=== 查看 BaseClusterFactory 完整实现 ==="
cat compute/src/main/java/org/zstack/compute/cluster/BaseClusterFactory.java

echo ""
echo "=== 搜索是否有其他模块注册 baremetal2Dpu ==="
rg "new ClusterType" --type java -B 2 -A 2

Repository: MatheMatrix/zstack

Length of output: 1773


baremetal2Dpu hypervisor 类型缺少完整的后端实现支持。

新增的 baremetal2Dpu hypervisor 类型已添加到 APICreateClusterMsgvalidValues 中,但在代码库中没有对应的后端实现:

  • 不存在 baremetal2DpuClusterFactory 实现和 ClusterType 注册
  • SourceClassMap.java 中引用的 BareMetal2DpuChassisInventoryBareMetal2DpuHostInventory 类不存在
  • 调用 API 创建此类型集群时,会在 ClusterType.valueOf("baremetal2Dpu") 处抛出 IllegalArgumentException

需要补全相应的工厂类、类型注册、库存类定义和处理逻辑。

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from 3a735d1 to ad25a25 Compare January 13, 2026 09:02
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 509-521: The ALTER TABLE block for BareMetal2InstanceVO
unconditionally drops and re-adds foreign keys (fkBareMetal2InstanceVOGatewayVO,
fkBareMetal2InstanceVOGatewayVO1) which breaks idempotency; update the migration
to query information_schema (TABLE_CONSTRAINTS / KEY_COLUMN_USAGE) to check
whether each constraint exists before issuing DROP FOREIGN KEY and check absence
before issuing ADD CONSTRAINT for gatewayUuid and lastGatewayUuid referencing
HostEO(uuid), or implement a small stored procedure/conditional SQL wrapper that
performs those existence checks and then conditionally runs ALTER TABLE to
ensure the script can be safely re-run.
- Around line 499-507: Remove the debug SELECT that queries
information_schema.KEY_COLUMN_USAGE for
CONSTRAINT_NAME/TABLE_NAME/COLUMN_NAME/REFERENCED_TABLE_NAME against TABLE_NAME
= 'BareMetal2InstanceVO' and COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid');
this statement does not modify data and should be deleted from the upgrade
script (V5.5.0__schema.sql); ensure no other non-mutating debug queries remain
in the migration file.
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3a735d1 and ad25a25.

⛔ Files ignored due to path filters (5)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (3)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
🚧 Files skipped from review as they are similar to previous changes (1)
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • conf/db/upgrade/V5.5.0__schema.sql
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (13)
📓 Common learnings
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-25T03:52:37.301Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2504
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:775-819
Timestamp: 2025-08-25T03:52:37.301Z
Learning: 在ZStack项目的VolumeSnapshotTreeBase类中,当通过dbf.findByUuid()方法获取VolumeVO对象时,需要进行null检查,因为该方法可能在找不到对应记录时返回null,直接使用可能导致NullPointerException。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-22T06:31:57.406Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2489
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:179-179
Timestamp: 2025-08-22T06:31:57.406Z
Learning: 在ZStack项目的VolumeSnapshotAO类中,团队决定不为treeUuid字段添加Index注解,即使这可能会影响查询性能。团队优先考虑代码稳定性而非性能优化。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-07-22T02:30:46.123Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2311
File: plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java:52-53
Timestamp: 2025-07-22T02:30:46.123Z
Learning: In ZStack, backend realization code (such as KVMRealizeHardwareVxlanNetworkBackend) can safely assume the existence of the VO for the resource being operated on (e.g., HardwareL2VxlanNetworkVO for a given L2NetworkInventory), due to system lifecycle management and strong foreign key constraints in the database schema. Explicit null checks after findByUuid are not required in these contexts.

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
🔍 Remote MCP AtlassianMCP

Summary of additional context relevant to PR #3197 (support dpu baremetal2):

  • Jira ZSTAC-12345 referenced by the PR is an unrelated license bug; issue is Open and contains comments indicating the developer pasted the wrong bug reference ("开发引用bug,贴错了。"). No comments indicate blockers for this feature.

  • Confluence search for DPU / BareMetal2Dpu returned no accessible pages via the Confluence API (no results found). If internal design docs exist, they were not found by this search and may be in restricted spaces or under different keywords.,

Sources used: AtlassianMCP.jira_get_issue, AtlassianMCP.confluence_search.

🔇 Additional comments (3)
conf/db/upgrade/V5.5.0__schema.sql (2)

480-487: LGTM!

BareMetal2DpuChassisVO 表定义正确:使用了 IF NOT EXISTS 保证幂等性,config 字段使用 TEXT 类型适合存储长度不可控的配置数据,外键约束设置合理。


489-497: LGTM!

BareMetal2DpuHostVO 表定义正确,使用了 IF NOT EXISTS,外键级联删除策略合适。

header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy (1)

59-59: LGTM!

新增 baremetal2DpuhypervisorType 的有效值列表中,与 PR 目标一致,文档更新正确。

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from ad25a25 to da46cbc Compare January 13, 2026 09:37
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 499-507: Remove the diagnostic SELECT that queries
information_schema.KEY_COLUMN_USAGE for BareMetal2InstanceVO (the SELECT
returning CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME
filtering COLUMN_NAME IN ('gatewayUuid','lastGatewayUuid')) from the upgrade
script; if you need to check constraint existence as part of the upgrade,
convert that logic into a conditional check inside the migration procedure
(e.g., a EXISTS/select INTO boolean and then conditional ALTER/DROP) instead of
emitting a standalone SELECT.
🧹 Nitpick comments (1)
conf/db/upgrade/V5.5.0__schema.sql (1)

489-497: url 字段建议使用 TEXT 类型

根据编码规范,当字符串长度不可控时应使用 text 类型而非 varchar。URL 长度可能超过 255 个字符,建议将 url 字段改为 TEXT 类型以避免潜在的数据截断问题。

♻️ 建议修改
 CREATE TABLE IF NOT EXISTS  `zstack`.`BareMetal2DpuHostVO` (
     `uuid` varchar(32) NOT NULL UNIQUE,
     `chassisUuid` VARCHAR(32) NOT NULL,
     `vendorType` VARCHAR(255) NOT NULL,
-    `url` VARCHAR(255) NOT NULL,
+    `url` TEXT NOT NULL,
     PRIMARY KEY  (`uuid`),
     CONSTRAINT `fkBareMetal2DpuHostVOHostVO` FOREIGN KEY (`uuid`) REFERENCES `HostEO` (`uuid`) ON DELETE CASCADE,
     CONSTRAINT `fkBareMetal2DpuHostVOChassisVO` FOREIGN KEY (`chassisUuid`) REFERENCES `BareMetal2ChassisVO` (`uuid`) ON DELETE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad25a25 and da46cbc.

⛔ Files ignored due to path filters (5)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (4)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
🚧 Files skipped from review as they are similar to previous changes (2)
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (10)
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-11-19T01:24:05.555Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 2920
File: conf/db/upgrade/V5.4.6__schema.sql:21-43
Timestamp: 2025-11-19T01:24:05.555Z
Learning: In ZStack's database schema, every UsedIpVO record with a non-null ipRangeUuid is guaranteed to have a corresponding IpRangeVO record with valid gateway and netmask values. This is a system-level referential integrity constraint.

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-25T03:52:37.301Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2504
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:775-819
Timestamp: 2025-08-25T03:52:37.301Z
Learning: 在ZStack项目的VolumeSnapshotTreeBase类中,当通过dbf.findByUuid()方法获取VolumeVO对象时,需要进行null检查,因为该方法可能在找不到对应记录时返回null,直接使用可能导致NullPointerException。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-22T06:31:57.406Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2489
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:179-179
Timestamp: 2025-08-22T06:31:57.406Z
Learning: 在ZStack项目的VolumeSnapshotAO类中,团队决定不为treeUuid字段添加Index注解,即使这可能会影响查询性能。团队优先考虑代码稳定性而非性能优化。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
🔍 Remote MCP AtlassianMCP

Additional context for PR #3197 (support dpu baremetal2)

Verdict for reviewer:

  • The Jira reference in the PR is unrelated — no blocking Jira context.
  • Confluence contains relevant DPU design/docs that can be used to validate the schema additions (BareMetal2Dpu* tables), the new hypervisorType value ("baremetal2Dpu"), and intended runtime/integration behavior. Recommend checking the Confluence pages linked above for specific field semantics, lifecycle expectations, and any compatibility/upgrade notes before merging.
🔇 Additional comments (2)
conf/db/upgrade/V5.5.0__schema.sql (1)

480-487: 表结构正常,但缺少时间戳字段

BareMetal2DpuChassisVO 表缺少 createDatelastOpDate 字段,这与本文件中的其他表(如 HygonCcpDeviceVONfvInstGroupVO)不一致。如果是有意为之可以忽略,否则建议添加以保持一致性。

testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy (1)

965-989: LGTM!

新增的 addBareMetal2DpuChassis 函数遵循了文件中其他 API helper 函数的标准模式(如下方的 addBlockPrimaryStorage),包括:

  • 正确设置 sessionId
  • 使用 Closure delegation 模式
  • 支持 API path tracking 功能
  • 统一的错误处理方式

代码结构清晰,无中文字符,符合编码规范。

Comment on lines +499 to +507
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'zstack'
AND TABLE_NAME = 'BareMetal2InstanceVO'
AND COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid');
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

移除诊断性 SELECT 查询

此 SELECT 语句是调试/诊断代码,在生产环境升级脚本中执行时会输出数据但不产生任何功能性效果。建议移除,或如需检查约束存在性,应将其整合到存储过程的条件判断中。

🔧 建议修改
-SELECT
-    CONSTRAINT_NAME,
-    TABLE_NAME,
-    COLUMN_NAME,
-    REFERENCED_TABLE_NAME
-FROM information_schema.KEY_COLUMN_USAGE
-WHERE TABLE_SCHEMA = 'zstack'
-  AND TABLE_NAME = 'BareMetal2InstanceVO'
-  AND COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid');
-
📝 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
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'zstack'
AND TABLE_NAME = 'BareMetal2InstanceVO'
AND COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid');
🤖 Prompt for AI Agents
In @conf/db/upgrade/V5.5.0__schema.sql around lines 499 - 507, Remove the
diagnostic SELECT that queries information_schema.KEY_COLUMN_USAGE for
BareMetal2InstanceVO (the SELECT returning CONSTRAINT_NAME, TABLE_NAME,
COLUMN_NAME, REFERENCED_TABLE_NAME filtering COLUMN_NAME IN
('gatewayUuid','lastGatewayUuid')) from the upgrade script; if you need to check
constraint existence as part of the upgrade, convert that logic into a
conditional check inside the migration procedure (e.g., a EXISTS/select INTO
boolean and then conditional ALTER/DROP) instead of emitting a standalone
SELECT.

@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from da46cbc to 0c4ea54 Compare January 13, 2026 10:43
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
conf/db/upgrade/V5.5.0__schema.sql (1)

499-507: 诊断性 SELECT 语句可能是调试遗留

此 SELECT 查询仅输出 information_schema 中的约束信息,不影响升级逻辑。如果是用于调试目的,建议在合并前移除;如果是为了日志记录,请添加注释说明用途。

header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java (1)

68-74: Javadoc @choices 注释与实际 validValues 不一致

@choices 注释仅列出了 KVMSimulatorbaremetal,但实际 validValues 已扩展为包含 baremetal2xdragonbaremetal2Dpu。建议更新注释以保持一致性。

📝 建议更新注释
     /**
      * @desc see field 'hypervisorType' of :ref:`ClusterInventory` for details
-     * @choices - KVM
-     * - Simulator
-     * - baremetal
+     * @choices - KVM
+     * - Simulator
+     * - baremetal
+     * - baremetal2
+     * - xdragon
+     * - baremetal2Dpu
      */
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between da46cbc and 0c4ea54.

⛔ Files ignored due to path filters (5)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (4)
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
🧰 Additional context used
📓 Path-based instructions (3)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (13)
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中调用 `VmNicParamValidator` 时,不需要对 msg.getType() 返回 null 的情况进行兼容处理,因为 vmType 为 null 的情况已在内部(VmNicParamValidator 或其他地方)得到处理。

Applied to files:

  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-25T03:52:37.301Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2504
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:775-819
Timestamp: 2025-08-25T03:52:37.301Z
Learning: 在ZStack项目的VolumeSnapshotTreeBase类中,当通过dbf.findByUuid()方法获取VolumeVO对象时,需要进行null检查,因为该方法可能在找不到对应记录时返回null,直接使用可能导致NullPointerException。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-22T06:31:57.406Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2489
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:179-179
Timestamp: 2025-08-22T06:31:57.406Z
Learning: 在ZStack项目的VolumeSnapshotAO类中,团队决定不为treeUuid字段添加Index注解,即使这可能会影响查询性能。团队优先考虑代码稳定性而非性能优化。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-07-22T02:30:46.123Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2311
File: plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java:52-53
Timestamp: 2025-07-22T02:30:46.123Z
Learning: In ZStack, backend realization code (such as KVMRealizeHardwareVxlanNetworkBackend) can safely assume the existence of the VO for the resource being operated on (e.g., HardwareL2VxlanNetworkVO for a given L2NetworkInventory), due to system lifecycle management and strong foreign key constraints in the database schema. Explicit null checks after findByUuid are not required in these contexts.

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-01T08:16:10.006Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2541
File: testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy:30889-30893
Timestamp: 2025-09-01T08:16:10.006Z
Learning: ApiHelper.groovy in testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy is auto-generated and should not be manually modified or receive code change suggestions.

Applied to files:

  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
🔍 Remote MCP AtlassianMCP

Key additional facts for PR #3197 review

  • The Jira referenced in the PR, ZSTAC-12345, is a license-related bug (summary: community license + enterprise sub-license error), currently Open, reporter chunli.wang, created 2018-05-24. Multiple comments indicate the issue reference in this MR is mistaken ("开发引用bug,贴错了。"). This means the Jira does not provide relevant background for the DPU/baremetal2 feature in this PR.

  • Confluence search for "dpu" / "baremetal2Dpu" returned no results via the quick search tool call (no additional pages fetched). If you want deeper Confluence context (design docs noted in previous research), request targeted Confluence page fetches or provide specific page IDs/ titles to retrieve.

🔇 Additional comments (3)
conf/db/upgrade/V5.5.0__schema.sql (1)

480-497: 新表定义缺少审计列(createDate/lastOpDate)

BareMetal2DpuChassisVOBareMetal2DpuHostVO 缺少 createDatelastOpDate 列。如果这些表是扩展表(通过外键继承父表的 uuid),且审计信息由父表 (BareMetal2ChassisVO/HostEO) 提供,则可忽略。否则建议添加审计列以保持与其他 VO 表的一致性。

header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy (1)

59-59: 文档与 API 代码保持一致

hypervisorTypevalues 已正确更新为包含 baremetal2Dpu,与 APICreateClusterMsg.java 中的 validValues 保持一致。

testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy (1)

965-989: 自动生成的代码,符合预期模式。

根据已有记录,ApiHelper.groovy 是自动生成的文件,不应手动修改。新增的 addBareMetal2DpuChassis 函数遵循与其他 API helper 函数相同的模式(如下方的 addBlockPrimaryStorage),生成结果正确。

support dpu baremetal2 instance

Resolves/Related: ZSTAC-12345

Change-Id: I626d637a7168656a6c726c6769777a726e616973
@MatheMatrix MatheMatrix force-pushed the sync/shan.wu/support-dpu-baremetal@@2 branch from 0c4ea54 to d105f17 Compare January 13, 2026 12:11
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @conf/db/upgrade/V5.5.0__schema.sql:
- Around line 509-521: The ALTER TABLE statements on BareMetal2InstanceVO
unconditionally drop and re-add foreign keys fkBareMetal2InstanceVOGatewayVO and
fkBareMetal2InstanceVOGatewayVO1 which breaks idempotency; modify the script to
query information_schema.key_column_usage / information_schema.table_constraints
to check whether each constraint (fkBareMetal2InstanceVOGatewayVO on gatewayUuid
and fkBareMetal2InstanceVOGatewayVO1 on lastGatewayUuid referencing
HostEO(uuid)) exists before issuing DROP or ADD, wrapping the conditional DDL in
a stored procedure or dynamic SQL so repeated runs skip non-existent drops and
avoid duplicate adds.
🧹 Nitpick comments (1)
conf/db/upgrade/V5.5.0__schema.sql (1)

499-507: 移除无用的诊断查询。

此 SELECT 语句仅输出约束信息,未用于任何条件判断或校验逻辑。应当删除此调试代码,或将其转换为存储过程中的实际验证逻辑。

♻️ 建议的修改
-SELECT
-    CONSTRAINT_NAME,
-    TABLE_NAME,
-    COLUMN_NAME,
-    REFERENCED_TABLE_NAME
-FROM information_schema.KEY_COLUMN_USAGE
-WHERE TABLE_SCHEMA = 'zstack'
-  AND TABLE_NAME = 'BareMetal2InstanceVO'
-  AND COLUMN_NAME IN ('gatewayUuid', 'lastGatewayUuid');
-
📜 Review details

Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0c4ea54 and d105f17.

⛔ Files ignored due to path filters (5)
  • sdk/src/main/java/SourceClassMap.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/AddBareMetal2DpuChassisAction.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuChassisInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/BareMetal2DpuHostInventory.java is excluded by !sdk/**
  • sdk/src/main/java/org/zstack/sdk/CreateClusterAction.java is excluded by !sdk/**
📒 Files selected for processing (5)
  • compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java
  • conf/db/upgrade/V5.5.0__schema.sql
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
🚧 Files skipped from review as they are similar to previous changes (2)
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/cluster/APICreateClusterMsg.java
🧰 Additional context used
📓 Path-based instructions (3)
**/*.*

⚙️ CodeRabbit configuration file

**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写

Files:

  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
  • compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java
  • conf/db/upgrade/V5.5.0__schema.sql
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: ## 1. API 设计要求

  • API 命名:
    • API 名称必须唯一,不能重复。
    • API 消息类需要继承 APIMessage;其返回类必须继承 APIReplyAPIEvent,并在注释中用 @RestResponse 进行标注。
    • API 消息上必须添加注解 @RestRequest,并满足如下规范:
      • path:
        • 针对资源使用复数形式。
        • 当 path 中引用消息类变量时,使用 {variableName} 格式。
      • HTTP 方法对应:
        • 查询操作 → HttpMethod.GET
        • 更新操作 → HttpMethod.PUT
        • 创建操作 → HttpMethod.POST
        • 删除操作 → HttpMethod.DELETE
    • API 类需要实现 __example__ 方法以便生成 API 文档,并确保生成对应的 Groovy API Template 与 API Markdown 文件。

2. 命名与格式规范

  • 类名:

    • 使用 UpperCamelCase 风格。
    • 特殊情况:
      • VO/AO/EO 类型类除外。
      • 抽象类采用 AbstractBase 前缀/后缀。
      • 异常类应以 Exception 结尾。
      • 测试类需要以 TestCase 结尾。
  • 方法名、参数名、成员变量和局部变量:

    • 使用 lowerCamelCase 风格。
  • 常量命名:

    • 全部大写,使用下划线分隔单词。
    • 要求表达清楚,避免使用含糊或不准确的名称。
  • 包名:

    • 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
  • 命名细节:

    • 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
    • 命名缩写:
      • 不允许使用不必要的缩写,如:AbsSchedulerJobcondiFu 等。应使用完整单词提升可读性。

3. 编写自解释代码

  • 意图表达:

    • 避免使用布尔型参数造成含义不明确。例如:
      • 对于 stopAgent(boolean ignoreError),建议拆分为不同函数(如 stopAgentIgnoreError()),或使用枚举表达操作类型。
    • 命名应尽量用完整的单词组合表达意图,并在名称中体现数据类型或用途(例如在常量与变量名称中,将类型词放在末尾)。
    • 避免使用魔法值(Magic Value):
      • 直接使用未经定义的数值或字符串(如 if (status == 5))应替换为枚举或常量。

      • 示例:

      • // 错误示例:魔法值

      • if (user.getStatus() == 5) { ... }

      • // 正确示例:常量或枚举

      • public static final int STATUS_ACTIVE = 5;

      • if (user.getStatus() == STATUS_ACTIVE) { ... }

      • // 或使用枚举

      • enum UserStatus { ACTIVE, INACTIVE }

  • 注释:

    • 代码应尽量做到自解释,对少于两行的说明可以直接写在代码中。
    • 对于较长的注释,需要仔细校对并随代码更新,确保内容正确。
    • 接口方法不应有多余的修饰符(例如 public),且必须配有有效的 Javadoc 注释。

4. 流程控制和结构优化

  • if...else 的使用:

    • 应尽量减少 if...else 结构的使用,建议:
      • 限制嵌套层级最多为两层,且内层不应再出现 else 分支。
      • 尽早返回(Early Return),将条件判断中的处理逻辑提前结束或抽成独立方法。
      • 使用 Java Stream 或 Lambda 表达式代替冗长的循环与条件判断。
  • 条件判断:

    • if 条件表达不宜过长或过于复杂,必要时可以将条件抽成 boolean 变量描述。
  • 代码块长度:
    ...

Files:

  • compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java
**/*.sql

⚙️ CodeRabbit configuration file

**/*.sql: - Review the SQL code, make sure has no errors and confirm that:

  • Upgrading scene has been carefully handled
  • Do not use DEFAULT 0000-00-00 00:00:00 , use DEFAULT CURRENT_TIMESTAMP instead
  • When NOT NULL exists, must use stored procedure or other functions to process historical data, this is very very important
  • 数据库记录中,如果字符串长度不可控,不要用 vchar,用 text 类型

Files:

  • conf/db/upgrade/V5.5.0__schema.sql
🧠 Learnings (13)
📓 Common learnings
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。
📚 Learning: 2025-09-01T08:16:10.006Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2541
File: testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy:30889-30893
Timestamp: 2025-09-01T08:16:10.006Z
Learning: ApiHelper.groovy in testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy is auto-generated and should not be manually modified or receive code change suggestions.

Applied to files:

  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
📚 Learning: 2025-10-20T11:27:25.928Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2763
File: sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java:31-31
Timestamp: 2025-10-20T11:27:25.928Z
Learning: UpdateHostKernelInterface API (`sdk/src/main/java/org/zstack/sdk/UpdateHostKernelInterfaceAction.java`) 在 PR #2763 时尚未被实际使用,因此对其参数约束的变更(如 name 字段从必需改为可选)不会造成破坏性影响。

Applied to files:

  • compute/src/main/java/org/zstack/compute/host/HostManagerImpl.java
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: ZStack 数据库升级脚本 V4.10.16__schema.sql 中的 UPGRADE_VM_METADATA_TABLES_DIRECT 存储过程使用直接 RENAME TABLE 操作,不具备幂等性。需要通过 information_schema 检查表和约束的存在性来确保脚本可以安全重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T04:10:21.683Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 0
File: :0-0
Timestamp: 2025-08-03T04:10:21.683Z
Learning: 在 ZStack 数据库升级脚本中,直接使用 RENAME TABLE 不能保证幂等性。应该通过 information_schema.tables 检查表的存在性,只在源表存在且目标表不存在时才执行重命名操作,以确保升级脚本可以安全地重复执行。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-03T03:42:34.349Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2293
File: conf/db/upgrade/V4.10.16__schema.sql:69-82
Timestamp: 2025-08-03T03:42:34.349Z
Learning: 在 ZStack 项目中进行数据库 DDL 升级时,由于 MySQL/MariaDB 中的 RENAME TABLE、ALTER TABLE 等 DDL 语句会隐式 COMMIT,因此应使用临时表 + 数据复制的方式来确保升级可逆,而不是依赖事务的 ROLLBACK 机制。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-09-05T10:14:54.816Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2566
File: conf/db/upgrade/V5.4.0__schema.sql:33-34
Timestamp: 2025-09-05T10:14:54.816Z
Learning: 在ZStack的HostNetworkInterfaceVO表中,pciDeviceAddress字段出现结尾换行符(\n)的脏数据仅在嵌套环境中出现,删除这些记录是安全的,不会产生影响。这种情况通常发生在主机重新连接时。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-08T01:53:48.300Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2395
File: conf/db/upgrade/V5.3.46__schema.sql:10-11
Timestamp: 2025-08-08T01:53:48.300Z
Learning: 在 ZStack 项目中,所有的 UUID 都是 32 字符长度且不包含连字符('-'),这与标准的 36 字符 UUID 格式(包含连字符)不同。因此在数据库脚本中使用 VARCHAR(32) 或 CHAR(32) 来存储 UUID 是正确的。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-10T13:42:01.027Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2410
File: compute/src/main/java/org/zstack/compute/vm/VmInstanceHelper.java:334-356
Timestamp: 2025-08-10T13:42:01.027Z
Learning: 在 ZStack 的 `VmInstanceHelper.validateVmNicParams` 方法中,当 vmNicParams 非空但 l3NetworkUuids 为空时的报错文案 "l3NetworkUuids and vmNicInventories mustn't both be empty or both be set" 需要保持不变,以维持与现有 i18n 的一致性,即使文案中提到的是 vmNicInventories 而非 vmNicParams。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-13T02:35:57.073Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/header/H3cSdnSubnetIpRangeRefVO.java:16-18
Timestamp: 2025-08-13T02:35:57.073Z
Learning: 在ZStack的H3cSdnSubnetIpRangeRefVO实体中,不需要为(sdnControllerUuid, ipRangeUuid)添加数据库层面的联合唯一约束,这是一个明确的设计决定。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-25T03:52:37.301Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2504
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:775-819
Timestamp: 2025-08-25T03:52:37.301Z
Learning: 在ZStack项目的VolumeSnapshotTreeBase类中,当通过dbf.findByUuid()方法获取VolumeVO对象时,需要进行null检查,因为该方法可能在找不到对应记录时返回null,直接使用可能导致NullPointerException。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-08-22T06:31:57.406Z
Learnt from: ZStack-Robot
Repo: MatheMatrix/zstack PR: 2489
File: storage/src/main/java/org/zstack/storage/snapshot/VolumeSnapshotTreeBase.java:179-179
Timestamp: 2025-08-22T06:31:57.406Z
Learning: 在ZStack项目的VolumeSnapshotAO类中,团队决定不为treeUuid字段添加Index注解,即使这可能会影响查询性能。团队优先考虑代码稳定性而非性能优化。

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
📚 Learning: 2025-07-22T02:30:46.123Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2311
File: plugin/sdnController/src/main/java/org/zstack/sdnController/hardwareVxlan/KVMRealizeHardwareVxlanNetworkBackend.java:52-53
Timestamp: 2025-07-22T02:30:46.123Z
Learning: In ZStack, backend realization code (such as KVMRealizeHardwareVxlanNetworkBackend) can safely assume the existence of the VO for the resource being operated on (e.g., HardwareL2VxlanNetworkVO for a given L2NetworkInventory), due to system lifecycle management and strong foreign key constraints in the database schema. Explicit null checks after findByUuid are not required in these contexts.

Applied to files:

  • conf/db/upgrade/V5.5.0__schema.sql
🔍 Remote MCP AtlassianMCP

Relevant context found for PR #3197

  • Jira ZSTAC-12345 details: summary "[license功能强化]社区版license,添加企业管理的子license后,进入企业管理,创建用户,提醒“The license is not permitted for the operation”"; status Open; reporter chunli.wang; created 2018-05-24. Multiple comments indicate the issue reference in this PR is mistaken (e.g., "开发引用bug,贴错了。"). This means ZSTAC-12345 is not relevant background for the DPU/baremetal2 feature in this PR.

  • Confluence search for "dpu" / "baremetal2Dpu" returned no results. No Confluence pages found matching those terms.

Sources used: AtlassianMCP.jira_get_issue, AtlassianMCP.confluence_search.

🔇 Additional comments (2)
testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy (1)

965-989: 自动生成的代码,符合既有模式。

根据已有的学习记录,此文件是自动生成的,不应手动修改。新增的 addBareMetal2DpuChassis 函数遵循了文件中其他 API helper 函数的标准模式(实例化 action、设置 sessionId、处理 closure 委托、API 路径追踪等),与 PR 中支持 DPU baremetal2 实例的目标一致。

conf/db/upgrade/V5.5.0__schema.sql (1)

480-497: LGTM! 新表定义正确。

BareMetal2DpuChassisVOBareMetal2DpuHostVO 表使用 IF NOT EXISTS 确保幂等性,外键引用和删除行为(CASCADE/SET NULL)设计合理,config 字段使用 TEXT 类型也符合规范。

Comment on lines +509 to +521
ALTER TABLE `zstack`.`BareMetal2InstanceVO`
DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO`,
DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO1`;

ALTER TABLE `zstack`.`BareMetal2InstanceVO`
ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO`
FOREIGN KEY (`gatewayUuid`)
REFERENCES `HostEO` (`uuid`)
ON DELETE SET NULL,
ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO1`
FOREIGN KEY (`lastGatewayUuid`)
REFERENCES `HostEO` (`uuid`)
ON DELETE SET NULL;
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

外键操作缺乏幂等性保护,升级脚本重复执行将失败。

直接执行 DROP FOREIGN KEY 而不检查约束是否存在,如果升级脚本重复执行,将因外键已被删除而报错。根据项目经验,应通过 information_schema 检查约束存在性后再执行 DDL 操作。

🔧 建议使用存储过程确保幂等性
-ALTER TABLE `zstack`.`BareMetal2InstanceVO`
-DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO`,
-DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO1`;
-
-ALTER TABLE `zstack`.`BareMetal2InstanceVO`
-    ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO`
-        FOREIGN KEY (`gatewayUuid`)
-            REFERENCES `HostEO` (`uuid`)
-            ON DELETE SET NULL,
-ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO1`
-    FOREIGN KEY (`lastGatewayUuid`)
-    REFERENCES `HostEO` (`uuid`)
-    ON DELETE SET NULL;
+DELIMITER $$
+DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceVOForeignKeys$$
+CREATE PROCEDURE UpdateBareMetal2InstanceVOForeignKeys()
+BEGIN
+    -- Drop old FK if exists
+    IF EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO` DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO`;
+    END IF;
+
+    IF EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO1'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO` DROP FOREIGN KEY `fkBareMetal2InstanceVOGatewayVO1`;
+    END IF;
+
+    -- Add new FK if not exists
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO`
+            ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO`
+            FOREIGN KEY (`gatewayUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE SET NULL;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
+        WHERE TABLE_SCHEMA = 'zstack'
+          AND TABLE_NAME = 'BareMetal2InstanceVO'
+          AND CONSTRAINT_NAME = 'fkBareMetal2InstanceVOGatewayVO1'
+    ) THEN
+        ALTER TABLE `zstack`.`BareMetal2InstanceVO`
+            ADD CONSTRAINT `fkBareMetal2InstanceVOGatewayVO1`
+            FOREIGN KEY (`lastGatewayUuid`) REFERENCES `HostEO` (`uuid`) ON DELETE SET NULL;
+    END IF;
+END$$
+DELIMITER ;
+
+CALL UpdateBareMetal2InstanceVOForeignKeys();
+DROP PROCEDURE IF EXISTS UpdateBareMetal2InstanceVOForeignKeys;

Based on learnings,ZStack 升级脚本需要通过 information_schema 检查约束的存在性来确保脚本可以安全重复执行。

🤖 Prompt for AI Agents
In @conf/db/upgrade/V5.5.0__schema.sql around lines 509 - 521, The ALTER TABLE
statements on BareMetal2InstanceVO unconditionally drop and re-add foreign keys
fkBareMetal2InstanceVOGatewayVO and fkBareMetal2InstanceVOGatewayVO1 which
breaks idempotency; modify the script to query
information_schema.key_column_usage / information_schema.table_constraints to
check whether each constraint (fkBareMetal2InstanceVOGatewayVO on gatewayUuid
and fkBareMetal2InstanceVOGatewayVO1 on lastGatewayUuid referencing
HostEO(uuid)) exists before issuing DROP or ADD, wrapping the conditional DDL in
a stored procedure or dynamic SQL so repeated runs skip non-existent drops and
avoid duplicate adds.

Sign up for free to 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