Skip to content

Draft: <feature>[core]: Add external service configuration APIs#4186

Closed
MatheMatrix wants to merge 1 commit into
zsv_5.1.0from
sync/zstackio/ZSV-12395
Closed

Draft: <feature>[core]: Add external service configuration APIs#4186
MatheMatrix wants to merge 1 commit into
zsv_5.1.0from
sync/zstackio/ZSV-12395

Conversation

@MatheMatrix

Copy link
Copy Markdown
Owner
  • Add ExternalServiceConfigurationVO schema, inventory, query API, and add/update/delete APIs
  • Apply configuration changes to matching external services across management nodes
  • Expose serviceType in external service inventory for configuration routing
  • Generate SDK actions/results and testlib helpers for external service configuration operations
  • Register persistence and external service API metadata

DBImpact
APIImpact

Resolves: ZSV-12395

Change-Id: I6a6b76626770736871716563676b6a7a74736966

sync from gitlab !10144

@coderabbitai

coderabbitai Bot commented Jun 8, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 0478f159-5a8e-4246-8933-1536f5fc98b1

📥 Commits

Reviewing files that changed from the base of the PR and between 5996dbf and 37655fe.

⛔ Files ignored due to path filters (2)
  • conf/persistence.xml is excluded by !**/*.xml
  • conf/serviceConfig/externalService.xml is excluded by !**/*.xml
📒 Files selected for processing (47)
  • conf/db/zsv/V5.1.0__schema.sql
  • core/src/main/java/org/zstack/core/externalservice/ExternalService.java
  • core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReplyDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventoryDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO_.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/PackageInfo.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceCapabilitiesBuilder.java
  • sdk/src/main/java/org/zstack/sdk/SourceClassMap.java
  • sdk/src/main/java/org/zstack/sdk/external/service/AddExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/AddExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ApplyExternalConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/DeleteExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/DeleteExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceCapabilities.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceConfigurationInventory.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceInventory.java
  • sdk/src/main/java/org/zstack/sdk/external/service/GetExternalServicesAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/GetExternalServicesResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/QueryExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/QueryExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ReloadExternalServiceAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/ReloadExternalServiceResult.java
  • sdk/src/main/java/org/zstack/sdk/external/service/UpdateExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/external/service/UpdateExternalServiceConfigurationResult.java
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy

Walkthrough

本PR新增外部服务配置功能的完整实现链路,包括数据库表定义、API契约、管理器CRUD与全节点编排、SDK生成对象与测试框架支持,使系统能够对外部监控等服务进行配置的增删改查与集群范围内的配置下发。

Changes

外部服务配置管理功能

