【新增对象】对象不上树

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

问题描述

我新增了一个对象,并声明了接口,通过mdbctl lsobj可以看到对象,但是lsprop却看不到属性值

image

资源树也看不到这个对象

环境信息

openubmc25.12

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

[您希望实现什么]

实际结果

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

尝试过的解决方案

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

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

总结

问题 根本原因 解决方案
对象不在资源树 未配置 path 或未被 MDS 管理 补充 path,确认 Class 被组件引用
lsprop 无属性 未实现标准资源协作接口 确保 interfaces 正确声明并实现
接口未生效 model.json 配置错误 校验字段结构,属性置于 properties
代码未生成 接口命名冲突 修改接口名避免末段重复

重要提醒:所有资源树对象必须满足 “路径 + 接口 + MDS管理” 三位一体,缺一不可。否则即使对象存在,也无法对外暴露。

点击此处查看详细分析解答

新增对象未上资源树且属性不可见问题分析与解决方案

问题描述

用户新增了一个对象(如 Expander),并在 model.json 中声明了相关接口和属性,通过 mdbctl lsobj 可以看到对象实例(如 Expander_1_010103),但执行 mdbctl lsprop 无法查看其属性值。同时,在资源树(Resource Tree)中也无法发现该对象路径。

示例命令输出:

~ $ mdbctl lsobj Expander
Expander_1_010103
~ $ mdbctl lsprop Expander_1_010103
~ $ 

资源树结构未包含该对象:

/bmc
└── /bmc/kepler
    └── ...(无 Expander 相关路径)

根本原因分析

根据提供的上下文信息,以下是导致“对象不上树”或“属性不可见”的主要原因:

1. 对象未正确实现资源树接口(Resource Tree Interface)

  • 知识图谱依据Rule Resource 048 要求每个 Resource Tree Interface 必须被至少一个 resource tree object 实现。
  • 若对象虽定义在 model.json 中,但其所属的 Class 没有关联有效的 pathinterfaces 字段,则无法在资源树中生成对应节点。
  • 关键点:对象必须通过 path 明确指定在资源树中的位置,并通过 interfaces 声明所实现的接口,否则不会注入资源树。

2. model.json 配置错误或不完整

  • model.json 是资源树对象创建的核心配置文件。
  • 常见配置错误包括:
    • 缺少 path 字段;
    • interfaces 字段类型错误或引用未定义的接口;
    • 属性定义不在接口的 properties 下;
    • 接口末尾重复导致代码生成冲突(见 search_result_id=8)。
  • 文档依据search_result_id=8 提到,若 mdb_interface 中有定义接口但 service.lua 未生成代码,很可能是 model.json 字段配置错误。

3. 对象未被 MDS 管理或管理配置错误

  • 所有资源树对象必须由 MDS(Management Data Service)管理才能生效。
  • Class 定义中缺少 tableLocationtableName 配置,可能导致对象无法持久化和加载。
  • 依据search_result_id=2 提到,“资源树对象在 App 的 MDS 中管理才能生效该资源树定义的功能”。

4. mdbctl 工具仅支持资源协作接口中的对象

  • mdbctl lsprop 仅能查询实现了“资源协作接口”的对象。
  • 如果对象未实现任何标准接口(如 D-Bus 接口),即使存在,也无法通过 mdbctl 查看其属性。
  • 依据doc_chunk_id=1 明确指出:“mdbctl查询必须是在资源协作接口中的对象”。

解决方案

:white_check_mark: 1. 检查 model.json 中的类定义完整性

确保 Class 定义满足以下条件:

{
  "Expander": {
    "path": "/bmc/kepler/hk_general_hardware/Expander/${Id}",
    "interfaces": {
      "bmc.kepler.Hardware.Expander": {}
    },
    "properties": {
      "Status": {
        "baseType": "String",
        "default": "Enabled"
      }
    }
  }
}

关键字段说明

  • path:必须配置,决定对象在资源树中的路径;
  • interfaces:必须为对象类型(JSON object),键为合法接口名;
  • 接口必须已在 mdb_interface 或全局接口定义中声明;
  • 所有属性需在接口定义的 properties 下。

