-
Notifications
You must be signed in to change notification settings - Fork 0
<fix>[sdnController]: add AddSdnControllerMsg #3209
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
<fix>[sdnController]: add AddSdnControllerMsg #3209
Conversation
Walkthrough将新增消息类型 Changes
Sequence Diagram(s)sequenceDiagram
participant API as API 调用方
participant Manager as SdnControllerManagerImpl
participant CloudBus as CloudBus
participant Controller as SdnController 实现
participant DB as 数据库
participant EventBus as API 事件发布
API->>Manager: 传入 APIAddSdnControllerMsg
Manager->>Manager: 构造 AddSdnControllerMsg (基于 VO)
Manager->>CloudBus: send(AddSdnControllerMsg)
CloudBus->>Controller: 投递 AddSdnControllerMsg
Controller->>DB: createSdnControllerDb(...)(持久化 VO)
DB-->>Controller: 返回持久化结果 / VO
Controller->>Controller: initSdnController(...)
Controller-->>CloudBus: reply AddSdnControllerReply (含 inventory)
CloudBus-->>Manager: 回调收到 Reply
Manager->>EventBus: 发布 API 事件并发送 API 回复
EventBus-->>API: API 回复 / 通知
预估代码审查工作量🎯 4 (复杂) | ⏱️ ~45 分钟 庆祝诗
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧹 Recent nitpick comments
📜 Recent review detailsConfiguration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml) Review profile: CHILL Plan: Pro 📒 Files selected for processing (8)
🚧 Files skipped from review as they are similar to previous changes (3)
🧰 Additional context used📓 Path-based instructions (2)**/*.*⚙️ CodeRabbit configuration file
Files:
**/*.java⚙️ CodeRabbit configuration file
Files:
🧠 Learnings (7)📚 Learning: 2025-09-01T06:17:02.288ZApplied to files:
📚 Learning: 2025-07-22T02:30:46.123ZApplied to files:
📚 Learning: 2025-08-13T02:42:07.774ZApplied to files:
📚 Learning: 2025-08-13T02:40:34.873ZApplied to files:
📚 Learning: 2025-08-12T03:30:52.097ZApplied to files:
📚 Learning: 2025-08-13T02:41:52.024ZApplied to files:
📚 Learning: 2025-08-10T13:42:01.027ZApplied to files:
🧬 Code graph analysis (1)plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java (1)
🔍 Remote MCP AtlassianMCPRelevant Jira context (ZSTAC-73622)
🔇 Additional comments (7)
✏️ Tip: You can disable this entire section by setting Comment |
8da800d to
8028031
Compare
There was a problem hiding this 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
`@plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java`:
- Around line 95-109: The reply's inventory is never set in
handle(AddSdnControllerMsg); modify the flow so the created
SdnControllerInventory is passed back from doCreateSdnController and assigned to
the AddSdnControllerReply before replying. Specifically, change
doCreateSdnController (or add an overloaded variant/callback) to provide the
created SdnControllerInventory to the Completion, and in the anonymous
Completion implementation inside handle(AddSdnControllerMsg) call
reply.setInventory(createdInventory) in success() before bus.reply(msg, reply);
keep fail() behavior unchanged.
🧹 Nitpick comments (4)
plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java (1)
11-13: 字段应声明为private以确保封装性。根据编码规范,成员变量应使用 lowerCamelCase 风格并遵循封装原则。当前字段使用默认(包级)访问修饰符,建议改为
private。♻️ 建议的修改
- SdnControllerVO sdnControllerVO; - List<String> systemTags = new ArrayList<>(); - String accountUuid; + private SdnControllerVO sdnControllerVO; + private List<String> systemTags = new ArrayList<>(); + private String accountUuid;plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java (1)
339-387: 参数msg未被使用。
getH3cParameters(AddSdnControllerMsg msg, ...)方法接收msg参数,但在方法体内从未使用。如果参数是为将来扩展预留的,建议添加注释说明;否则可以考虑移除。plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java (1)
346-386: 代码注释应使用英文。根据编码规范,代码中不应包含中文,包括注释。此文件中存在大量中文注释(如
// 获取 tf 网络信息、// 判断tf网络是否存在、// 移除指定的三层子网等)。建议将这些注释转换为英文。♻️ 建议的修改示例
- // 获取 tf 网络信息 + // Get TF network information VirtualNetwork vn = (VirtualNetwork)client.findById(VirtualNetwork.class, StringDSL.transToTfUuid(l3NetworkVO.getL2NetworkUuid())); if(vn!=null){ - // 判断tf网络是否存在 + // Check if TF network exists if(vn.getNetworkIpam()!=null) { Optional<IpamSubnetType> opCheck = vn.getNetworkIpam().get(0).getAttr().getIpamSubnets().stream() .filter(k->k.getSubnetUuid().equals(StringDSL.transToTfUuid(l3NetworkVO.getUuid()))) .findFirst(); if (opCheck.isPresent()) { - // 移除指定的三层子网 + // Remove the specified L3 subnet vn.getNetworkIpam().get(0).getAttr().getIpamSubnets().remove(opCheck.get());基于编码规范要求。
plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java (1)
11-15: 接口注释应使用英文。根据编码规范,代码中不应包含中文注释。建议将这些注释翻译为英文以保持一致性。
♻️ 建议的修改
void handleMessage(SdnControllerMessage msg); - /* - 有关sdn控制器的前置检查: pre-event - 对sdn控制器的控制: event - 有关sdn控制器的后置处理: post-event - */ + /* + * Pre-checks for SDN controller: pre-event + * Control operations on SDN controller: event + * Post-processing for SDN controller: post-event + */ void preInitSdnController(AddSdnControllerMsg msg, Completion completion);基于编码规范要求。
📜 Review details
Configuration used: Path: http://open.zstack.ai:20001/code-reviews/zstack-cloud.yaml (via .coderabbit.yaml)
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.javaplugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.javaplugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java
🧰 Additional context used
📓 Path-based instructions (2)
**/*.*
⚙️ CodeRabbit configuration file
**/*.*: - 代码里不应当有有中文,包括报错、注释等都应当使用正确的、无拼写错误的英文来写
Files:
plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.javaplugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaheader/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java
**/*.java
⚙️ CodeRabbit configuration file
**/*.java: ## 1. API 设计要求
- API 命名:
- API 名称必须唯一,不能重复。
- API 消息类需要继承
APIMessage;其返回类必须继承APIReply或APIEvent,并在注释中用@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 类型类除外。
- 抽象类采用
Abstract或Base前缀/后缀。- 异常类应以
Exception结尾。- 测试类需要以
Test或Case结尾。方法名、参数名、成员变量和局部变量:
- 使用 lowerCamelCase 风格。
常量命名:
- 全部大写,使用下划线分隔单词。
- 要求表达清楚,避免使用含糊或不准确的名称。
包名:
- 统一使用小写,使用点分隔符,每个部分应是一个具有自然语义的英文单词(参考 Spring 框架的结构)。
命名细节:
- 避免在父子类或同一代码块中出现相同名字的成员或局部变量,防止混淆。
- 命名缩写:
- 不允许使用不必要的缩写,如:
AbsSchedulerJob、condi、Fu等。应使用完整单词提升可读性。
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:
plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.javaplugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaheader/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.javaplugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java
🧠 Learnings (5)
📚 Learning: 2025-08-13T02:42:07.774Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java:556-558
Timestamp: 2025-08-13T02:42:07.774Z
Learning: 在ZStack的H3C SDN控制器实现中,getCreateH3cNetworksCmd()方法需要保持private访问修饰符,因为它是非overwrite方法,改为protected可能导致H3cVcfcSdnController和H3cVcfcV2SdnController之间的意外继承行为。
Applied to files:
plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java
📚 Learning: 2025-08-13T02:40:34.873Z
Learnt from: zstack-robot-1
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java:568-570
Timestamp: 2025-08-13T02:40:34.873Z
Learning: 在ZStack的H3C SDN控制器实现中,getDeleteH3cNetworksCmd()方法需要保持private访问修饰符,因为它是非overwrite方法,改为protected可能导致H3cVcfcSdnController和H3cVcfcV2SdnController之间的意外继承行为。
Applied to files:
plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java
📚 Learning: 2025-08-12T03:30:52.097Z
Learnt from: zstack-robot-2
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java:552-554
Timestamp: 2025-08-12T03:30:52.097Z
Learning: 在ZStack的H3C SDN控制器实现中,getNetworkCmd()方法在H3cVcfcSdnController和H3cVcfcV2SdnController中各自有独立的实现,需要保持private访问修饰符以防止意外的继承/重写行为,不能为了保持一致性而改为protected。
Applied to files:
plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java
📚 Learning: 2025-08-13T02:41:52.024Z
Learnt from: MatheMatrix
Repo: MatheMatrix/zstack PR: 2419
File: plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java:560-562
Timestamp: 2025-08-13T02:41:52.024Z
Learning: 在ZStack的H3C SDN控制器实现中,getCreateH3cNetworksRspClass()方法需要保持private访问修饰符,因为它是非overwrite方法,改为protected可能导致H3cVcfcSdnController和H3cVcfcV2SdnController之间的意外继承行为。
Applied to files:
plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.javaplugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java
📚 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:
header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java
🔍 Remote MCP AtlassianMCP
Relevant Jira context (ZSTAC-73622)
- Issue: ZSTAC-73622 — "【5.5.6必须解】ovn控制器存在空指针异常" (Reopened).
- Root cause (author shixin.ruan): in dual-MN setups APIAddSdnControllerMsg routed to MN1 creates a ping tracker on MN1, while APIRemoveSdnControllerMsg routed to MN2 can delete the SdnControllerVO — ping tracker on MN1 then NPEs.
- Reproduction notes: also observed when adding an OVN controller instance that fails to finish startup before controller add — can lead to the issue. Some manual single- and dual-MN tests did not reproduce consistently.
- Fix described by reporter: assign a UUID to APIAddSdnControllerMsg and route it (like APIRemoveSdnControllerMsg) by SDN controller UUID so messages and ping tracker run on the same MN. This matches the PR introducing AddSdnControllerMsg and routing changes.
🔇 Additional comments (11)
header/src/main/java/org/zstack/header/network/sdncontroller/SdnControllerVO.java (1)
43-45: LGTM! 安全改进:为密码字段添加@NoLogging注解。这是一个良好的安全实践,可以防止敏感的密码信息被记录到日志中。根据编码规范中的合规/隐私风险要求,这是正确的做法。
plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerReply.java (1)
6-16: LGTM!
AddSdnControllerReply类实现简洁,遵循了 ZStack 消息回复的标准模式。字段封装正确,getter/setter 方法实现规范。plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java (2)
262-280: 消息路由修复 - 解决 JIRA ZSTAC-73622 的核心逻辑。使用
bus.makeTargetServiceIdByResourceUuid(amsg, SdnControllerConstant.SERVICE_ID, vo.getUuid())将AddSdnControllerMsg路由到特定的 MN 节点。这确保了消息处理和pingTracker.track()在同一个 MN 上执行,从而避免了双 MN 环境下的 NPE 问题。注意:一旦上面提到的
reply.setInventory()bug 被修复,第 274 行可以优化为使用((AddSdnControllerReply)reply).getInventory()而非重新查询数据库。
123-136: LGTM! 流程重构使用新的消息类型。
doCreateSdnController方法签名已更改为接受AddSdnControllerMsg,流程名称现在使用vo.getName()而非msg.getName()。这些更改与新的消息架构保持一致。plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcV2SdnController.java (1)
143-157: LGTM! 方法签名更新为使用AddSdnControllerMsg。
initSdnController方法签名已正确更新,与接口定义和其他控制器实现保持一致。plugin/sdnController/src/main/java/org/zstack/sdnController/header/AddSdnControllerMsg.java (1)
15-18: 潜在的空指针异常风险。如果
sdnControllerVO为 null,getSdnControllerUuid()方法会抛出 NPE。虽然根据当前使用场景(在SdnControllerManagerImpl中 VO 总是在发送消息前被设置),风险较低,但建议添加防御性检查。🛡️ 建议的防御性修改
`@Override` public String getSdnControllerUuid() { + if (sdnControllerVO == null) { + return null; + } return sdnControllerVO.getUuid(); }⛔ Skipped due to learnings
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。Learnt from: zstack-robot-2 Repo: MatheMatrix/zstack PR: 2360 File: compute/src/main/java/org/zstack/compute/vm/VmNicParamBuilder.java:27-28 Timestamp: 2025-08-04T03:35:51.225Z Learning: 在 VmNicParamBuilder.buildByVmUuid 方法中,上层调用保证传入的 VM UUID 对应的实例一定存在,因此使用 Q.New(VmInstanceVO.class).eq(VmInstanceVO_.uuid, vmInstanceUuid).find() 查询后不需要进行 null 检查。Learnt from: ZStack-Robot Repo: MatheMatrix/zstack PR: 2418 File: compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java:3856-3865 Timestamp: 2025-08-12T05:39:14.846Z Learning: 在 compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java 的 setNoIpAllocationStaticIp 流程中,从数据库加载的 VmNicVO 实例其 getUsedIps() 为空时也不会为 null(返回空集合)。因此无需对 getUsedIps() 再做 Optional/空列表归一化的空指针保护;若找不到对应 NIC,使用 orElse(new VmNicVO()) 的约定允许后续逻辑通过 NPE 暴露问题,与项目既有约定一致。plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/SugonSdnController.java (2)
87-100: 方法签名和 IP 获取方式更改正确。参数类型从
APIAddSdnControllerMsg更改为AddSdnControllerMsg,并且 IP 地址通过msg.getSdnControllerVO().getIp()获取,符合 JIRA 中描述的修复方案——通过为消息分配 UUID 并路由到同一 MN,解决双 MN 场景下的 NPE 问题。
132-145: 方法签名更新正确。
createSdnControllerDb和initSdnController的参数类型更新与接口定义一致,内部逻辑保持不变。plugin/sdnController/src/main/java/org/zstack/sdnController/h3cVcfc/H3cVcfcSdnController.java (2)
237-268: 生命周期方法签名更新正确。
preInitSdnController、createSdnControllerDb和initSdnController的参数类型已正确更新为AddSdnControllerMsg。initSdnController在获取 token 后将msg传递给getH3cParameters,保持了原有的调用链。
165-220: 方法参数类型更新正确,getSystemTags()方法在AddSdnControllerMsg中可用。方法签名从
APIAddSdnControllerMsg更改为AddSdnControllerMsg,该类在第 29-31 行实现了getSystemTags()方法,内部流程逻辑保持不变。plugin/sdnController/src/main/java/org/zstack/sdnController/SdnController.java (1)
16-19: 接口方法签名更新正确。将
preInitSdnController、createSdnControllerDb和initSdnController的参数类型从APIAddSdnControllerMsg更改为AddSdnControllerMsg,这是解决双 MN 场景下 NPE 问题的核心变更。通过使用内部消息类型并分配 UUID 进行路由,确保消息和 ping tracker 在同一 MN 上运行。
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| private void handle(AddSdnControllerMsg msg) { | ||
| AddSdnControllerReply reply = new AddSdnControllerReply(); | ||
| doCreateSdnController(msg, new Completion(msg) { | ||
| @Override | ||
| public void success() { | ||
| bus.reply(msg, reply); | ||
| } | ||
|
|
||
| @Override | ||
| public void fail(ErrorCode errorCode) { | ||
| reply.setError(errorCode); | ||
| bus.reply(msg, reply); | ||
| } | ||
| }); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bug: AddSdnControllerReply 的 inventory 字段未被设置。
在 handle(AddSdnControllerMsg) 方法中,成功回调时只调用了 bus.reply(msg, reply),但 reply.setInventory() 从未被调用。这意味着内部调用者收到的回复中 inventory 始终为 null。
根据 AddSdnControllerReply 的设计,它应该返回创建的 SDN 控制器 inventory 数据。
🐛 建议的修复
private void handle(AddSdnControllerMsg msg) {
AddSdnControllerReply reply = new AddSdnControllerReply();
doCreateSdnController(msg, new Completion(msg) {
`@Override`
public void success() {
+ SdnControllerVO vo = dbf.findByUuid(msg.getSdnControllerUuid(), SdnControllerVO.class);
+ reply.setInventory(SdnControllerInventory.valueOf(vo));
bus.reply(msg, reply);
}
`@Override`
public void fail(ErrorCode errorCode) {
reply.setError(errorCode);
bus.reply(msg, reply);
}
});
}🤖 Prompt for AI Agents
In
`@plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerManagerImpl.java`
around lines 95 - 109, The reply's inventory is never set in
handle(AddSdnControllerMsg); modify the flow so the created
SdnControllerInventory is passed back from doCreateSdnController and assigned to
the AddSdnControllerReply before replying. Specifically, change
doCreateSdnController (or add an overloaded variant/callback) to provide the
created SdnControllerInventory to the Completion, and in the anonymous
Completion implementation inside handle(AddSdnControllerMsg) call
reply.setInventory(createdInventory) in success() before bus.reply(msg, reply);
keep fail() behavior unchanged.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Comment from shixin.ruan:
暂时不使用这个字段
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@MatheMatrix 明白了,既然暂时不需要使用这个字段,那就保持现状即可。如果后续有需要返回 inventory 信息的场景,可以随时补充。👍
🐰
( •‿•)
/>📋
🧠 Learnings used
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。
DBImpact Resolves: ZSTAC-73622 Change-Id: I667461766363677373636a6e626f70766e736f6f
8028031 to
6f33d21
Compare
DBImpact
Resolves: ZSTAC-73622
Change-Id: I667461766363677373636a6e626f70766e736f6f
sync from gitlab !9028