计算管理器对象支持 (Juno 工作)

https://blueprints.launchpad.net/nova/+spec/compute-manager-objects-juno

此蓝图代表 Juno 中围绕将计算管理器(以及相关的模块,如 nova.compute.utils)迁移到使用对象而不是原始 conductor 方法的剩余工作。 这很重要,因为对象提供了实际数据的版本控制,这支持我们的升级目标。

问题描述

nova 计算管理器仍然使用 conductor 和 compute RPC 方法发送未版本化的数据包,这在升级期间数据格式跨版本更改时会成为问题。 这对于计算管理器尤其重要,因为在某些时候它可能会与较新的 conductor 和计算节点通信。 在升级期间,预计会进行迁移和实时迁移操作,并且本质上会涉及运行不同版本代码的计算节点进行通信。

提议的变更

将计算管理器中原始 conductor 方法的使用迁移到对象。 例如,考虑以下情况

service_ref = self.conductor_api.service_get_by_compute_host(
        context, self.host)
self.conductor_api.compute_node_delete(context, service_ref['compute_node'])

将变为

service = service_obj.Service.get_by_compute_host(context,
                                                  self.host)
service.compute_node.destroy()

备选方案

这是解决此问题的项目接受的方向。 但是,替代方案包括

  1. 不解决问题并继续使用未版本化的数据

  2. 尝试在任何数据(包括嵌套的下游数据)发生更改时强制执行方法版本升级

数据模型影响

低级数据模型(即 SQLAlchemy 模型)不需要更改。 但是,可以根据需要添加额外的更高级对象,以围绕低级模型提供版本化的包装。

REST API 影响

无。

安全影响

无。

通知影响

通常,将代码转换为使用对象不会影响通知。 但是,在某些时候,通知的发出嵌入到对象方法中,以实现关于何时以及如何发送通知的更高一致性。 在这项工作中没有预料到此类更改,但始终存在这种可能性。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

迁移到对象增强了部署者逐步推出新代码的能力。 然而,对于他们来说,这在很大程度上是透明的。

开发人员影响

这是正常的重构,因此影响很小。 通常,基于对象代码更易于使用,因此从长远来看,这对开发人员来说是一项胜利。

实现

负责人

主要负责人

danms

工作项

  • check_can_live_migrate_destination

  • check_can_live_migrate_source

  • live_migration

  • _post_live_migration

  • _rollback_live_migration

  • _rollback_live_migration_at_destination

  • refresh_instance_security_rules

  • run_instance

  • detach_volume

  • compute/manager.py 中 instance[attr] 的剩余用法

依赖项

此蓝图与以下蓝图之间存在交叉依赖关系

在某些时候,virt 驱动程序需要修改以接受来自计算管理器的对象,然后才能完全转换管理器方法。

测试

通常,当这种情况发生时,单元测试需要进行最少的更改,具体取决于测试的结构。 理想情况下,它们已经模拟了数据库调用,这意味着对对象的更改是透明的。 实际上,这通常意味着对测试进行微调以返回完整的数据模型等。

文档影响

无。

参考资料