:white_check_mark: 2. 确保资源树接口已正确定义

  • 接口(如 bmc.kepler.Hardware.Expander)需在系统的接口定义文件中存在;
  • 若使用 mdb_interface,验证该接口下是否定义了对应的 propertiesmethods
  • 注意事项:不同接口若末段相同(如两个接口都以 .Bb 结尾),将触发防冲突重命名机制(AaBb.lua, CcBb.lua),需同步修改手写代码。

:white_check_mark: 3. 确认对象由 MDS 管理

  • 检查 Class 是否属于一个 service.json 中声明的组件;
  • 确保组件的 required 字段包含所依赖的接口(CSR、Per 等);
  • 若涉及持久化,检查 tableLocationtableName 是否正确配置(参考 rule_mds_031~rule_mds_032);

:white_check_mark: 4. 验证对象是否成功加载至资源树

使用以下命令检查运行时状态:

# 查看资源树是否加载对象
busctl --user tree bmc.kepler.hk_general_hardware

# 检查特定对象属性(需完整路径)
busctl --user get-property /bmc/kepler/hk_general_hardware/Expander/1_010103 bmc.kepler.Hardware.Expander Status

或者使用:

mdbctl lsprop Expander_1_010103 bmc.kepler.Hardware.Expander

注意:需显式指定接口名,否则可能因多接口屏蔽而无法显示。


期望结果

完成上述修复后:

  • 资源树中应能查看到新增对象路径:
    /bmc/kepler/hk_general_hardware/Expander/1_010103
    
  • 使用 mdbctl lsprop 能正常列出属性;
  • 通过 busctl 或 Redfish 接口可访问该对象的数据。

已尝试方案建议(供用户补充)

请用户补充以下信息以便进一步定位:

  • 是否进行了 bmc rebootframework restart
  • app.log 中是否有该对象加载失败的日志?
  • model.json 是否经过 merge_model.py 合并并成功编译进系统?
  • 是否在 CSR 文件中配置了该对象的实例化参数?

总结

问题 根本原因 解决方案
对象不在资源树 未配置 path 或未被 MDS 管理 补充 path,确认 Class 被组件引用
lsprop 无属性 未实现标准资源协作接口 确保 interfaces 正确声明并实现
接口未生效 model.json 配置错误 校验字段结构,属性置于 properties
代码未生成 接口命名冲突 修改接口名避免末段重复

重要提醒:所有资源树对象必须满足 “路径 + 接口 + MDS管理” 三位一体,缺一不可。否则即使对象存在,也无法对外暴露。

test

有点奇怪的是,虽然资源树上没看到这个对象,但是我能在CSR中同步他的属性值:

属实有点想不明白

image

对象也添加完毕了

我觉得应该是对象下面没挂接口的原因,你说的那个能同步到的对象可以用getprop查询一下他的属性配置是否应用了

找不到这个对象

我指的是你用getprop去查那个sensor,那个同步应该是没有生效的,你这个对象直接用busctl去看一下资源树信息

有值的,资源树上查不到Expander对象 :rofl:

  1. 用getprop可以看到值的来源,如果getprop的结果只有值的话就说明就是一个写死的值,同步没有生效
  2. 照目前的看大概率就是你这个对象还在内存里,没有上树,可以按照这个方向去排查,是不是取消了自动上树或者是有将对象下树的操作

这个取消自动上树是通过调哪个方法实现的呀?我看下自动生成的代码里面是不是有问题

就很奇怪,getprop显示是来源于资源树,但是资源树找不到 :rofl:

unregister_mdb_object,可以搜关键词 unregister remove

看了下,代码里面没有这些关键字

目前有没有什么手段可以看是在上树哪个阶段失败了呀?有没有什么日志文件可以看的?

或者我能在哪个文件中添加日志打印,可以看到失败的原因的?

在一键收集dump_info\AppDump\hk_general_hardware\mdb_info.log中,我可以看到这个对象

但是在cli上却看不到?

这个问题好离谱啊 :rofl:

组件的日志一般是在app.log,你可以在你代码里的on_add_object里面加打印,看下对象上树的时候你的回调执行流程

我在on_add_object加了打印的,他没有其他异常打印

看下framework.log 是不是你这个对象对应的对象组下树了
可以发一份日志到chenghaoyang3@h-partners.com