提供 Redfish BIOS 属性注册表数据到 API

https://storyboard.openstack.org/#!/story/2008571

本提案旨在在使用 Redfish 驱动程序时检索 Redfish BIOS 属性注册表,并将其作为附加数据提供在 bios API 端点中。

问题描述

Redfish BIOS 属性注册表(又称 BIOS 注册表)在 DMTF Redfish 规范 [0] 中定义为描述 BIOS 设置资源中每个属性语义的一种方式。 此 JSON 编码的注册表包含每个属性的描述和其他信息,例如数据类型、允许的值以及该属性是否为只读。

当用户尝试通过 clean steps [1] 设置 BIOS 属性时,不清楚应该使用哪个名称来表示该属性,它的允许值是什么,甚至该属性是否可写。 通过 API 暴露 BIOS 注册表是有用的,这样就可以将其用作设置 BIOS 属性时的文档形式。

来自 BMC 为某个属性返回的 BIOS 注册表条目的示例

{
   "AttributeName": "SriovGlobalEnable",
   "CurrentValue": null,
   "DisplayName": "SR-IOV Global Enable",
   "DisplayOrder": 2331,
   "HelpText": "Enables or disables the BIOS configuration of Single Root
                I/O Virtualization (SR-IOV) devices. Enable this feature
                if booting to a virtualization operating system that
                recognize SR-IOV devices. ",
   "Hidden": false,
   "Immutable": false,
   "MenuPath": "./IntegratedDevicesRef",
   "ReadOnly": false,
   "ResetRequired": true,
   "Type": "Enumeration",
   "Value": [
     {
       "ValueDisplayName": "Enabled",
       "ValueName": "Enabled"
     },
     {
       "ValueDisplayName": "Disabled",
       "ValueName": "Disabled"
     }
   ],
   "WarningText": null,
   "WriteOnly": false
 }

此更改在 Wallaby 中期讨论中进行了讨论,请参阅备注 [2]

提议的变更

此工作将包含以下更改

  • Sushy 中获取 BIOS 注册表的支持。 检索 BIOS 注册表需要多个 Redfish 请求,因为基本 URI - /redfish/v1/Registries 提供了一个带有供应商特定名称的 BIOS 注册表 URI。 注册表将是一个字典条目的列表,每个 BIOS 属性一个。

  • Ironic 的更改,以便在获取 BIOS 设置时检索 Redfish BIOS 注册表,当前是在 Ironic 将节点移动到 manageablecleaning 状态以及更改 BIOS 设置之后。

  • 过滤从 Sushy 接收到的 BIOS 注册表,仅保存与从 Sushy 接收到的 BIOS 设置匹配的条目,基于 BIOS 注册表条目中的 AttributeName 字段。

  • 将注册表数据存储在与每个 BIOS 设置关联的 Ironic DB 中。

  • 通过 REST API 暴露 BIOS 注册表数据。 不会添加新的端点。 只有在设置 ?detail=True 时,注册表数据才会被包含在 /v1/nodes/<node>/bios 端点中。 注册表数据始终包含在 /v1/nodes/<node>/bios/<setting> 中。 这类似于当前节点 API 的工作方式,例如 /v1/nodes/v1/nodes?detail=True/v1/nodes/<node>

备选方案

  • 操作员可以继续使用 vendor 文档或仅对布尔值进行简单更改来设置 BIOS 设置。

  • 与其检索注册表并对其进行缓存,Ironic 可以从 API 同步获取。 但是,这可能会导致性能问题,尤其是在处理多个 API 请求时。

数据模型影响

  • BIOS 注册表定义了一个模式,例如 [3],但是,这取决于供应商,哪些属性字段存储在注册表中。 Sushy 应该解析以下常见字段,这些字段存在于典型供应商的注册表中,例如 Dell、HPE 和 SuperMicro

    * AttributeName
    * DefaultValue
    * Type
    * Immutable
    * ReadOnly
    * ResetRequired
    * IsSystemUniqueProperty
    * LowerBound
    * UpperBound
    * MinLength
    * MaxLength
    * Value (possible values for enumeration types)
      * ValueName
    
  • BIOS 注册表将与 BIOSSetting 一起存储在 Ironic DB 中,请参阅 [4]。 将添加以下列,并且必须包含在迁移代码中

    • attribute_type (字符串)

    • allowable_values (列表)

    • lower_bound (整数)

    • max_length (整数)

    • min_length (整数)

    • read_only (布尔值)

    • reset_required (布尔值)

    • unique (布尔值)

    • upper_bound (整数)

对于每个设置,仅存储 attribute_type 相关的字段,如 BMC 返回的那样。 例如,对于 Enumeration 类型,仅存储 allowable_values,对于 Integer,仅存储 min_lengthmax_length

此外,BIOSSetting name 字段应进行索引,以便更快地检索。

状态机影响

BIOS 注册表将在过渡到 manageablecleaning 状态时从 BMC 检索,使用多个 Redfish 请求。 这可能会增加一些额外的状态转换时间,但预计不会对状态转换性能产生影响。

