BIOS 配置的硬件接口¶
https://bugs.launchpad.net/ironic/+bug/1712032
该提案旨在创建一个用于 BIOS 自动化配置的新硬件接口,并提供一种方法将 BIOS 配置作为手动清理过程的一部分[0]。
问题描述¶
提议的变更¶
在节点注册并可用基本硬件信息后,操作员可以定义 BIOS 配置。
操作员将能够使用在新的
BIOSInterface上定义的清理步骤,为特定节点设置 BIOS 配置。要更改的 BIOS 设置将以 JSON 字典的形式作为参数传递给清理步骤。目前,此清理步骤将是手动步骤,但将来可以扩展为自动清理步骤。类似于 RAIDInterface,该提案提出一个新的硬件接口,名为
BIOSInterface,它将用于硬件类型的带外 BIOS 配置。将其命名为 BIOSInterface 并不意味着该规范特定于 BIOS 系统,而是适用于 BIOS、UEFI 等系统的通用接口名称。请参阅驱动程序 API 影响,了解将为此接口添加的方法列表。注意
选择 BIOS 而不是其他的原因是很难找到适用于所有系统的适当名称,并且 BIOS 被认为足够接近。
在从注册到可管理状态的过程中,将验证 BIOS 配置的凭据,这些凭据将重用
driver_info中的现有凭据。如果不存在,将创建一个新的数据库表
bios_settings,并且在进入_do_node_clean中的清理步骤时,将检索并更新节点的当前 BIOS 设置,这意味着它将对手动和自动清理都调用。在裸机上成功应用给定的 BIOS 选项后,它将使用应用后的更改更新缓存的 BIOS 设置。此接口将不可用于任何经典驱动程序。经典驱动程序将为此接口抛出 ‘UnsupportedDriverExtension’ 错误。
如果节点没有 BIOS 接口(即 bios_interface=’no-bios’),则尝试更改 BIOS 配置将导致找不到清理步骤错误。
备选方案¶
操作员可以根据需要手动更改 BIOS 配置。但这必须为每个节点完成,这既耗时又容易出错。
数据模型影响¶
与 RAID 配置 [3] 不同,目标 BIOS 设置将作为参数传递给清理步骤,而不是存储在数据库中。
当前的 BIOS 配置将被缓存,并存储在一个单独的 BIOS 表中。将添加以下数据库表和字段
将添加一个名为
bios_settings的新表,其中包含以下字段node_id
Integer
PrimaryKeyConstraint
ForeignKeyConstraint(‘nodes.id’)
name
字符串
PrimaryKeyConstraint
value
字符串
created_at
DateTime
updated_at
DateTime
它将存储从节点检索到的缓存 BIOS 信息,并在 BIOS 设置更改时进行更新。当添加新记录或更新现有记录时,将相应地更新 ‘created_at’ 和 ‘updated_at’ 字段。
node.bios_interface将添加到节点表,它将包含我们希望用于 BIOS 自动化的硬件接口。将添加新的对象
ironic.objects.bios.BIOSSetting和ironic.objects.bios.BIOSSettingList到对象模型。BIOSSetting和BIOSSettingList字段将在 Python 对象模型中按需填充。
状态机影响¶
在从注册到可管理状态的过程中,将验证凭据以确保用户具有访问 BIOS 配置的适当权限。
REST API 影响¶
建议在 BIOSInterface 上实现两个新的清理步骤
bios.factory_reset。它将触发给定节点的 BIOS 设置恢复出厂设置。例如
{ "target":"clean", "clean_steps": [{ "interface": "bios", "step": "factory_reset" }] }
bios.apply_configuration。它将设置给定节点的 BIOS 设置。例如
{ "target":"clean", "clean_steps": [{ "interface": "bios", "step": "apply_configuration", "args": { "settings": [ { "name": <name>, "value": <value> }, { "name": <name>, "value": <value> } ] } }] }
将引入一个新的 REST API 来获取节点的缓存 BIOS 配置
GET /v1/nodes/<node_ident>/bios
该操作将返回当前缓存的设置,数据模式如下
{ "bios": [ { "links": [ { "href": "http://127.0.0.1:6385/v1/nodes/<node_ident>/bios/<name>", "rel": "self" }, { "href": "http://127.0.0.1:6385/nodes/<node_ident>/bios/<name>", "rel": "bookmark" } ], "name": <name>, "value": <value> }, { "links": [ { "href": "http://127.0.0.1:6385/v1/nodes/<node_ident>/bios/<name>", "rel": "self" }, { "href": "http://127.0.0.1:6385/nodes/<node_ident>/bios/<name>", "rel": "bookmark" } ], "name": <name>, "value": <value> } ] }
如果驱动程序不支持 BIOS 配置,API 将返回 HTTP 400(错误请求);如果节点 BIOS 尚未配置,则返回 HTTP 404(资源未找到)。否则,它将返回 HTTP 200(确定)。
要获取节点的指定 BIOS 设置
GET /v1/nodes/<node_ident>/bios/<setting name>
该操作将返回指定的 BIOS 设置,数据模式如下
{ "<setting name>": { "name": <setting name>, "value": <value> } }
客户端 (CLI) 影响¶
“ironic” CLI¶
ironic CLI 将不会更新。
“openstack baremetal” CLI¶
使用 node-uuid 检索缓存的 BIOS 配置
$ openstack baremetal node bios setting list <node-uuid>
使用 node-uuid 显示指定的 BIOS 设置
$ openstack baremetal node bios setting show <node-uuid> <setting-name>
BIOS 接口的验证结果将通过标准的验证接口返回。
RPC API 影响¶
无
驱动程序 API 影响¶
将为驱动程序提供一个新的 BIOSInterface,以允许它们实现 BIOS 配置。接口中将有几个新方法和清理步骤
do_factory_reset()- 此方法在驱动程序支持的情况下,将所有 BIOS 设置重置为出厂默认值。一旦重置操作成功,它还将更新bios_settings数据库表的记录为已知的默认值。厂商决定将设置的 BIOS 默认设置。factory_reset()- 此清理步骤将把实际的重置工作委托给抽象方法do_factory_reset()。操作员可以选择将其作为手动清理步骤的一部分调用。相应的手动清理步骤将是
bios.factory_reset。do_apply_configuration(configuration={})- 此驱动程序实现将从配置字典中获取设置,并将应用到裸机上的 BIOS 配置。驱动程序负责在应用设置之前进行相应的验证,以及/或在设置无效的 BIOS 配置时管理失败。此方法需要在第一次失败时回滚以前的设置。如果需要密码来更新 BIOS 配置,它将从driver_info属性中获取。实现细节取决于驱动程序。apply_configuration(configuration={})- 此清理步骤将把实际的配置工作委托给抽象方法do_apply_configuration(configuration={})。操作员可以选择将其作为手动清理步骤的一部分调用。相应的手动清理步骤将是
bios.apply_configuration。cache_bios_settings()- 此方法将在bios_settings数据库表中更新 BIOS 配置。它将尝试获取当前的 BIOS 设置并将它们存储在bios_settings数据库表中。它还将相应地更新 ‘created_at’ 和 ‘updated_at’ 时间戳字段。实现细节取决于驱动程序,例如,是否使用子方法共享do_factory_reset、do_apply_configuration和cache_bios_settings以检索和保存bios_settings表中的 BIOS 信息。
Nova 驱动程序影响¶
无
Ramdisk 影响¶
无
安全影响¶
对 BIOS 配置的未授权访问可能会暴露敏感的 BIOS 信息和可配置的 BIOS 选项给攻击者,这可能导致破坏性后果。建议这种能力仅限于管理角色。更改 BIOS 设置需要凭据,这些凭据将重用 driver_info 中的现有凭据,而不是创建新的字段。
其他最终用户影响¶
无
可扩展性影响¶
无
性能影响¶
BIOS 配置可能会延长节点上手动清理所需的时间。
其他部署者影响¶
添加新的配置选项
enabled_bios_interfaces:一个启用的 BIOS 接口列表。default_bios_interface:要使用的默认 BIOS 接口。
操作员可以使用
bios.apply_configuration和bios.factory_reset作为手动清理任务来执行 BIOS 管理。
开发人员影响¶
开发人员可以为各自的驱动程序实现 BIOSInterface。
实现¶
负责人¶
- 主要负责人
zshi yroblamo
工作项¶
在 Node 对象中添加 BIOS 接口字段。
创建数据库模型和 API,用于节点 BIOS 表和操作。
创建
BIOSInterface,其中包括以下项目在
BIOSInterface基本驱动程序中添加新的方法,例如do_apply_configuration、do_factory_reset和cache_bios_settings。在
BIOSInterface基本驱动程序中添加新的清理步骤,例如apply_configuration、factory_reset。在进入
_do_node_clean中的清理步骤时,添加缓存 BIOS 配置。
从
BIOSInterface派生创建“假”和“无 BIOS”实现。创建 BIOS 配置的 REST API 端点。
创建 BIOS 配置的 RPC 对象。
实现 OSC 裸机 CLI 更改。
依赖项¶
无
测试¶
将为代码添加单元测试。将提供带有
do_apply_configuration方法的BIOSInterface的“假”实现,用于测试目的,并且可以作为手动清理的一部分运行。每个驱动程序负责提供第三方 CI 来测试 BIOS 配置。
将使用假驱动程序添加 Tempest 测试。
升级和向后兼容性¶
在驱动程序中不支持 BIOSInterface 时引发错误。
文档影响¶
将提供有关如何配置节点以进行 BIOS 的文档。
将更新 API 参考。
各自的厂商应记录默认 BIOS 值以供参考。