【教学培训篇】redfish接口映射

简介

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.idIdName 是 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"这个属性未定义。在这里先不对这个属性的含义进行解释,补上一条
image

再次构建,出现如下报错


这个报错比较好解决,由于是个人出包我们可以直接绕开这个检查方法,找到文件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配置进行借鉴)

  1. /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"
                            }
                        }
                    ]
                }
            ]
        }
    ]
}
  1. /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"
    }
  ]  
}
  1. /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"
    }
  ]
}
  1. /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."
}
  1. /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中定义的所有返回体字段。
3 个赞