获取步骤

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

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

在 Ironic 中,我们有一个步骤的概念 [1],这些步骤需要在 conductor 中运行的驱动程序代码和在 ironic-python-agent 内部运行的代码的结合下执行,以完成一项任务。

为了使其有用,我们必须能够提高 API 最终用户可执行内容的可视性。目前,用户只能依赖文档以及包括可以加载的模块的代码状态。

这个问题的复杂性进一步加剧,因为所有步骤的列表是来自管理节点的 ironic-conductor 进程和在节点上执行的 ironic-python-agent 进程识别的信息的集合。

注意

此文档目前在待办事项列表中,因为此功能存在实现问题。有关更多信息,请参阅 Gerrit 变更 606199

问题描述

  • API 用户目前必须依赖步骤文档才能知道哪些步骤可用。

  • 不同的硬件管理器可能可用不同的步骤。

  • 随着部署步骤 [2] 框架的日益普及,预计新的步骤将在 Ironic 的新版本中添加。

  • 必须运行 ironic-python-agent 才能获取完整的步骤列表。

提议的变更

为了使此解决方案相对轻量级,需要进行四项基本更改才能促进可见性。

这不旨在通过创建其他进程来解决完全的可见性,而是旨在提供收集数据的工具,限制因素是我们只能返回当前可用信息。

如何做?

步骤 1

第一步是提供一个 API 端点,该端点返回在 conductor 中运行的节点可见的当前可用步骤列表。这将是一个 API 端点,到一个 RPC 方法,到一个 conductor 管理器方法,然后返回步骤列表,同时容忍 ironic-python-agent 不存在的情况。

注意

Ironic 社区的共识是此功能应缓存步骤并将其作为可供用户使用的步骤返回。

步骤 2

添加 hold 置备状态动词和 holding 状态。

注意

在一次特定的规划和讨论会议中,以确定此类功能的路径时,Ironic 社区达成共识,认为保留状态将很有用,并且可能可以独立于此待办事项规范中提出的 API 功能来实现。

初始状态

临时状态

可能的下一个动词

可管理

保留

管理、清理、提供、活动、检查

可用

保留

活动、管理、提供

使用该状态

  • 机器被移动到置备网络。

注意

这个转换存在一个小的缺陷,即要清理节点,实际上需要位于清理网络上。正如我们从救援功能中学到的那样,操作性地更改 DHCP 地址是存在问题的。

  • 部署 ramdisk 被启动。

  • 然后,ironic-python-agent 将保持运行状态,允许心跳(或被轮询),并且在先前的步骤中添加的 API 端点将获取可以执行的完整步骤列表。

备选方案

此解决方案的替代方案是提供一个异步 API 端点来执行步骤 2 中详细描述的步骤,并缓存数据,然后用户可以异步检索该数据。在这种情况下,用户必须轮询 API 以确定缓存的信息是否已更新。

这个难题是这必须受到状态的约束,这意味着我们仍然需要围绕此构建状态机状态来向用户表示当前操作。

数据模型影响

状态机影响

如上所述,我们将添加一个新的保留动词,这将允许返回到先前的状态。此 hold 动词仅可从 可管理可用 状态访问。

在此保留状态下,API 用户将能够请求与当前状态一致的逻辑后续步骤,如上表所示。

REST API 影响

返回的节点对象将暴露额外的 provision_state 状态,但是所有状态机影响都是已知的。

一个额外的置备状态目标动词 hold 以触发状态机更改。

将添加一个端点以允许 API 用户通过 RPC 接口和 conductor 返回已知步骤列表,这将作为 GET 请求触发。

注意

社区共识是,我们不应该发起同步调用 IPA 来收集数据,而应该返回缓存的数据并以某种方式触发缓存更新。

示例

GET /v1/nodes/{node_ident}/steps[?type=(clean|deploy)]
{
  [{"source": "conductor",
    "deploy": [
      {
        "interface": "deploy",
        "step": "deploy",
        "priority": 100,
      },
    ],
    "clean": [
      {
        "interface": "deploy",
        "step": "erase_devices",
        "reboot_requested": False,
        "priority": 10,
        "abortable": True,
      },
      {
        "interface": "bios",
        "step": "apply_configuration",
        "args": {....},
        "priority": 0,
      },
      {
        "interface": "raid",
        "step": "create_configuration",
        "args": {....},
        "priority": 0
      },
      {
        "interface": "raid"
        "step": "delete_configuration",
         "args": {....},
         "priority": 0
      }
    ]
  },
  {"source": "agent",
  ...
  }
  ]
}

如果请求了特定的 type,则请求将仅返回请求类型的步骤。如果未定义类型,则将把两组步骤都返回给调用者。

正常响应代码:200 预期错误代码

* 400 with malformed request
* 503 upon conductor error

注意

API 微版本将根据标准程序进行递增。

客户端 (CLI) 影响

“ironic” CLI

“openstack baremetal” CLI

将添加 openstack baremetal node stepsopenstack baremetal node hold 命令以促进返回此 api 暴露的数据。

RPC API 影响

需要添加一个新的 RPC 方法,名为 get_steps,该方法将支持一个参数,以指示 API 用户请求的步骤类型。

驱动程序 API 影响

Nova 驱动程序影响

此功能不需要任何内容。

也就是说,让正在保留的可用部署的节点能够被调度是有价值的。因此,它可以是一个可选的增强功能,可以节省部署过程中的大量时间。这可以通过允许 nova 考虑处于 holding 状态的节点可用于通过评估 target_provision_state 用于 holding 中的节点来部署来实现。这将是紧密耦合,但经常要求更快地部署,并且我们可以采取的路线是启用此类功能,即“保留以进行部署”。

Ramdisk 影响

安全影响

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Julia Kreger (TheJulia) <juliaashleykreger@gmail.com>

其他贡献者

?

工作项

  • 实现检索状态列表的 API。

  • 实现状态机更改,以允许空闲代理实例返回清理步骤数据。

  • 在 ironic-tempest-plugin 中添加 API 测试。

  • 更新状态机文档。

  • 添加管理员文档。

  • 更新 CLI 文档。

依赖项

测试

基本的 API 合同和状态测试足以支持此功能。

升级和向后兼容性

N/A,现有的滚动升级和 RPC 版本固定实践足以支持此功能。

文档影响

需要在管理员指南中添加更多详细信息。需要更新状态文档。更新客户端文档以获取新的状态动词。

参考资料