代码仓
中
mdbctl组件自定义命令
更新时间: 2025/10/15
在AtomGit上查看源码

重要提示:

  1. 组件运行过程不能依赖和使用调试接口下的方法和属性(包括bmc.*.Debug.*)
  2. bmc.*.Debug.*类型的调试接口,必须实现构建裁剪
  3. bmc.*.Release.*类型的发布接口,必须考虑功能的差异性,例如在线调试连接组件时,可以输出在线调试日志,但其他组件调用时无法输出
  4. 调试命令和发布命令都必须上interface-sig组评审,发布命令必须补充高级命令资料

命令如何添加 ​

  1. 自定义调试命令即是挂在组件对象下的资源树方法,bmc.*.Debug.*和bmc.*.Release.*接口下的方法被视作组件自定义调试命令,区分Debug命令与Release命令,Release版本的调试命令在Debug版本默认存在,无需重复配置
shell
NAME                                TYPE      SIGNATURE   RESULT/VALUE  FLAGS
bmc.kepler.Debug.LogMock            interface -           -             -
.MockLog                            method    a{ss}usb    -             -
bmc.kepler.Object.Properties        interface -           -             -
  1. mdb_interface定义的bmc.*.Debug.*和bmc.*.Release.*接口下(即为自定义调试命令)的方法与参数必须在model.json配置displayDescription字段,并用英文描述,displayDescription字段尽量保持简洁。
  2. 命令接口所在路径现已支持配置动态参数路径,确保命令唯一
  3. model.json的参数配置需要添加optional(可选参数)字段,不配置默认为false,配置为true时必须配置default字段,在方法调用参数缺省时使用默认值(可选参数只允许在最后,不支持跳跃配置)
  4. model.json方法同级添加cmdName字段,全小写命名风格,在同一组件内不允许cmdName重复,命令名显示为cmdName
  5. 命令参数不支持数组、字典等复杂数据类型
  6. 需要组件方法处理操作日志打印

mdb_interface配置示例:

json
{
    "bmc.kepler.Debug.LogMock": {
        "properties": {},
        "methods": {
            "MockLog": {
                "req": {
                    "Count": {
                        "baseType": "U32",
                        "minimum": 1,
                        "maximum": 1000,
                        "description": "注入的日志数量"
                    },
                    "Text": {
                        "baseType": "String",
                        "minLength": 1,
                        "maxLength": 1024,
                        "description": "注入的日志内容"
                    },
                    "RepeatText": {
                        "baseType": "Boolean",
                        "description": "标志是否重复内容"
                    }
                },
                "rsp": {
                },
                "description": "模拟日志注入"
            }
        }
    }
}

mds配置示例:

json
{
    "LogMock": {
        "path": "/bmc/kepler/Debug/LogMock",
        "interfaces": {
            "bmc.kepler.Debug.LogMock": {
                "methods": {
                    "MockLog": {
                        "cmdName": "mocklog",
                        "req": {
                            "Count": {
                                "minimum": 1,
                                "maximum": 1000,
                                "displayDescription": "Number of ingested logs."
                            },
                            "Text": {
                                "optional": true,
                                "default": "test log",
                                "displayDescription": "Content of ingested logs."
                            },
                            "RepeatText": {
                                "optional": true,
                                "default": true,
                                "displayDescription": "Indicates whether the text is duplicate."
                            }
                        },
                        "displayDescription": "Mock log update."
                    }
                }
            }
        }
    }
}

命令如何区分目录 ​

代码仓结构参照/framework/maca/mds下新增debug路径用于配置Debug方法(对象下同时配置debug接口与release接口则仍配置在默认目录,但建议评估拆分),debug方法实现部分同样也需要拆分目录,debug目录下的接口定义如不涉及接口依赖可不配置service.json。

cmake配置打包debug目录:

参考/framework/maca/src/lualib/maca_app.lua的init_debug_service方法初始化debug对象:

挂载命令的对象需要有对象名(单例对象自动创建对象名),可以在回调方法里设置:

命令如何使用 ​

  1. attach组件后通过lscmd命令查看当前组件支持的自定义调试命令
shell
% attach maca
Success

% lscmd
Usage: CommandA <param1> [param2]
"Command description"
param1  type  "Param description"
param2  type  "Param description"  "default value"

查看的结果格式为:

  • Usage: [方法名] [参数]
  • [方法描述] - 描述未配置时为空
  • [参数] [参数类型] [参数描述] [默认值(配置可选参数)]
  1. 直接使用方法名加参数的方式使用,以maca日志注入方法为例:
shell
% attach maca
Success

% lscmd
Usage: mocklog <Count> <Text> [RepeatText]
Mock log inject
Count  u  Number of ingested logs
Text  s  Content of ingested logs
RepeatText  b  Indicates whether the log content is duplicate  true

% MockLog 10 'hello' true
  1. 动态参数路径下的方法如何区分

对于动态参数路径下的方法由mdbctl对方法进行合并处理,并添加ObjectName作为第一参数,即用户在使用时需额外指定执行对象。

将配置了自定义命令的bmc.kepler.Release.TraceChip接口挂载至动态参数路径下,即路径下所有对象支持该方法:

json
{
    "Cpld": {
        "package":"Cpld",
        "path": "/bmc/kepler/Chip/Cpld/:Id",
        "interfaces": [
            "bmc.kepler.Release.TraceChip"
        ]
    }
}

使用示例:

shell
% attach hwproxy
Success

-- 这里由mdbctl增加了参数用于指定对象
% lscmd
Usage: tracechip <ObjectName> <Action>
Trace the read and write data of a specified component.
ObjectName  s  Object for which the command is executed.
Action  s  The value start indicates that the component starts to trace the read and write data. The value stop indicates that the component stops tracing the read and write data.

注意事项 ​

  1. mdbctl ≥ 1.70.3支持添加与使用组件自定义调试命令
  2. bmcgo ≥ 0.5.318支持生成displayDescription字段
  3. mdbctl ≥ 1.70.6支持配置动态参数路径下的自定义命令
  4. 组件codegen_policy的version ≥ 16