背景
BMC 升级某些固件(如 CPLD)时,生效方式为整机 AC 掉电(ResetAC)。由升级生效引发的 AC 掉电不应该触发 0x0300001F(PSUServerPowerFailure)告警。
当前 firmware_mgmt 在升级完成时广播 UpgradeFinishSignal,power_mgmt 据此在 FirmwareType 包含 Cpld 时提前置位屏蔽标志 ShieldAclostEventRecord=1,屏蔽本次掉电告警。但该逻辑未区分生效方式:对于生效方式为复位 BMC(ResetBMC)的场景(如 A5),升级完成后到真正生效之间可能没有 AC 动作,屏蔽标志长期残留,导致下一次真实 AC 掉电告警被误屏蔽,0x0300001F 不上报。
因此需要在 firmware_mgmt 真正执行 AC 掉电动作前发送信号,由电源组件屏蔽本次掉电告警,并且新增一个开关,由power_mgmt配置firmware_mgmt是否发送信号。
关联ISSUE
整体方案
- 在已有资源协作接口
bmc.kepler.UpdateService上新增信号BeforeActiveActionSignal(SystemId, ActiveAction, Phase, AdditionalOptions):firmware_mgmt 在真正执行 AC 掉电(PowerCtrl('ACCycle'))之前发送Phase=Starting;在AC动作未执行或执行失败时发送Phase=Exception,通知消费方撤销准备。 - 在
bmc.kepler.UpdateService上新增确认方法BeforeActiveActionReply(SystemId, ActiveAction, Result, AdditionalOptions):电源组件收到Starting、把屏蔽标志落盘后调用该方法回复Result=0;firmware_mgmt 发送信号后“上锁”,收到确认后“解锁”才真正执行 AC。信号是单向广播、没有应答,必须由该方法提供确认。确认等待最多 60s(硬编码 1min),超时后发Exception并按失败策略处理。 - 在
bmc.kepler.UpdateService上新增可读可写属性BeforeActiveActionSignalEnabled(默认false,不持久化):由电源组件置true表示支持并承诺回复确认,firmware_mgmt 读取该属性决定是否发送信号并等待确认。
评审点
评审点1:变更资源协作接口 bmc.kepler.UpdateService,新增信号 BeforeActiveActionSignal、确认方法 BeforeActiveActionReply 与属性 BeforeActiveActionSignalEnabled。
详细描述
评审点1:变更资源协作接口 bmc.kepler.UpdateService
变更描述: 接口已承载固件升级管理能力,本次变更同属于升级流程中的生效控制:升级固件生效方式为 ResetAC 时,需在真正执行 AC 掉电前通知电源组件屏蔽本次掉电告警,并等待电源组件确认准备完成后(登记屏蔽信号)再执行;同时提供开关属性,由电源组件配置,决定firmware_mgmt是否发送信号。变更类型为在已有接口上新增信号、方法和属性,不修改、不废弃已有成员。
变更属性
| 变更类型 | 属性名称 | 签名 | 变化通知 | 属性描述 | 访问权限 | 持久化类型 | 变更影响 |
|---|---|---|---|---|---|---|---|
| 新增 | BeforeActiveActionSignalEnabled | Boolean | false | 标识电源组件是否支持AC掉电前通知机制,默认值为 false。true:电源组件已订阅 BeforeActiveActionSignal,并承诺回复 BeforeActiveActionReply,firmware_mgmt 在 AC 掉电前发送信号;false:firmware_mgmt 不发送信号、不等待确认,保持旧行为 |
Read: ReadOnly Write: BasicSetting |
不持久化(内存),进程重启后恢复默认 false,由电源组件启动时重新置位 | 新增属性,无兼容性影响;默认 false,旧版本电源组件不置位时 firmware_mgmt 保持旧行为 |
变更信号
| 变更类型 | 信号名称 | 签名 | 参数描述 | 信号描述 | 变更影响 |
|---|---|---|---|---|---|
| 新增 | BeforeActiveActionSignal | issa{ss}SystemId:系统ID(S32),取值规则同升级三阶段信号:单系统为 1,多系统为触发本次生效的 ctx.SystemId,255 表示所有 host ActiveAction:即将执行的生效方式(String),取值参考 common_def.active_mode:None / ResetBMC / ResetAC / DelayResetBMC / ForceResetBMC;当前场景为 ResetACState:阶段(String),Starting-即将执行,请消费方准备并确认;Exception-未执行或执行失败,请撤销准备 AdditionalOptions:预留扩展字典(Dictionary),Exception 时可带 Reason |
ActiveAction 执行前通知信号:Starting 表示 firmware_mgmt 即将执行该生效动作,请消费方完成必要准备(如屏蔽 AC 掉电告警置位)并调用 BeforeActiveActionReply 确认;Exception 表示该动作未执行或执行失败(含确认失败/超时),请消费方撤销准备(删除置位记录) |
新增信号,无兼容性影响;未订阅该信号的组件不受影响 |
说明:
- 签名
issa{ss}为信号 payload 签名(不含框架自动附加的 contexta{ss};运行时实际 D-Bus 完整签名为a{ss}issa{ss})。四个字段依次为SystemId(i/S32)、ActiveAction(s)、Phase(s)、AdditionalOptions(a{ss}),与现有UpgradeFinishSignal(isa{ss})的签名风格一致。 Starting只在进入 AC 重试循环前发送一次;AC 执行成功不再发Exception;确认失败/超时、或 AC 最终失败时发Exception撤销准备,避免屏蔽标志残留。
变更方法
| 变更类型 | 方法名称 | 请求参数 | 响应参数 | 方法描述 | 访问权限 | 变更影响 |
|---|---|---|---|---|---|---|
| 新增 | BeforeActiveActionReply | SystemId:系统ID(S32),与信号中的值一致 ActiveAction:生效方式(String),取值参考 common_def.active_mode,当前为 ResetAC Result:准备结果(S32),0-已就绪,-1-准备失败 AdditionalOptions:预留扩展字典(Dictionary),建议带 Reason |
无 | ActiveAction 执行前准备结果确认:电源组件收到 Phase=Starting 的信号、完成屏蔽标志落盘后调用;Result=0 表示已就绪,firmware_mgmt 可解锁并执行 AC;Result=-1 表示准备失败 |
BasicSetting | 新增方法,无兼容性影响;未调用该方法的旧电源组件通过属性 false 保持旧行为 |
请求签名:issa{ss}(不含框架自动附加的 context);响应签名为空 {}。
变更接口影响
| 路径 | 变更接口影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/UpdateService | 新增 BeforeActiveActionSignal 信号、BeforeActiveActionReply 方法和 BeforeActiveActionSignalEnabled 属性,提供 ActiveAction 执行前通知、确认与告警屏蔽能力 | 不涉及 | 新增属性为内存属性,不涉及主键变更,无兼容性问题 | firmware_mgmt 新增发送信号、上锁等待确认、失败撤销的逻辑;电源组件新增信号订阅、确认方法调用和开关置位逻辑 |
是否准备好AI预审
否