添加关于资源 CRUD 和节点状态的通知

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

本规范建议为 ironic 添加新的通知:资源的 CRUD(创建、更新或删除)以及配置状态、维护状态和控制台状态的节点状态更改。

问题描述

像 Searchlight 这样的资源索引服务 [1] 需要关于资源创建、更新或删除的通知。目前 ironic 中没有实现 CRUD 通知。在没有这些通知的情况下,创建 Searchlight 的高效插件是不可能的。Ironic 节点关于配置状态、维护状态和控制台状态的通知也可以被 Searchlight 插件使用,以便保持 Searchlight 的 ironic 资源索引的最新状态。

除了 searchlight 之外,还有一种监控服务的用例,它会缓存所有通知负载以及事件类型,例如 start/end/error/<etc>,操作员可以查询此服务以查看 ironic 是否行为正常。例如,如果节点创建的 start 通知比 end 通知多得多,则可能意味着数据库行为不正常,或者消息传递在 API 和 conductor 之间传递消息时遇到困难。这与 searchlight 的情况不同:例如,searchlight 不需要知道节点创建 start 通知中的负载,因为此时还没有实际的节点,但对于监控目的,它可能很有用。

提议的变更

作为所有 CRUD 通知的一般说明,*.start*.error 事件负载将被 Searchlight 忽略,因为在两种情况下,这意味着资源表示形式没有更改,或者在 *create* 通知的情况下,资源未被创建。

节点 CRUD 通知

将添加以下事件类型

  • “baremetal.node.create.start”;

  • “baremetal.node.create.end”;

  • “baremetal.node.create.error”;

  • “baremetal.node.update.start”;

  • “baremetal.node.update.end”;

  • “baremetal.node.update.error”;

  • “baremetal.node.delete.start”;

  • “baremetal.node.delete.end”;

  • “baremetal.node.delete.error”。

优先级 - INFO 或 ERROR(对于“error”状态)。负载包含来自基本 NodePayload 的所有字段,以及附加字段:chassis_uuidinstance_infodriver_info。节点字段中的密钥将被屏蔽。raid_configtarget_raid_config 字段将被排除,因为它们可能包含低级磁盘和供应商信息。如果/当有它们的用例时,可以在未来添加它们。所有这些通知都将在 API 级别实现。

端口 CRUD 通知

将添加以下事件类型

  • “baremetal.port.create.start”;

  • “baremetal.port.create.end”;

  • “baremetal.port.create.error”;

  • “baremetal.port.update.start”;

  • “baremetal.port.update.end”;

  • “baremetal.port.update.error”;

  • “baremetal.port.delete.start”;

  • “baremetal.port.delete.end”;

  • “baremetal.port.delete.error”。

优先级 - INFO 或 ERROR(对于“error”状态)。负载包含这些字段:uuidnode_uuidaddressextralocal_link_connectionpxe_enabledcreated_atupdated_at。这些通知将在 API 级别实现。此外,“baremetal.port.create.*” 将由 ironic-conductor 服务在驱动程序创建端口时发出(示例是 [2][3])。

机箱 CRUD 通知

将添加以下事件类型

  • “baremetal.chassis.create.start”;

  • “baremetal.chassis.create.end”;

  • “baremetal.chassis.create.error”;

  • “baremetal.chassis.update.start”;

  • “baremetal.chassis.update.end”;

  • “baremetal.chassis.update.error”;

  • “baremetal.chassis.delete.start”。

  • “baremetal.chassis.delete.end”。

  • “baremetal.chassis.delete.error”;

优先级 - INFO 或 ERROR(对于“error”状态)。负载包含这些字段:uuidextradescriptioncreated_atupdated_at。所有这些通知都将在 API 级别实现。

节点配置状态通知

将通过 TaskManager 方法实现(并由 ironic-conductor 服务发出)。

节点配置状态的事件类型

  • “baremetal.node.provision_set.start”;

  • “baremetal.node.provision_set.end”;

  • “baremetal.node.provision_set.error”;

  • “baremetal.node.provision_set.success”。

ironic 中状态更改的类型以及相应的事件

  • 启动转换,生成工作线程:“start”通知,INFO 级别。

  • 结束转换,清理 target_provision_state:“end”通知,INFO 级别。

  • 错误事件处理:“error”通知,ERROR 级别。

  • 更改 provision_state 而不启动非“end”或“error”的工作器:“success”通知,INFO 级别。示例是 DEPLOYING <-> DEPLOYWAIT,AVAILABLE -> MANAGEABLE。

负载包含来自基本 NodePayload 的所有字段,以及附加字段:instance_infoprevious_provision_stateprevious_target_provision_stateevent(触发状态更改的 FSM 事件)。为了有效地使用配置状态通知,所有相关的节点更改(例如设置 last_errormaintenance)都应在事件处理之前完成。

节点维护通知

将添加以下事件类型

  • “baremetal.node.maintenance_set.start”;

  • “baremetal.node.maintenance_set.end”;

  • “baremetal.node.maintenance_set.error”。

优先级 - INFO 或 ERROR(对于“error”状态)。负载包含来自基本 NodePayload 的所有字段。所有这些通知都将在 API 级别实现,并反映由于用户请求而对节点进行的维护更改。不会对 ironic 内部完成的维护更改发出任何显式的节点维护通知。由于这些内部更改是尝试更改节点状态(例如配置、电源)的结果,因此发出的其他通知之一将“涵盖”这些内部维护更改。

节点控制台通知

将添加以下事件类型

  • “baremetal.node.console_set.start”;

  • “baremetal.node.console_set.end”;

  • “baremetal.node.console_set.error”;

  • “baremetal.node.console_restore.start”;

  • “baremetal.node.console_restore.end”;

  • “baremetal.node.console_restore.error”。

console_set 操作用于通过 API 请求启动或停止控制台时,console_restore 操作用于 console_enabled 标志已在数据库中为节点启用,并且需要通过驱动程序重新启动控制台(由于死掉或重新启动的 ironic-conductor 进程)。优先级 - INFO 或 ERROR(对于“error”状态)。负载包含来自基本 NodePayload 的所有字段。所有这些通知都将在 ironic-conductor 中实现,因为设置节点的控制台是一个异步请求,因此 ironic-conductor 可以轻松发出更改的 start/end 通知。

备选方案

定期通过 API 轮询 ironic 资源。

数据模型影响

状态机影响

REST API 影响

客户端 (CLI) 影响

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

安全影响

其他最终用户影响

可扩展性影响

如果启用了通知,它们可能会在大型环境中的节点部署期间对消息总线造成高负载。

性能影响

其他部署者影响

部署人员应正确设置现有的 notification_level 配置选项。

开发人员影响

  • 如果开发人员在驱动程序中创建资源,应发出适当的通知。

  • 对于配置状态更改,所有相关的节点更新都应在事件处理之前完成。

实现

负责人

主要负责人
  • yuriyz

其他贡献者
  • vdrok

  • mariojv

工作项

  • 实现节点配置状态更改通知。

  • 实现 CRUD 通知和节点维护通知。

  • 实现控制台通知。

  • 将通知添加到当前在驱动程序中创建资源的 ironic 代码中。

  • 修复事件处理后的节点更新的 ironic 代码。

依赖项

带有基本 NodePayload 的补丁 [4]

测试

将添加单元测试。

升级和向后兼容性

文档影响

将记录新的通知功能。

参考资料