固件接口

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

本规范建议实现一个新的硬件接口,用于自动固件更新。

问题描述

一些运维人员希望确保他们的硬件使用不同硬件组件(例如 BIOS、网卡、BMC 等)的特定固件版本,主要原因是他们希望集群中的机器保持一致性。当他们获得一台新机器时,需要通过升级或降级来更新所有组件的固件。

目前在 Ironic 中,我们支持更新固件,运维人员可以通过在节点上启用清理步骤 update_firmware 来实现;问题在于,这需要了解清理步骤的名称和参数。

  • 作为运维人员,我希望在安装操作系统之前,能够为我的机器(BIOS、网卡、DPU、GPU、BMC)安装特定的固件版本。

提议的变更

  • 在节点注册并且可用基本硬件信息后,运维人员可以定义固件更新配置。

  • 这里的工作与我们为 BIOSInterfaceRAIDInterface 所做的工作类似。将创建一个新的接口 FirmwareInterface,允许检索节点中硬件组件的当前安装的固件版本,并更新它们的固件。

  • 节点上每个硬件组件的当前固件版本信息将通过带外方式收集,并且应该在通过验证步骤注册节点后可用。

  • 将为 FirmwareInterface 创建一个新的清理步骤 update,它将用于更新节点上每个硬件组件的固件。

  • 如果不存在,将创建一个新的数据库表 firmware_information。它将包含节点上每个硬件组件的当前固件版本信息,如果调用了清理步骤 update,则会更新该信息。

  • 我们打算首先在 redfish 接口上启动,所有其他接口将默认设置为 no-firmware。如果其他硬件厂商希望实现它,欢迎他们这样做。

注意

本规范描述了带外接口。计划稍后实现一个带内接口,可以将其称为 AgentFirmware,需要定义 IPA 级别 API 的更改。其他实现可以支持通过此接口执行必要的带内步骤。

备选方案

我们可以通过手动清理使用当前的 update_firmware 清理步骤 [0],但缺点是,我们不知道节点上哪些硬件组件可以升级以及它们的当前固件版本是什么。

数据模型影响

  • 将创建新的对象 ironic.objects.firmware.Firmware

  • 将在 Node 对象中添加一个新的字段 firmware_interface

  • 将创建一个新的表 firmware_information,它将存储节点每个硬件组件的固件信息。

    • 表描述

      • node_id

        • Integer

        • PrimaryKeyConstraint(‘nodes.id’)

      • component

        • 字符串

        • PrimaryKeyConstraint

      • initial_version - 在我们创建条目时存储

        • 字符串

      • current_version

        • 字符串

      • last_version_flashed

        • 字符串

      • created_at

        • DateTime

      • updated_at - 组件上次刷新时间

        • DateTime

状态机影响

REST API 影响

建议在 FirmwareInterface 上实现一个新的步骤

  • firmware.update:它将触发指定组件的固件更新。例如

    {
      "target":"clean",
      "clean_steps": [{
        "interface": "firmware",
        "step": "update",
        "requires_ramdisk": true,
        "args": {
          "settings": [
            {
              "component": <name>,
              "url": <value>
            },
            {
              "component": <name>,
              "url": <value>
            }
          ]
        }
      }]
    }
    
  • 将引入一个新的 REST API 来获取节点的缓存固件信息

    GET /v1/nodes/<node_ident>/firmware
    

    该操作将返回当前缓存的设置,数据模式如下

[
  {
    "component":"bios",
    "initial_version": "v1.0.0.0 (01.02.2022)",
    "current_version": "v1.2.3.4 (01.02.2023)",
    "last_version_flashed": "v1.2.3.4 (01.02.2023)",
    "created_at": "2023-02-01 09:00:00",
    "updated_at": "2023-03-01 10:00:00"
  },
  {
    "component": "bmc",
    "initial_version": "v1.0.0",
    "current_version": "v1.0.0",
    "last_version_flashed": "",
    "created_at": 2023-02-01 09:00:00",
    "updated_at": ""
  }
]

客户端 (CLI) 影响

openstackSDK 将被更新

  • 检索节点的所有固件信息

$ openstack baremetal node firmware list <node-uuid>
+----+-----------+-----------------------+-----------------------+-----------------------+----------------------------+----------------------------+
| ID | Component | Initial Version       | Current Version       | Last Version Flashed  | created_at                 | Updated At                 |
+----+-----------+-----------------------+-----------------------+-----------------------+----------------------------+----------------------------+
|  1 | bios      | v1.0.0.0 (01.02.2022) | v1.2.3.4 (01.02.2023) | v1.2.3.4 (01.02.2023) | 2023-02-01T09:00:00.000000 | 2023-03-01T10:00:00.000000 |
+----+-----------+-----------------------+-----------------------+-----------------------+----------------------------+----------------------------+
|  2 | bmc       | v1.0.0                | v1.0.0                |                       | 2023-02-01T09:00:00.000000 |                            |
+----+-----------+-----------------------+-----------------------+-----------------------+----------------------------+----------------------------+

RPC API 影响

  • 无 - 我们已经有 do_node_clean

驱动程序 API 影响

将提供一个新的接口 FirmwareInterface,供驱动程序实现固件更新。将提供以下方法

  • update(settings) - 这是负责更新节点中组件固件的步骤。 settings 参数是一个字典列表

[{"component": "bmc", "url":"<url_new_bmc_fw>"},
 {"component": "bios", "url":"<url_new_bios_fw>"}]
  • cache_firmware_information() - 此方法将被调用以更新 firmware_information 数据库表中的固件信息。它将存储节点的固件信息,或者在调用 update 步骤时更新信息。

Nova 驱动程序影响

Ramdisk 影响

  • 目前对 ramdisk 没有影响,因为我们将专注于 OOB 升级,将创建当前接口以便它可以处理带内升级。

安全影响

其他最终用户影响

可扩展性影响

性能影响

  • 固件更新可能会延长节点上手动清理所需的时间。

其他部署者影响

  • ironic.conf 中新的配置选项

    • enabled_firmware_interfaces:一个启用的固件接口列表。

    • default_firmware_interface:要使用的默认固件接口。

  • 运维人员可以将新的步骤作为手动清理任务的一部分使用。

开发人员影响

  • 开发人员可以为各自的驱动程序实现 FirmwareInterface

实现

负责人

主要负责人:* <iurygregory, imelofer@redhat.comiurygregory@gmail.com>

其他贡献者:* <dtantsur, dtantsur@protonmail.com> * <janders, janders@redhat.com>

工作项

  • 在 Node 对象中添加 firmware_interface 字段

  • 创建 Firmware 对象

  • 创建 FirmwareInterface 结构。包括 redfish 实现

  • 实现 no-firmwarefake 用于 FirmwareInterface

  • 创建 REST API

  • 实现 OSC baremetal CLI 更改

依赖项

  • 此功能仅针对支持 Redfish 的硬件。

测试

  • 将为代码添加单元测试。

  • 将使用假驱动程序添加 Tempest 测试。

升级和向后兼容性

  • 在驱动程序中没有 FirmwareInterface 支持时引发错误。

文档影响

  • 将提供关于如何使用的新文档。

参考资料