简介
openUBMC中北向接口(Redfish、Web-backend、CLI、SNMP)的设计,针对接口格式与资源协作接口的对接,提出配置、映射的概念,进而引入了映射接口配置的机制,框架解析接口配置,将接口请求映射到资源协作接口,拼装对应格式的返回数据。
在之前的学习中,我们能够新增组件并扩展接口,接下来我们将学习使用Redfish相关接口的映射配置仓对外暴露接口,提供服务。
映射配置
首先先获取当前Redfish相关接口的映射配置仓,获取目录如下:
git clone git@gitcode.com:openUBMC/rackmount.git
接口配置一般放在interface_config/redfish/mapping_config路径下,其中一个文件对应一个Redfish路径,便于查找。我们希望扩展一个Redfish接口,路径为:/redfish/v1/HelloOpenUBMC
创建路径如下:
接着我们可以根据model.json中定义的方法创建请求配置
在HelloOpenUBMC.json中添加如下配置(根据快速入门给的模板改改放入,这个不是最终版,后面记录了一系列踩坑过程)
需要注意接口映射配置规则
- Uri:定义了客户端访问该资源的 URL 路径
- Interfaces: 定义该资源支持的 HTTP 方法(GET、POST、PATCH、DELETE 等)
- Type:接口类型,这里表示是一个获取资源数据的接口
- RspBody: 定义了 GET 返回的 JSON 结构
@odata.id、Id、Name是 Redfish 标准字段。WelcomeMessage是自定义业务字段,值用${}包裹表示它是一个模板变量,会动态替换。
- ProcessingFlow: 描述了Redfish服务在收到GET请求后,如何从后端获取数据并填充到响应中。
Type: "Property"表示这是一个简单的属性读取流程。可选值还有:"Script"(执行脚本)、"HttpCall"(调用 HTTP 接口)、"Validate"(数据校验)Path是后端数据源的路径,在这里可以是model.json申明的资源路径。Interface指定了要调用的后端接口 / 驱动。Destination定义了后端数据字段和响应字段的映射关系。
这里我们通过接口映射配置,不仅将Redfish的uri 资源进行了具体的定义,并将Redfish的uri 资源与openUBMC资源协作接口关联了起来,开发者无需再编写Redfish的接口代码逻辑。
组件构建
修改rockmount仓后,我们需要按照新增组件类似步骤应用修改。对rackmount修改版本后进行构建出包。
rackmount构建时,我遇见了第一个错误:提示"@odata.type"这个属性未定义。在这里先不对这个属性的含义进行解释,补上一条