REST API 影响

  • 不会添加新的 REST API 端点。 /v1/nodes/<node>/bios/<attribute> 端点将被更改为包含新的注册表字段。 /v1/nodes/<node>/bios 端点仅在设置 ?detail=True 时才包含此数据,类似于 /v1/nodes/ 端点的运作方式。 还可以使用查询来仅检索特定字段。

  • 如果无法从节点检索 BIOS 注册表,则注册表字段将设置为 null

  • 对于 allowable_values,一些供应商在响应中包含 ValueName 和 ValueDisplayName。 API 将仅显示允许值的列表。

  • 对于枚举类型,带有新注册表字段的 /v1/nodes/<node>/bios/ProcVirtualization 的示例响应如下

    { "ProcVirtualization":
        { "created_at": "2021-03-31T13:50:51+00:00",
          "updated_at": null,
          "name": "ProcVirtualization",
          "value": "Enabled",
          "allowable_values": ["Enabled","Disabled"]
          "lower_bound": null,
          "max_length": null,
          "min_length": null,
          "read_only": false,
          "reset_required": null,
          "type": "Enumeration",
          "unique": null,
          "upper_bound": null,
          "links": [
          {
            "href": "http://IP/v1/nodes/1b1c6edf-4459-4172-b069-5c6ca3e59e03/bios/ProcVirtualization",
            "rel": "self"
          },
          {
            "href": "http://IP/nodes/1b1c6edf-4459-4172-b069-5c6ca3e59e03/bios/ProcVirtualization",
            "rel": "bookmark"
          }
        ]
      }
    }
    
  • 对于字符串类型且唯一于此节点的 /v1/nodes/<node>/bios/SerialNumber 的示例响应如下

    { "SerialNumber":
        { "created_at": "2021-03-31T13:50:51+00:00",
          "updated_at": null,
          "name": "SerialNumber",
          "value": "Q95102Q8",
          "allowable_values": [],
          "lower_bound": null,
          "max_length": 16,
          "min_length": null,
          "read_only": false,
          "reset_required": null,
          "type": "String",
          "unique": true,
          "upper_bound": null,
          "links": [
          {
            "href": "http://IP/v1/nodes/1b1c6edf-4459-4172-b069-5c6ca3e59e03/bios/SerialNumber",
            "rel": "self"
          },
          {
            "href": "http://IP/nodes/1b1c6edf-4459-4172-b069-5c6ca3e59e03/bios/SerialNumber",
            "rel": "bookmark"
          }
        ]
      }
    }
    

客户端 (CLI) 影响

“baremetal” CLI

  • bios 命令 baremetal node bios 将如下更改。

    • 此命令现在将注册表数据作为附加字段包含在内,例如

      $ baremetal node bios setting show hp-910 ProcVirtualization -f json
      {
        "created_at": "2021-03-31T13:50:51+00:00",
        "name": "ProcVirtualization",
        "updated_at": null,
        "value": "Enabled"
        "allowable_values": ["Enabled","Disabled"]
        "lower_bound": null,
        "max_length": null,
        "min_length": null,
        "read_only": false,
        "reset_required": null,
        "type": "Enumeration",
        "unique": null,
        "upper_bound": null,
      }
      
  • 将添加一个新参数 --longbaremetal node bios list 命令,以包含每个属性的注册表数据。 默认情况下不包含它。 这类似于 baremetal node list <node> --long 命令。

“openstacksdk”

Openstacksdk 当前不支持 bios 设置。 虽然这对于此规范来说不是必需的。 应该将 bios 添加到 openstacksdk,并包含详细的注册表信息。

RPC API 影响

将向 RPC API 添加一种新方法来获取 BIOS 注册表。

驱动程序 API 影响

  • Redfish 驱动程序中的 cache_bios_settings 方法现在也将从 Sushy 获取 BIOS 注册表。

Nova 驱动程序影响

Ramdisk 影响

安全影响

对 BIOS 配置的非特权访问可能会暴露敏感的 BIOS 信息和可配置的 BIOS 选项给攻击者,这可能会导致破坏性后果。 建议将这种能力限制为管理角色。

其他最终用户影响

可扩展性影响

检索 BIOS 注册表数据的 Redfish 请求将增加对 BMC 的流量,但是,由于这些请求仅在节点过渡到 manageablecleaning 时发生,因此预计不会影响可扩展性。

BIOS 注册表数据将与相应的 BIOS 设置一起存储在 Ironic DB 中。 这将增加 Ironic DB 的大小,但预计不会造成过大的负担,因为 BIOS 设置列表虽然因供应商而异,但大约有 100 到 200 个条目。

性能影响

预计此更改不会对节点过渡到 manageablecleaning 所需的时间产生性能影响。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

bfournie@redhat.com

工作项

  • 向 Sushy 添加 BIOS 注册表支持

  • 向 Ironic 添加缓存支持注册表。

  • 在 Ironic 中添加检索注册表的功能,在节点过渡到 cleaningmanageable 时,并存储/更新缓存。

  • 添加获取节点 BIOS 注册表的 API。

  • 在 ironic.conf 中添加配置项 bios_registory_langbios_registry_enable

依赖项

测试

  • 将添加带有示例供应商数据的单元测试,但对于第三方测试来说,测试每个供应商的接口是必要的。

升级和向后兼容性

文档影响

  • 将更新 API 参考。

参考资料