Layer / File(s) Summary
数据库模型与领域对象
conf/db/zsv/V5.1.0__schema.sql, header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java, header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO_.java, header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventory.java, header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventoryDoc_zh_cn.groovy, core/src/main/java/org/zstack/core/externalservice/ExternalService.java, header/src/main/java/org/zstack/header/core/external/service/ExternalServiceInventory.java
新增ExternalServiceConfigurationVO表与对应JPA实体、元模型类、Inventory库存对象,定义uuid/serviceType/configuration/description等字段与唯一性约束;ExternalService接口补充getServiceType()与externalConfig(serviceType)默认方法;ExternalServiceInventory新增serviceType字段支持。
API契约与REST入口
header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsg.java, header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEvent.java, header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEventDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsgDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsg.java, header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEvent.java, header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEventDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsg.java, header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEvent.java, header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEventDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsgDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsg.java, header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReply.java, header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsgDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReplyDoc_zh_cn.groovy, header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationMsg.java, header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationReply.java, header/src/main/java/org/zstack/header/core/external/service/ApplyExternalConfigurationResult.java
新增POST/PUT/DELETE/GET四个API消息与对应事件/回复,通过@RestRequest定义REST路由(POST/PUT/DELETE /external/service/configuration/{uuid}、GET /external/service/configuration),实现APIAuditor审计接口;新增Apply内部消息与ApplyExternalConfigurationResult结果对象用于全节点配置下发;补充中英文API文档DSL配置。
管理器CRUD与全节点编排
core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java
ExternalServiceManagerImpl新增handleLocalMessage路由与四个API消息处理器:Add校验serviceType注册与唯一性、持久化VO后全节点下发、汇总结果;Update按uuid查询并更新description后刷新数据库;Delete删除记录并下发全节点应用;Get返回services列表时补充serviceType字段。核心全节点编排在applyExternalServiceConfigurationToAllNodes中逐节点投递ApplyMsg、累积结果;失败时通过复制VO回滚并再次应用。本地节点处理ApplyMsg时遍历ExternalService按serviceType匹配调用externalConfig()再生配置。
SDK生成对象与类型映射
sdk/src/main/java/org/zstack/sdk/external/service/AddExternalServiceConfigurationAction.java, sdk/src/main/java/org/zstack/sdk/external/service/AddExternalServiceConfigurationResult.java, sdk/src/main/java/org/zstack/sdk/external/service/DeleteExternalServiceConfigurationAction.java, sdk/src/main/java/org/zstack/sdk/external/service/DeleteExternalServiceConfigurationResult.java, sdk/src/main/java/org/zstack/sdk/external/service/QueryExternalServiceConfigurationAction.java, sdk/src/main/java/org/zstack/sdk/external/service/QueryExternalServiceConfigurationResult.java, sdk/src/main/java/org/zstack/sdk/external/service/UpdateExternalServiceConfigurationAction.java, sdk/src/main/java/org/zstack/sdk/external/service/UpdateExternalServiceConfigurationResult.java, sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceConfigurationInventory.java, sdk/src/main/java/org/zstack/sdk/SourceClassMap.java, sdk/src/main/java/org/zstack/sdk/ExternalServiceCapabilitiesBuilder.java, sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceCapabilities.java, sdk/src/main/java/org/zstack/sdk/external/service/ExternalServiceInventory.java, sdk/src/main/java/org/zstack/sdk/external/service/GetExternalServicesAction.java, sdk/src/main/java/org/zstack/sdk/external/service/GetExternalServicesResult.java, sdk/src/main/java/org/zstack/sdk/external/service/ReloadExternalServiceAction.java, sdk/src/main/java/org/zstack/sdk/external/service/ReloadExternalServiceResult.java, header/src/main/java/org/zstack/header/core/external/service/PackageInfo.java
为四个API操作生成Add/Delete/Query/Update Action类,包含参数声明、同步/异步call()重载、RestInfo配置(HTTP方法、路由、会话与轮询设置);新增Result对象承载响应数据;新增SDK Inventory与DTO;补充SourceClassMap中org.zstack.sdk.external.service.*的双向类型映射;将ExternalServiceCapabilities等类型迁移到external.service包;新增PackageInfo标注SDK包名。
测试框架助手方法
testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
ApiHelper新增四个方法:addExternalServiceConfiguration、queryExternalServiceConfiguration、updateExternalServiceConfiguration、deleteExternalServiceConfiguration,分别封装对应SDK Action的创建、sessionId设置、闭包委托执行与API路径追踪(当启用apipath时)。

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 外部配置好,集群来广播,
每个节点都收到,服务配置不落下,
如若出错须回滚,全心全力做重做!

🚥 Pre-merge checks | ✅ 4 | ❌ 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 (4 passed)
Check name Status Explanation
Title check ✅ Passed PR标题明确指出添加外部服务配置APIs的功能,与changeset中新增的ExternalServiceConfigurationVO、CRUD APIs等内容完全相关,准确反映了主要变更。
Description check ✅ Passed PR描述详细列出了新增的功能点,包括schema、inventory、查询/增删改API、跨节点配置分发、SDK生成及testlib辅助等,与changeset内容高度相关且信息充分。
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/zstackio/ZSV-12395

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

@ZStack-Robot

Copy link
Copy Markdown
Collaborator

Comment from yaohua.wu:

Review: MR !10144 — ZSV-12395

