ironic-python-agent API 版本控制和协商

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

在 ironic newton 中期会议上决定,我们需要 ironic 和 IPA 之间进行某种形式的 API 版本协商。这是为了允许 ironic 识别它正在与较旧的 ramdisk 通信,并且较新的功能将不可用。

问题描述

在 ironic 升级过程中,可能会出现节点使用 ironic-python-agent (IPA) 版本低于 ironic 版本的状况。在这种情况下,ironic 会期望存在已添加到 ironic 和 IPA 的较新功能,但是由于节点上使用的 ramdisk 尚未升级,因此这些功能在 IPA 的该版本中不存在。这会导致失败,因为 ironic 在部署/清理过程中尝试使用这些功能,并导致来自 IPA 的意外响应。

提议的变更

建议的更改是,当 IPA 向 ironic 发送心跳时,它将包含一个 IPA 版本号,ironic 将将其缓存到节点的 driver_internal_info 中,就像存储 Agent URL 一样。ironic 然后将使用此版本信息来优雅地降低它从 ironic-python-agent 使用的功能集。例如

def do_something_using_IPA(self)
  # Make sure to refresh the node object in case agent_version has changed
  # via a heartbeat since we first fetched the node.
  node = self.node.refresh()
  if node.driver_internal_info.get('agent_version', '0.0.0') >= '1.2':
    do_new_additional_thing_only_supported_in_1.2()
  do_thing_using_IPA()

备选方案

存在几种替代方案

  • 要求操作员在升级 ironic 安装之前,将每个节点的 ramdisk 更新到包含新功能的较新版本。

  • 处理 IPA 不支持特定功能的情况,方法是在具体情况下捕获一组预期的错误,并优雅地回退到另一种方法。但是,在发生这种情况时,会导致 Ironic 中更复杂的错误处理和额外的 API 调用到 IPA。

数据模型影响

新的 agent_version 字段将在 agent 心跳时存储在 node.driver_internal_info 中。

状态机影响

在现有代码中,清理步骤会检查 IPA 硬件管理器版本,如果该版本在清理过程中发生任何更改,则清理将被中止并需要重新启动。此规范添加的 agent 版本应以相同的方式处理,以确保最稳定的清理环境。

REST API 影响

一个新的字段 agent_version 将包含在心跳 API 请求的主体中,以及现有的 agent_url 字段。

客户端 (CLI) 影响

“ironic” CLI

“openstack baremetal” CLI

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

IPA 需要更新,以便在发出心跳请求时,在 agent_version 字段中包含其当前版本。

安全影响

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

此更改将允许升级 ironic 安装的部署者异步地升级其节点的 ironic-python-agent ramdisk,而无需升级 ironic 的其余部分。

开发人员影响

与 ironic-python-agent 交互的 ironic 驱动程序开发人员需要确保他们的代码考虑到他们可能正在与之通信的 agent 版本。确保在与不支持该功能的 IPA 通信时,在 ironic 中禁用该功能。

实现

负责人

主要负责人

sambetts

工作项

  • 在 IPA 中添加代码,以便在心跳请求中将其版本发送到 ironic

  • 在 ironic 中添加代码,以便在接收到心跳时接受并存储 agent_version

  • 添加开发人员文档,说明如何在 ironic 中正确添加对 IPA 功能的支持,以便在不可用时可以优雅地降级。

依赖项

测试

  • ironic grenade 测试已经测试了 ironic master 与最新命名的 release IPA

  • 常规 ironic/IPA 测试将测试 ironic master + IPA master 构建

  • 需要向 IPA 添加一个 grenade 测试,以测试最新的 ironic 命名 release + master IPA

升级和向后兼容性

  • 此规范增加了更好地支持 Ironic 版本 N+1 与 IPA 版本 N 或更旧版本的能力,因为 Ironic 将优雅地降低它请求的功能,如果它们不可用

  • Ironic 版本 N 与 IPA 版本 N+1 协同工作,并且应该继续工作

文档影响

  • 需要添加工作项部分中提到的开发人员文档

  • 需要记录支持的 IPA 版本与 ironic 版本之间的对应关系。

参考资料