再次构建,出现如下报错
这个报错比较好解决,由于是个人出包我们可以直接绕开这个检查方法,找到文件rackmount/mapper_check/MapperCheck.py,屏蔽校验
构建,失败,这次又报了一个新错误,看到这个错误我挺懵的,什么schema,在快速入门里面不是配了个接口json就成功构建通过了吗!
继续解决…通过查阅资料终于明白了这个schema到底是什么东西。 Schema 文件简单说就是定义数据结构、格式和规则的 “说明书” ,它能强制要求数据(比如之前写的 Redfish JSON 模板)必须符合预设的结构,避免格式混乱或字段缺失,常见于 JSON、XML 等数据格式中。
还记得前面提到的@odata.type报错吗?schema文件名就是通过这个属性查找的,例如 “@odata.type”: “#HelloOpenUBMC.v1_0_0.HelloOpenUBMC”,对应的文件名应为helloopenubmc.v1_0_0.json。很不幸的是,如果需要从头开始进行shema文件配置,你需要新增以下四个文件,位置以及命名规范分别为:
- /interface_config/redfish/static_resource/redfish/v1/schemastore/en/xxx.json
- /interface_config/redfish/static_resource/redfish/v1/schemastore/en/xxx.vxxx.json
- /interface_config/redfish/static_resource/redfish/v1/jsonschemas/xxx/index.json
- /interface_config/redfish/static_resource/redfish/v1/jsonschemas/xxx.vxxx/index.json
在此处我们为HelloOpenUBMC创建的文件内容如下(其实配这个文件也遇到了很多问题,建议认真看报错,写的都很清晰,对于不明确的报错需要看看已有的schema配置进行借鉴)
- /mapping_config/HelloOpenUBMC/HelloOpenUBMC.json
{
"Resources": [
{
"Uri": "/redfish/v1/HelloOpenUBMC",
"Interfaces": [
{
"Type": "GET",
"RspBody": {
"@odata.id": "/redfish/v1/HelloOpenUBMC",
"@odata.type": "#HelloOpenUBMC.v1_0_0.HelloOpenUBMC",
"@odata.context": "/redfish/v1/$metadata#HelloOpenUBMC.HelloOpenUBMC",
"Id": "HelloOpenUBMC",
"Name": "HelloOpenUBMC",
"WelcometoOpenUBMC": "${ProcessingFlow[1]/Destination/WelcometoOpenUBMC}"
},
"ProcessingFlow": [
{
"Type": "Property",
"Path": "/bmc/kepler/HelloOpenUBMC",
"Interface": "bmc.kepler.OpenUBMC.Community",
"Destination": {
"WelcometoOpenUBMC": "WelcometoOpenUBMC"
}
}
]
}
]
}
]
}
- /static_resource/redfish/v1/jsonschemas/helloopenubmc/index.json
{
"@odata.context": "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile",
"@odata.id": "/redfish/v1/JSONSchemas/HelloOpenUBMC",
"@odata.type": "#JsonSchemaFile.JsonSchemaFile",
"Id": "HelloOpenUBMC",
"Description": "HelloOpenUBMC Location",
"Name": "HelloOpenUBMC Schema File",
"Languages": [
"en"
],
"Schema": "#HelloOpenUBMC.HelloOpenUBMC",
"Location": [
{
"Language": "en",
"Uri": "/redfish/v1/SchemaStore/en/HelloOpenUBMC.json",
"PublicationUri": "https://redfish.dmtf.org/schemas/v1/HelloOpenUBMC.json"
}
]
}
- /static_resource/redfish/v1/jsonschemas/helloopenubmc.v1_0_0/index.json
{
"@odata.context": "/redfish/v1/$metadata#JsonSchemaFile.JsonSchemaFile",
"@odata.id": "/redfish/v1/JSONSchemas/HelloOpenUBMC.v1_0_0",
"@odata.type": "#JsonSchemaFile.v1_0_2.JsonSchemaFile",
"Id": "HelloOpenUBMC.v1_0_0",
"Description": "HelloOpenUBMC Location",
"Name": "HelloOpenUBMC Schema File",
"Languages": [
"en"
],
"Schema": "#HelloOpenUBMC.v1_0_0.HelloOpenUBMC",
"Location": [
{
"Language": "en",
"Uri": "/redfish/v1/SchemaStore/en/HelloOpenUBMC.v1_0_0.json"
}
]
}
- /static_resource/redfish/v1/schemastore/en/helloopenubmc.json
{
"$schema": "http://redfish.dmtf.org/schemas/v1/redfish-schema.v1_1_0.json",
"title": "#HelloOpenUBMC.v1_0_0.HelloOpenUBMC",
"$ref": "#/definitions/HelloOpenUBMC",
"definitions": {
"HelloOpenUBMC": {
"updatable": false,
"insertable": false,
"deletable": false,
"uris": [
"/redfish/v1/HelloOpenUBMC"
]
}
},
"copyright": "Copyright © Huawei Technologies Co., Ltd. 2021. All rights reserved."
}
- /static_resource/redfish/v1/schemastore/en/helloopenubmc.v1_0_0.json
{
"$schema": "http://redfish.dmtf.org/schemas/v1/redfish-schema.v1_1_0.json",
"$id": "http://redfish.dmtf.org/schemas/v1/HelloOpenUBMC.v1_0_0.json",
"definitions" : {
"HelloOpenUBMC":{
"type":"object",
"properties": {
"WelcometoOpenUBMC":{
"type":"string"
},
"@odata.id":{
"type":"string",
"format":"uri"
},
"@odata.type":{
"type":"string"
},
"@odata.context":{
"type":"string"
},
"Name":{
"type":"string"
},
"Id":{
"type":"string"
}
}
}
}
}
出包验证
- rackmount构建出包后,修改manifest中对rackmount的依赖版本。
- 接着在manifest目录下执行bingo build -sc qemu,构建qemu包。
- 若在output/packet/inner目录下存在对应机型的qume包,则出包成功。
- 使用python3 build/works/packet/qemu_shells/vemake_1711.py运行qemu。
- qemu环境稳定后,使用postman测试接口是否被成功注册,url如下:
GET https://192.168.0.70:10443/redfish/v1/HelloOpenUBMC
可以看到请求成功并且返回了我们在rackmount中定义的所有返回体字段。