Background

  • Jira: ZSV-12395 — Zcf需要ZSV提供API配置Prometheus remote-write (Improvement, P2)
  • 需求: 为 ZCF 提供 API 配置 ZSV 的外部服务(首期 Prometheus remote-write)。本 MR 在 zstack core/header 引入通用「外部服务配置」框架:新增 ExternalServiceConfigurationVO + 增删改查 API + 跨管理节点下发(ApplyExternalServiceConfigurationMsg),并在 ExternalService 接口新增 getServiceType() / externalConfig() 扩展点。Prometheus 具体实现见 premium !14266。
  • Scope: 41 文件,其中绝大多数为 SDK Action/Result、*Doc_zh_cn.groovyVO_、testlib 等机械生成代码;核心逻辑集中在 ExternalServiceManagerImpl.javaExternalServiceConfigurationVO.java
  • 整体评价: 框架抽象合理,扩展点(serviceType / externalConfig)与 premium 解耦干净,evt.setError+bus.publishchainSubmit 串行化等均符合 ZStack 约定。主要问题集中在「持久化与下发的事务一致性」和「VO createDate 约定」。

关联 MR

  • premium !14266<fix>[externalservice]: Support Prometheus remote write external configuration。实现 PrometheusImpl2.getServiceType()="Prometheus2"externalConfig()、remote_write JSON 解析(basic_auth / write_relabel_configs)。
  • 跨仓依赖(硬依赖): premium 侧 import org.zstack.header.core.external.service.ExternalServiceConfigurationVO / VO_ / Inventory,这些类在本 MR定义。本 MR 不先合并,premium 无法编译。两者须同时合并到 zsv_5.1.0
  • 接口一致性: 本 MR 的 ExternalService.externalConfig(String serviceType) / getServiceType() 默认方法签名与 premium 的 override 完全匹配;ApplyExternalServiceConfigurationMsg.serviceType 与 premium externalConfigserviceType != getServiceType() 的判断一致。✅

🟡 Warning

# File / Method Issue Fix
1 ExternalServiceManagerImpl.java · createExternalServiceConfiguration / updateExternalServiceConfiguration 写库先于下发,下发失败不回滚 + 未校验 serviceTypedbf.persistAndRefresh(vo)(或 update)后才 applyExternalServiceConfigurationToAllNodes;若下发 fail,DB 记录已落库却返回错误,产生「API 报错但状态已变更」的孤儿记录。叠加 未校验 externalServiceType 是否对应已注册服务:传入未知类型时,regenerateExternalServiceConfigurationfail("unable to find external service type"),但 VO 已落库 → 永久孤儿记录。 创建前先校验 serviceType 在已注册服务集合内;或将 persist+apply 包进 SimpleFlowChain,persist 流的 rollback 删除该 VO(update 同理回滚旧值)。
2 ExternalServiceConfigurationVO.java · 字段 createDate/lastOpDate 缺少 @PrePersist。基类 ResourceVO.prePersist() 只设置 resourceType/resourceName,不处理 createDate;本 VO 仅有 @PreUpdate { lastOpDate = null; }。createDate 列为 NOT NULL DEFAULT '1999-12-31 23:59:59',insert 时字段为 null,能否落对值完全依赖 MySQL 旧行为(explicit_defaults_for_timestamp=OFF 时 NULL→CURRENT_TIMESTAMP);在严格模式 / MySQL8 默认下,向 NOT NULL 列插 NULL 会报错或落成 0 值。兄弟 VO 普遍声明 @PrePersist { createDate = lastOpDate = null; } @PrePersist 重置 createDate/lastOpDate,与现有 VO 约定对齐;并实测创建后 createDate 非 1999/0 值(该字段会经 Inventory 返回给 ZCF)。
3 ExternalServiceManagerImpl.java · applyExternalServiceConfigurationToAllNodes 跨节点部分下发 + 结果被丢弃While 遍历各 MN,首个节点失败即 allDone() 并整体 fail,但先成功的节点已写入新配置 → 集群短时不一致(直到下次重启从 DB 重新生成)。同时每节点计算的 ApplyExternalConfigurationResult 列表在 success() 中被忽略(returnValue 未透出),调用方拿不到逐节点状态。 至少把逐节点结果透出到 event;评估失败时是否需要对已成功节点做补偿/标注。

