添加关于资源 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_uuid、instance_info、driver_info。节点字段中的密钥将被屏蔽。raid_config 和 target_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”状态)。负载包含这些字段:uuid、node_uuid、address、extra、local_link_connection、pxe_enabled、created_at、updated_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”状态)。负载包含这些字段:uuid、extra、description、created_at、updated_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_info、previous_provision_state、previous_target_provision_state、event(触发状态更改的 FSM 事件)。为了有效地使用配置状态通知,所有相关的节点更改(例如设置 last_error、maintenance)都应在事件处理之前完成。
节点维护通知¶
将添加以下事件类型
“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]。
测试¶
将添加单元测试。
升级和向后兼容性¶
无
文档影响¶
将记录新的通知功能。