答案内容由AI生成,仅供参考:
新增组件如何在 gen/xxx/client.lua 中自动生成升级信号相关代码
要在 gen/xxx/client.lua 中自动生成与升级信号相关的订阅代码(如 UpgradePrepareSignal、UpgradeProcessSignal、UpgradeFinishSignal),需要确保系统根据 MDS 模型定义文件(主要是 service.json 和 mdb_interface 接口定义)正确生成客户端代码。以下是详细的指导步骤和配置要求。
问题分析
您报告的问题是:
新增组件后,gen/xxx/client.lua 文件为空,未生成与升级信号相关的订阅函数。
而期望的结果是自动生成类似以下格式的信号订阅方法:
function bios_client:SubscribeUpdateServiceUpdateServiceUpgradePrepareSignal(cb)
local sig = match_rule.signal('UpgradePrepareSignal', 'bmc.kepler.UpdateService'):with_path('/bmc/kepler/UpdateService')
self.signal_slots[#self.signal_slots + 1] = self:get_bus():match(sig, function(msg)
cb(msg:read())
end)
end
这表明:client.lua 文件未按预期生成信号订阅代码,原因通常在于 MDS 模型中缺少对信号或接口的依赖声明。
解决方案:正确配置 MDS 模型以触发代码生成
client.lua 的内容是通过工具链(如 bingo gen)根据组件的 service.json 文件中 required 所依赖的外部接口自动生成的。要生成升级信号的订阅函数,必须满足以下两个条件:
步骤一:确认 mdb_interface 中定义了 UpgradeService 的信号
确保 mdb_interface 仓库中存在如下接口定义路径:
json/intf/mdb/bmc/kepler/UpdateService.json
其内容应包含以下信号定义(示例):
{
"path": "/bmc/kepler/UpdateService",
"interface": "bmc.kepler.UpdateService",
"signals": {
"UpgradePrepareSignal": {
"description": "Firmware upgrade prepare phase started"
},
"UpgradeProcessSignal": {
"description": "Firmware upgrade process is ongoing"
},
"UpgradeFinishSignal": {
"description": "Firmware upgrade completed"
}
}
}
如果该接口未在 mdb_interface 中定义,则不会生成任何对应代码。
步骤二:在 service.json 中声明对 UpdateService 接口的依赖
在您的组件项目中,打开 service.json 文件,在 required 字段中显式声明对 bmc.kepler.UpdateService 接口的依赖。
正确示例:
{
"required": [
{
"path": "/bmc/kepler/UpdateService",
"interface": "bmc.kepler.UpdateService",
"signals": [
"UpgradePrepareSignal",
"UpgradeProcessSignal",
"UpgradeFinishSignal"
]
}
]
}
注意:即使不需要属性订阅,也必须通过 "signals": [...] 明确列出你需要监听的信号,否则 client.lua 不会生成对应的 SubscribeXXX 方法。
步骤三:执行代码自动生成命令
完成上述配置后,运行代码生成命令:
bingo gen
或者构建整个组件:
bingo build --stage=rc
此过程会解析 service.json 和 mdb_interface 定义,自动生成 gen/xxx/client.lua 中的信号订阅函数。
生成结果验证
执行成功后,检查 gen/xxx/client.lua 是否包含如下函数:
function xxx_client:SubscribeUpdateServiceUpdateServiceUpgradePrepareSignal(cb)
local sig = match_rule.signal('UpgradePrepareSignal', 'bmc.kepler.UpdateService'):with_path('/bmc/kepler/UpdateService')
self.signal_slots[#self.signal_slots + 1] = self:get_bus():match(sig, function(msg)
cb(msg:read())
end)
end
如果出现这些函数,说明配置成功。
常见问题与排查
| 问题 |
原因 |
解决方案 |
client.lua 为空 |
未在 service.json 中正确 required 外部接口 |
添加对 bmc.kepler.UpdateService 的依赖 |
| 未生成信号订阅函数 |
虽然声明了接口但未列出 signals 数组 |
明确添加所需的 signals 名称 |
找不到 UpdateService.json 定义 |
mdb_interface 中缺少接口定义 |
向 mdb_interface 提交 PR 补全定义 |
使用了通配符 * 路径 |
旧策略可能导致信号不被识别 |
改为精确路径 /bmc/kepler/UpdateService |
参考文档依据(来自 Context)
根据知识库中多个 Document Chunk 和 Knowledge Graph 内容,可找到如下支持信息:
client.lua 是依据 service.json 和 mdb_interface 自动生成的。([Document #2, #3])
若 service.json 的 required 中声明了某接口,则会在 client.lua 中生成对应的资源协作接口方法。([Document #3])
示例中明确展示了 bios_client:SubscribeFruCtrlFruCtrlBeforePowerOnSignal(cb) 的生成方式,完全类比于 SubscribeUpdateServiceUpgradePrepareSignal。([Document #3])
subscribe_signal 模块负责注册 D-Bus 信号监听,client.lua 利用它实现信号订阅。(KG: subscribe_signal 是模块,用于注册回调)
总结:实现自动生成的关键步骤
- 确保
mdb_interface 存在 UpdateService.json 并定义相关信号
- 在
service.json 的 required 中添加:{
"path": "/bmc/kepler/UpdateService",
"interface": "bmc.kepler.UpdateService",
"signals": ["UpgradePrepareSignal", "UpgradeProcessSignal", "UpgradeFinishSignal"]
}
- 运行
bingo gen 或 bingo build 触发代码生成
- 检查
gen/xxx/client.lua 是否包含预期的 SubscribeXXX 函数
按照以上流程操作后,即可实现在 client.lua 中自动生成升级信号相关代码。
相关链接:
- general_hardware 服务部署问题
- hpm签名包升级失败
- bmc插卡为非天池架构时,EXU升级主板CPLD报错问题求助
- MCU和VRD升级介绍
- 组件的开发和代码编写 | 文档中心 | openUBMC