新增组件如何在gen/xxx/client.lua中自动生成升级信号相关代码

// 此模板仅供参考,如果不适用可以修改

问题描述

新增组件如何在gen/xxx/client.lua中自动生成如下升级信号相关代码

目前查看client.lua中位空

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

能自动生成升级信号相关代码

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

答案内容由AI生成,仅供参考:

新增组件如何在 gen/xxx/client.lua 中自动生成升级信号相关代码

要在 gen/xxx/client.lua 中自动生成与升级信号相关的订阅代码(如 UpgradePrepareSignalUpgradeProcessSignalUpgradeFinishSignal),需要确保系统根据 MDS 模型定义文件(主要是 service.jsonmdb_interface 接口定义)正确生成客户端代码。以下是详细的指导步骤和配置要求。


:magnifying_glass_tilted_left: 问题分析

您报告的问题是:

新增组件后,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 模型中缺少对信号或接口的依赖声明


:white_check_mark: 解决方案:正确配置 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"
    }
  }
}

:warning: 如果该接口未在 mdb_interface 中定义,则不会生成任何对应代码。


步骤二:在 service.json 中声明对 UpdateService 接口的依赖

在您的组件项目中,打开 service.json 文件,在 required 字段中显式声明对 bmc.kepler.UpdateService 接口的依赖

:white_check_mark: 正确示例:

{
  "required": [
    {
      "path": "/bmc/kepler/UpdateService",
      "interface": "bmc.kepler.UpdateService",
      "signals": [
        "UpgradePrepareSignal",
        "UpgradeProcessSignal",
        "UpgradeFinishSignal"
      ]
    }
  ]
}

:warning: 注意:即使不需要属性订阅,也必须通过 "signals": [...] 明确列出你需要监听的信号,否则 client.lua 不会生成对应的 SubscribeXXX 方法。


步骤三:执行代码自动生成命令

完成上述配置后,运行代码生成命令:

bingo gen

或者构建整个组件:

bingo build --stage=rc

此过程会解析 service.jsonmdb_interface 定义,自动生成 gen/xxx/client.lua 中的信号订阅函数。


:pushpin: 生成结果验证

执行成功后,检查 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

:white_check_mark: 如果出现这些函数,说明配置成功。


:cross_mark: 常见问题与排查

问题 原因 解决方案
client.lua 为空 未在 service.json 中正确 required 外部接口 添加对 bmc.kepler.UpdateService 的依赖
未生成信号订阅函数 虽然声明了接口但未列出 signals 数组 明确添加所需的 signals 名称
找不到 UpdateService.json 定义 mdb_interface 中缺少接口定义 mdb_interface 提交 PR 补全定义
使用了通配符 * 路径 旧策略可能导致信号不被识别 改为精确路径 /bmc/kepler/UpdateService

:puzzle_piece: 参考文档依据(来自 Context)

根据知识库中多个 Document ChunkKnowledge Graph 内容,可找到如下支持信息:

  • :white_check_mark: client.lua 是依据 service.jsonmdb_interface 自动生成的。([Document #2, #3])
  • :white_check_mark:service.jsonrequired 中声明了某接口,则会在 client.lua 中生成对应的资源协作接口方法。([Document #3])
  • :white_check_mark: 示例中明确展示了 bios_client:SubscribeFruCtrlFruCtrlBeforePowerOnSignal(cb) 的生成方式,完全类比于 SubscribeUpdateServiceUpgradePrepareSignal。([Document #3])
  • :white_check_mark: subscribe_signal 模块负责注册 D-Bus 信号监听,client.lua 利用它实现信号订阅。(KG: subscribe_signal 是模块,用于注册回调)

:white_check_mark: 总结:实现自动生成的关键步骤

  1. 确保 mdb_interface 存在 UpdateService.json 并定义相关信号
  2. service.jsonrequired 中添加:
    {
      "path": "/bmc/kepler/UpdateService",
      "interface": "bmc.kepler.UpdateService",
      "signals": ["UpgradePrepareSignal", "UpgradeProcessSignal", "UpgradeFinishSignal"]
    }
    
  3. 运行 bingo genbingo build 触发代码生成
  4. 检查 gen/xxx/client.lua 是否包含预期的 SubscribeXXX 函数

:white_check_mark: 按照以上流程操作后,即可实现在 client.lua 中自动生成升级信号相关代码。

相关链接:

  1. general_hardware 服务部署问题
  2. hpm签名包升级失败
  3. bmc插卡为非天池架构时,EXU升级主板CPLD报错问题求助
  4. MCU和VRD升级介绍
  5. 组件的开发和代码编写 | 文档中心 | openUBMC

自动生成代码是根据模型定义生成的,这里是client客户端的生成代码,一般需要在service.json的required字段下配置对应的依赖对象,自动生成代码会生成对应对象下的信号订阅接口