🟢 Suggestion

# File / Method Issue
4 ExternalServiceManagerImpl.java · regenerateExternalServiceConfiguration 末尾 if (CoreGlobalProperty.UNIT_TEST_ON) completion.success() 会在测试中掩盖「serviceType 无匹配服务」的失败分支,使 Warning #1 的孤儿场景无法被测试覆盖。若加了 serviceType 校验,此 mask 可去掉。
5 APIAdd/UpdateExternalServiceConfigurationMsg.java @APIParam(maxLength=65535)字符数,而 DB configuration 列为 text(65535 字节)。多字节 UTF-8 JSON 可能超列长导致截断/报错。建议改列为 mediumtext 或收紧字符上限。
6 ExternalServiceManagerImpl.handleMessage / ApplyExternalConfigurationResult.setErrorCode 轻微:} else { 多一个空格;setErrorCode 内隐式 success=false 副作用,建议显式设置以免误用。

Coverage

  • 深读逻辑文件:ExternalServiceManagerImpl.javaExternalServiceConfigurationVO.javaExternalService.javaexternalService.xmlV5.1.0__schema.sqlExternalServiceInventory.java
  • 越界核查:拉取 ResourceVO.java@Head 确认基类不处理 createDate(支撑 Warning tao.yang/zstack-ZSV-3564@@2 #2)。
  • 跳过:SDK *Action/*Result*Doc_zh_cn.groovyVO_SourceClassMapApiHelper.groovy 等生成/样板代码(已抽样确认与 API 定义一致)。
  • 框架兜底已确认:evt.setError+bus.publish 双层异常兜底、chain 串行化均正确,未发现框架已兜底的伪缺陷。
  • Upstream freshness:merge_status=can_be_merged,无冲突;目标分支 zsv_5.1.0

Verdict: REVISION_REQUIRED

无 🔴 Critical。建议在去 Draft 前优先处理 Warning #1(写库/下发事务一致性 + serviceType 校验)#2(createDate @PrePersist#3 视产品语义决定。


🤖 Robot Reviewer

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy`:
- Around line 33-41: The documentation incorrectly exposes the "configuration"
field as an updatable parameter in
APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy; according to
ExternalServiceManagerImpl.updateExternalServiceConfiguration() the API only
updates "description" and does not apply configuration changes or call
applyExternalServiceConfigurationToAllNodes(), so remove the "configuration"
column entry (or update its desc to state it is ignored/unmodifiable and that
configuration changes require delete+create and will change the UUID), leaving
only "description" as the modifiable field.

In
`@sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationResult.java`:
- Around line 6-12: The field inventories and its accessor methods in
QueryExternalServiceConfigurationResult use a raw java.util.List; change them to
a parameterized list to restore type safety by declaring the field as
java.util.List<ExternalServiceConfigurationInventory> (or the correct inventory
type used in the SDK), update the signatures of
setInventories(java.util.List<ExternalServiceConfigurationInventory>
inventories) and getInventories() to return
java.util.List<ExternalServiceConfigurationInventory>, and add the matching
import if needed so callers get compile-time checks and proper IDE completion.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: ef85bf51-81e2-42f6-afae-a79c0c67a367

📥 Commits

Reviewing files that changed from the base of the PR and between d02b56c and 877db8d.

⛔ Files ignored due to path filters (2)
  • conf/persistence.xml is excluded by !**/*.xml
  • conf/serviceConfig/externalService.xml is excluded by !**/*.xml
📒 Files selected for processing (39)
  • conf/db/zsv/V5.1.0__schema.sql
  • core/src/main/java/org/zstack/core/externalservice/ExternalService.java
  • core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReplyDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventoryDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO_.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceInventory.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceConfigurationInventory.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceInventory.java
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/SourceClassMap.java
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationResult.java
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy

Comment on lines +6 to +12
public java.util.List inventories;
public void setInventories(java.util.List inventories) {
this.inventories = inventories;
}
public java.util.List getInventories() {
return this.inventories;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

使用原始类型导致类型安全缺失

inventories 字段声明为原始类型 java.util.List,未指定泛型参数。这会导致:

  1. 调用方无法在编译期获得类型检查,可能引发 ClassCastException
  2. IDE 无法提供准确的代码补全与类型推断
  3. 不符合 Java 泛型最佳实践
🔧 修复建议
-    public java.util.List inventories;
-    public void setInventories(java.util.List inventories) {
+    public java.util.List<ExternalServiceConfigurationInventory> inventories;
+    public void setInventories(java.util.List<ExternalServiceConfigurationInventory> inventories) {
         this.inventories = inventories;
     }
-    public java.util.List getInventories() {
+    public java.util.List<ExternalServiceConfigurationInventory> getInventories() {
         return this.inventories;
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationResult.java`
around lines 6 - 12, The field inventories and its accessor methods in
QueryExternalServiceConfigurationResult use a raw java.util.List; change them to
a parameterized list to restore type safety by declaring the field as
java.util.List<ExternalServiceConfigurationInventory> (or the correct inventory
type used in the SDK), update the signatures of
setInventories(java.util.List<ExternalServiceConfigurationInventory>
inventories) and getInventories() to return
java.util.List<ExternalServiceConfigurationInventory>, and add the matching
import if needed so callers get compile-time checks and proper IDE completion.

@MatheMatrix MatheMatrix force-pushed the sync/zstackio/ZSV-12395 branch 2 times, most recently from 898f83e to 5996dbf Compare June 9, 2026 02:54

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy (1)

33-41: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

修正文档:configuration 字段不应作为可更新参数。

APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovyconfiguration 字段(optional: true)暴露为更新入参;但根据 ExternalServiceManagerImpl.updateExternalServiceConfiguration() 的实现,Update API 仅支持更新 descriptionconfiguration 变更不被处理且不会触发 applyExternalServiceConfigurationToAllNodes()。修改配置需要删除后重新创建(UUID 会变化)。

建议移除该文档字段定义,或在字段 desc 中明确标注:configuration 当前不生效,仅可更新 description,修改配置请走"删除+新增"流程。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy`
around lines 33 - 41, The doc wrongly exposes the "configuration" field as
updatable in APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy while
ExternalServiceManagerImpl.updateExternalServiceConfiguration() only processes
"description" and does not call applyExternalServiceConfigurationToAllNodes();
remove the "configuration" column block from the update API doc or alternatively
update its desc to state that configuration changes are not applied and that
configuration must be changed by deleting and recreating the external service
(UUID will change), ensuring references to
APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy,
ExternalServiceManagerImpl.updateExternalServiceConfiguration(), and
applyExternalServiceConfigurationToAllNodes() are used to locate the logic and
confirm correctness.
🧹 Nitpick comments (1)
header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java (1)

23-24: ⚡ Quick win

建议为 serviceType 字段添加显式长度约束。

数据库 schema 中 serviceType 定义为 varchar(32)(Line 140 in V5.1.0__schema.sql),但 Java 字段仅使用 @Column 注解未声明 length 属性。建议添加 @Column(length = 32) 以确保 JPA 层与数据库定义一致,避免运行时因超长值触发截断错误。

🔧 建议的修复
-    `@Column`
+    `@Column`(length = 32)
     private String serviceType;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java`
around lines 23 - 24, The serviceType field in ExternalServiceConfigurationVO
lacks an explicit length constraint causing a mismatch with the DB schema;
update the field's annotation by adding a length attribute (i.e., change the
`@Column` on the serviceType field in class ExternalServiceConfigurationVO to
include length = 32) so JPA will enforce varchar(32) consistent with the
database.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In
`@header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy`:
- Around line 33-41: The doc wrongly exposes the "configuration" field as
updatable in APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy while
ExternalServiceManagerImpl.updateExternalServiceConfiguration() only processes
"description" and does not call applyExternalServiceConfigurationToAllNodes();
remove the "configuration" column block from the update API doc or alternatively
update its desc to state that configuration changes are not applied and that
configuration must be changed by deleting and recreating the external service
(UUID will change), ensuring references to
APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy,
ExternalServiceManagerImpl.updateExternalServiceConfiguration(), and
applyExternalServiceConfigurationToAllNodes() are used to locate the logic and
confirm correctness.

---

Nitpick comments:
In
`@header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java`:
- Around line 23-24: The serviceType field in ExternalServiceConfigurationVO
lacks an explicit length constraint causing a mismatch with the DB schema;
update the field's annotation by adding a length attribute (i.e., change the
`@Column` on the serviceType field in class ExternalServiceConfigurationVO to
include length = 32) so JPA will enforce varchar(32) consistent with the
database.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: aab5ee25-5dc0-4867-87f5-0b0a0d983efe

📥 Commits

Reviewing files that changed from the base of the PR and between 898f83e and 5996dbf.

⛔ Files ignored due to path filters (2)
  • conf/persistence.xml is excluded by !**/*.xml
  • conf/serviceConfig/externalService.xml is excluded by !**/*.xml
📒 Files selected for processing (40)
  • conf/db/zsv/V5.1.0__schema.sql
  • core/src/main/java/org/zstack/core/externalservice/ExternalService.java
  • core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReplyDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventoryDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO_.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceInventory.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/ApplyExternalConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceConfigurationInventory.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceInventory.java
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/SourceClassMap.java
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationAction.java
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationResult.java
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
✅ Files skipped from review due to trivial changes (5)
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventoryDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationVO_.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReplyDoc_zh_cn.groovy
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationResult.java
🚧 Files skipped from review as they are similar to previous changes (31)
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationReply.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalServiceConfigurationMsg.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationResult.java
  • sdk/src/main/java/org/zstack/sdk/ExternalServiceConfigurationInventory.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationEventDoc_zh_cn.groovy
  • sdk/src/main/java/org/zstack/sdk/ApplyExternalConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/ApplyExternalConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/APIDeleteExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationEvent.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceInventory.java
  • core/src/main/java/org/zstack/core/externalservice/ExternalService.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEventDoc_zh_cn.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationMsgDoc_zh_cn.groovy
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationResult.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationEvent.java
  • sdk/src/main/java/org/zstack/sdk/SourceClassMap.java
  • header/src/main/java/org/zstack/header/core/external/service/APIQueryExternalServiceConfigurationReply.java
  • sdk/src/main/java/org/zstack/sdk/UpdateExternalServiceConfigurationAction.java
  • header/src/main/java/org/zstack/header/core/external/service/APIAddExternalServiceConfigurationMsg.java
  • sdk/src/main/java/org/zstack/sdk/DeleteExternalServiceConfigurationAction.java
  • testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy
  • header/src/main/java/org/zstack/header/core/external/service/APIUpdateExternalServiceConfigurationMsg.java
  • header/src/main/java/org/zstack/header/core/external/service/ExternalServiceConfigurationInventory.java
  • sdk/src/main/java/org/zstack/sdk/QueryExternalServiceConfigurationAction.java
  • core/src/main/java/org/zstack/core/externalservice/ExternalServiceManagerImpl.java
  • sdk/src/main/java/org/zstack/sdk/AddExternalServiceConfigurationAction.java

@MatheMatrix MatheMatrix force-pushed the sync/zstackio/ZSV-12395 branch from 5996dbf to 750153d Compare June 9, 2026 04:02
- Add ExternalServiceConfigurationVO schema, inventory, query API, and add/update/delete APIs
- Apply configuration changes to matching external services across management nodes
- Expose serviceType in external service inventory for configuration routing
- Generate SDK actions/results and testlib helpers for external service configuration operations
- Register persistence and external service API metadata

DBImpact
APIImpact

Resolves: ZSV-12395

Change-Id: I6a6b76626770736871716563676b6a7a74736966
@MatheMatrix MatheMatrix force-pushed the sync/zstackio/ZSV-12395 branch from 750153d to 37655fe Compare June 9, 2026 05:21
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.

3 participants