经典驱动程序的未来¶
https://bugs.launchpad.net/ironic/+bug/1690185
本文档讨论了在 Ocata 周期中实施驱动程序组合改革之后,经典驱动程序的未来。本文档中的术语遵循该规范中的术语。
问题描述¶
我们不希望长期维护两种构建驱动程序的方法。这会增加源代码的复杂性(例如,参见 driver_factory.py)以及第三方 CI 的测试量。
提议的变更¶
此变更涵盖多个周期
Pike
在 Pike 周期中,硬件类型和经典驱动程序将作为编写驱动程序的同样受支持的方式共存。
动态驱动程序和所有相关 API 被认为是稳定且可用于生产环境的。
注意
在 Ocata 版本说明中,我们将相关的 API 添加标记为实验性的。
不再接受树中的经典驱动程序。
不会向现有的经典驱动程序添加新的接口。
现有的经典驱动程序中的接口实现不会被更改。
我们建议供应商提供与其现有经典驱动程序类似的硬件类型。第三方 CI 应该提供对所有受支持的引导、部署、管理和电源接口组合的完整覆盖。供应商决定使用经典驱动程序还是硬件类型来实现这一点。
Queens
在 Queens 周期中,我们将弃用经典驱动程序。
我们将要求供应商提供与其现有经典驱动程序类似的硬件类型。供应商可以选择要支持的接口组合。但是,如果可能,建议继续支持标准的部署和检查接口实现。
第三方 CI 必须覆盖所有硬件类型以及引导、部署、管理和电源接口的所有受支持组合。第三方 CI 可以在硬件类型覆盖其功能时停止覆盖受支持的经典驱动程序。
经典驱动程序机制将被弃用,加载任何经典驱动程序(树内或树外)将导致弃用警告。
enable_drivers配置选项也将被弃用。注意
在 Queens 版本中,我们将继续对经典驱动程序运行常规 CI。
现有的(树内)经典驱动程序将仅接收与经典接口相关的关键错误修复(即,它们仍然会受到硬件类型共享的接口实现中修复的影响)。
大部分上游 CI 将在动态驱动程序(
ipmi、snmp和redfish)上运行。独立的作业将为经典驱动程序提供覆盖。Grenade 将测试从经典驱动程序(例如,pxe_ipmitool)到硬件类型(例如,ipmi)的切换。弃用
-t/--type参数到python-ironicclient中的驱动程序列出命令。注意
本提案的范围之外是弃用或删除驱动程序列出 API 中的
type参数。扩展升级文档,包含受支持的经典驱动程序与其关联的硬件类型和硬件接口组合的完整映射。明确提及供应商决定不提供新对应物的经典驱动程序,以及建议用于这些驱动程序的替代方案。
更新整个文档,仅提及硬件类型,除了驱动程序特定文档和上述解释的升级文档部分。
作为
online_data_migration命令的一部分,提供自动迁移到硬件类型 - 参见 自动迁移。注意
我们决定不在节点创建和更新 API 中提供 API 级别的任何自动迁移。这样做需要我们永远维护经典驱动程序和相应硬件类型/接口之间的映射。如果节点创建请求的结果与结果不同,这也可能让操作员感到困惑。
Rocky
在 Rocky 版本中,删除了对经典驱动程序的支持。
删除所有树内的经典驱动程序。
删除从 driver_factory.py 加载经典驱动程序的支持。
删除
enable_drivers配置选项。删除经典驱动程序的 CI 覆盖。
删除
-t/--type参数到python-ironicclient中的驱动程序列出命令。当请求
classic类型时,更新驱动程序列出 API 以始终返回空结果。
自动迁移¶
为了简化操作员的过渡,使 Queens 版本的 online_data_migration 自动更新节点。
使用新的类方法扩展 BaseDriver
@classmethod def to_hardware_type(cls): """Return corresponding hardware type and hardware interfaces. :returns: a tuple with two items: * new driver field - the target hardware type * dictionary containing interfaces to update, e.g. {'deploy': 'iscsi', 'power': 'ipmitool'} """
例如,对于
agent_ipmitool驱动程序@classmethod def to_hardware_type(cls): if CONF.inspector.enabled: inspect_interface = 'inspector' else: inspect_interface = 'no-inspect' return 'ipmi', {'boot': 'pxe', 'deploy': 'direct', 'inspect': inspect_interface, 'management': 'ipmitool', 'power': 'ipmitool', 'raid': 'agent'}
更新
online_data_migrations以接受以下形式的迁移选项:--option <MIGRATION NAME><KEY>=<VALUE>。它们将作为关键字参数传递给与提供的名称匹配的迁移。使用
migrate_to_harware_types新迁移更新online_data_migrations命令。它将接受一个选项reset_unsupported_interfaces,这是一个布尔值,默认值为False。迁移将执行以下操作加载
ironic.drivers入口点中的所有经典驱动程序类(但不实例化它们)。对于每个经典驱动程序
使用
DriverClass.to_hardware_type计算所需的更改。除了
boot、deploy、management和power之外,缺失的接口默认为其无操作实现(no-***)。注意
我们认为
boot、deploy、management和power是强制性的,因为它们没有无操作实现。如果硬件类型不在
enabled_hardware_types中,则发出警告并跳过所有使用此经典驱动程序的节点。如果任何接口未启用(不在
enabled_***_interfaces中)如果此接口是
boot、deploy、management或power中的一个,或者如果reset_unsupported_interfaces为False,则发出警告并跳过节点。否则,尝试将其重置为其无操作实现(
no-***)。
更新数据库中的节点记录。
注意
由于迁移的幂等性,操作员可以在修复警告后重新运行此命令以更新跳过的节点。
在 Rocky 周期中,更新
dbsync命令,检查是否有任何节点正在使用经典驱动程序。由于经典驱动程序列表将不可用(它们将被从树中删除),因此维护树中曾经存在的经典驱动程序名称列表,并对照此列表检查节点。在 Rocky 之后的版本中删除此检查。
备选方案¶
永远保留经典驱动程序。使维护复杂化,原因不明。
在 Pike 周期开始弃用。我们希望在开始弃用之前,硬件类型得到完全支持至少一个周期。在这种情况下,我们必须赶在 Pike 结束前让供应商创建和支持他们的硬件类型。
数据模型影响¶
无
状态机影响¶
无
REST API 影响¶
由于我们设计 驱动程序组合改革 的方式,从 API 角度来看,动态驱动程序看起来与经典驱动程序非常相似。
我们可以弃用驱动程序列出 API 中的 type 参数。但是,
API 弃用很难沟通,
由于 API 版本控制,我们仍然需要永远支持它。
因此,本规范没有提出弃用 API 中的任何内容。
客户端 (CLI) 影响¶
“ironic” CLI¶
在 Queens 周期中弃用 -t 参数到 driver-list 命令,并在 Rocky 中删除它。
“openstack baremetal” CLI¶
在 Queens 周期中弃用 --type 参数到 baremetal driver list 命令,并在 Rocky 中删除它。
RPC API 影响¶
无
驱动程序 API 影响¶
在 Queens 版本中,所有经典驱动程序都将表现得好像它们具有
supported = False。在 Rocky 版本中,将删除加载经典驱动程序的支持。
BaseDriver将与BareDriver合并,driver_factory.py 中的代码将得到实质性的简化。
Nova 驱动程序影响¶
无
Ramdisk 影响¶
无
安全影响¶
无
其他最终用户影响¶
Ironic 的用户必须在升级到 Rocky 之前将他们的部署切换到硬件类型。
可扩展性影响¶
无
性能影响¶
无
其他部署者影响¶
参见 升级和向后兼容性。
开发人员影响¶
树外的经典驱动程序将无法与 Rocky 版本的 Ironic 配合使用。
实现¶
负责人¶
- 主要负责人
Dmitry Tantsur (IRC: dtantsur, LP: divius)
工作项¶
参见 拟议的变更 以获取非常详细的细分。
依赖项¶
无
测试¶
从 Queens 版本开始,我们的 CI 将主要测试硬件类型。
我们将修改测试 Pike -> Queens 升级的 Grenade 作业,在升级期间将 *_ipmitool 切换到 ipmi。
升级和向后兼容性¶
删除驱动程序和经典驱动程序机制将是一个破坏性更改,必须相应地进行沟通。
操作员必须在 Queens 版本中启用适当的硬件类型和硬件接口。
文档影响¶
升级指南将更新,以解释从经典驱动程序到硬件类型的转换,并提供示例和旧驱动程序与新驱动程序之间的映射。