使 Watcher 对象版本化

https://blueprints.launchpad.net/watcher/+spec/watcher-versioned-objects

随着 Watcher 变得越来越稳定,我们现在必须解决向后兼容性问题。其他 OpenStack 项目已经面临这个问题,社区提出了一个共同的答案,即对象版本化。

以下是其他项目为此主题撰写的蓝图规范的非详尽列表

问题描述

目前,Watcher 维护了一些(但不是全部)其他项目先前使用的构建块,例如 Nova,以便启用对象的版本化。由于 Watcher 现在是 Big Tent 的一部分,我们应该开始考虑向后兼容性。此外,我们应该标准化代码,因此使用 oslo.versionedobjects

用例

每当创建、修改或删除现有的 Watcher 对象时,相关的 Watcher 对象应该看到其版本号增加,同时指示发生的更改,以便在整个代码库中更容易处理向后兼容性。

提议的变更

此蓝图的重点是重写 Watcher 代码库,使其对象利用 oslo.versionedobjects 库来启用 Watcher 对象的版本化。

此外,oslo.versionedobjects 带来许多新的字段类型,其中 ObjectField 可以被发现是有用的,在构建版本化通知方面,我们将肯定希望通知更完整的信息集,其中也包括与给定 Watcher 对象直接相关的一些数据。因此,这项工作将在此蓝图范围内进行。

备选方案

  • 保留当前代码库并增强其以支持某种形式的版本化

  • 不支持任何形式的对象版本化

数据模型影响

在现有模型上添加数据库关系,无论外键字段是否已定义

  • 策略 将具有一个 ORM 关系字段

    • 一个 goal 字段,反映 goal_id 外键字段

  • 审计模板 将具有两个 ORM 关系字段

    • 一个 goal 字段,反映 goal_id 外键字段

    • 一个 strategy 字段,反映 strategy_id 外键字段

  • 审计 将具有两个 ORM 关系字段

    • 一个 goal 字段,反映 goal_id 外键字段

    • 一个 strategy 字段,反映 strategy_id 外键字段

  • 行动计划 将具有两个 ORM 关系字段

    • 一个 audit 字段,反映 audit_id 外键字段

    • 一个 strategy 字段,反映 strategy_id 外键字段

  • 行动 将具有一个 ORM 关系字段

    • 一个 action_plan 字段,反映 action_plan_id 外键字段

  • 效能指标 将具有一个 ORM 关系字段

    • 一个 action_plan 字段,反映 action_plan_id 外键字段

此外,将删除未使用的数据库字段,以尽可能避免不向后兼容的更改。

REST API 影响

API 设计将不受 eager 标志的影响。 事实上,API 端点不会返回任何预加载的数据。

安全影响

无。

通知影响

这项工作将有助于构建版本化通知。

其他最终用户影响

无。

性能影响

加载 ObjectField 数据会使查询变慢。 这就是为什么在此蓝图的介绍中引入了预加载的概念,以将相关的性能影响限制在需要预加载的区域。 另外请注意,此预加载不会级联,这意味着预加载的关联对象本身不会受到预加载的影响。

其他部署者影响

无。

开发人员影响

由于对象现在正在被版本化,因此对现有 Watcher 对象的任何修改都应直接转换为版本号的增加。 向后兼容的更改应使相关对象的次版本号增加,而任何破坏性更改应通过过渡到新的主要版本来转换。

实现

负责人

主要负责人

vincent-francoise

工作项

以下是需要进行的更改

  • 启用对于一对一和一对多外键的数据库加载 ORM 关系。

  • 为了提高性能,添加了预加载或不预加载新添加的 ORM 关系的可能性。

  • 重构 watcher/objects/base.py 中的代码,现在使用 oslo.versionedobjects

  • 更新所有具有外键字段的 Watcher 对象,以添加 ObjectField 字段,这些字段将在请求预加载基础数据库模型时填充。

依赖项

无。

测试

除了更新现有的单元测试套件外,此蓝图不会带来任何新的最终用户功能。 因此,当前的 Tempest 测试集在完成后应保持不变并仍然通过。

文档影响

架构中显示的数据库模式需要更新。

参考资料

无。

历史

无。