支持裸机检查中止

https://bugs.launchpad.net/ironic/+bug/1703089

本规范旨在支持从 ironic API 中中止节点检查。 此规范的继续需要 inspect wait 状态的依赖关系 [1]

问题描述

目前,我们无法从 ironic API 中中止节点检查过程。 当节点未在检查网络下正确设置时,管理员只能等待它在指定超时后失败,或者从 ironic inspector API/CLI 中中止检查过程(如果使用带内检查接口 inspector)。

虽然检查状态会通过周期性任务同步到 ironic,但对于从 ironic 发起的、然后由 inspector 停止的操作,它并不一致,此外,这会产生一点时间延迟。 在下一个状态同步之前,节点状态在 ironic 和 inspector 之间不一致。 ironic-inspector 状态同步的默认时间间隔为 60 秒,具体取决于用户配置而有所不同。

提议的变更

在状态机中添加 inspect waitinspect failed 的状态转换,添加对 ironic 的支持,允许在节点处于 inspect wait 状态时请求 abort 动词。

InspectInterface 中添加一个名为 abort 的方法,以便检查接口可以提供实现来支持检查中止。 默认行为是引发 UnsupportedDriverExtension 异常。 为 inspector 检查接口实现中止操作。

当从 ironic API 请求中止操作,并且节点处于 inspect wait 状态时,ironic 调用驱动程序 API 的检查接口中的 abort 方法,如果该方法执行成功,则将节点状态移动到 inspect failed

请注意,对 ironic-inspector 的中止请求是异步的,ironic 将在接受请求 (202) 后将节点移动到 inspect failed,而不管 ironic-inspector 处的操作是否执行成功。 这通过在 ironic-inspector 端处理故障来降低此功能的复杂性。

从 ironic-inspector 的角度来看,每个检查请求都会刷新节点的本地缓存,这确保了在开始节点检查时节点状态同步。 但是,如果接受了中止请求但在 ironic-inspector 处未成功执行,则会存在不一致的节点状态。 此不一致性将在 ironic-inspector 节点缓存清理超时时消除。

涉及的更改是

  • 在基本检查接口 (InspectInterface) 中添加一个名为 abort() 的方法。

  • inspector 检查接口实现 abort()

  • 实现 ironic 处理当置备状态为 inspect waitabort 动词的逻辑。

备选方案

  • 在指定超时值后等待 inspect fail

  • 通过 ironic-inspector api 或 openstack baremetal introspection abort 命令请求。 请注意,只有在使用 ironic inspector 作为检查接口时才可行。 其他检查接口(如带外检查)可能采用不同的方法来实现相同目标,这超出了本规范的范围。

数据模型影响

状态机影响

添加 inspect waitinspect failed 的状态转换,事件为 abort,添加到 ironic 状态机。

REST API 影响

修改置备状态 API 以支持本规范中描述的转换。 API 微版本将增加。 对于使用早期微版本的客户端,当节点处于 inspect wait 状态时,不允许使用 abort 动词。

  • PUT /v1/nodes/{node_ident}/states/provision

    • abort 处于 inspecting 状态的节点相同的 JSON Schema

      {
        "target": "abort"
      }
      
    • 对于使用早期微版本的客户端,返回 406 (Not Acceptable)

    • 对于使用受支持微版本的客户端

      • 如果请求已接受,则返回 202 (Accepted)

      • 如果当前检查接口不支持中止,则返回 400 (Bad Request)

客户端 (CLI) 影响

“ironic” CLI

“openstack baremetal” CLI

RPC API 影响

驱动程序 API 影响

将在 base.py 中的 InspectInterface 中添加一个新方法 abort,默认行为是引发异常 UnsupportedDriverExtension

def abort(self, task):
    raise exception.UnsupportedDriverExtension(
        driver=task.node.inspect_interface,
        extension='abort')

Nova 驱动程序影响

Ramdisk 影响

安全影响

其他最终用户影响

可扩展性影响

对于大量处于检查状态的多个节点,在发生检查重试时,可以减少一点时间成本。

性能影响

其他部署者影响

部署者可以通过 ironic API/CLI 中止硬件内省,除了 inspector API/CLI 之外,对于使用 inspector 作为(带内)检查接口的节点。

开发人员影响

实现

负责人

主要负责人

kaifeng

工作项

  • 添加通过 abortinspect wait 转换为 inspect failed 的转换。

  • 将一个新方法 abort() 添加到基本检查接口。

  • 将中止实现添加到 ironic inspector.Inspector

  • 在 ironic conductor 中实现中止逻辑。

依赖项

测试

将添加 Tempest 测试来测试 REST API 的更改。

升级和向后兼容性

为了向后兼容,API 将被更新。 使用此功能之前版本的客户端请求的处理方式相同。

文档影响

相关文档和状态机图将相应更新。

参考资料