使用 OpenStack SDK 在 Nova 中¶
https://blueprints.launchpad.net/nova/+spec/openstacksdk-in-nova
我们希望使用 OpenStack SDK 与其他核心 OpenStack 服务进行交互。实现工作始于 Train,并在 Ussuri 中继续。
问题描述¶
Nova 正在使用 python-${service}client 和 keystoneauth1 适配器与其它核心服务交互。目前,对 Nova 依赖的 $service 的更改或修复可能需要在 python-${service}client 中进行更改,然后 Nova 才能达到一致性。这也要求 OpenStack SDK 达到一致性,因为它用于 CLI。
由于客户端存在较高的技术债务,维护 python-${service}client 可能会很繁重。通过直接使用 OpenStack SDK,我们可以消除对 python-${service}client 的额外依赖,并简化流程。
用例¶
作为 OpenStack 的开发人员,我希望减少在进行与使用核心 OpenStack 服务相关的更改时必须执行维护的区域数量。
作为核心 OpenStack 项目,Nova 应该以可靠和可维护的方式使用其他项目。为此,我们应该使用 OpenStack SDK 进行服务到服务的交互,而不是直接 API 或 python-${service}client 实现。
提议的变更¶
本规范建议在每个目标服务的三个阶段中使用 OpenStack SDK 代替 python-${service}client 和其他方法。
- 目标服务
Ironic (python-ironicclient -> Baremetal SDK)
Cinder (python-cinderclient -> Block Storage SDK)
Glance (python-glanceclient -> Image v2 SDK)
Neutron (python-neutronclient -> Network SDK)
Placement (keystoneauth1 adapter -> OpenStack SDK Proxy)
初始阶段 将包括添加管道来构建 openstack.connection.Connection 对象到 Nova 组件,这些组件使用 python-${service}client 与其他服务交互。然后,可以使用此连接的服务代理来代替现有的 keystoneauth1 适配器来检索端点以配置客户端。这在 [[1]] 中进行中。
主要阶段 将遍历对 python-${service}client 的调用,并用对 OpenStack SDK 的调用替换它们,直到不再需要客户端。在此阶段,我们将根据需要关闭在 OpenStack SDK 中识别出的功能缺陷。有关已识别缺陷的列表,请参阅 OpenStack SDK 更改。此过程正在进行中,适用于 python-ironicclient,请参见 [[2]]。
对于 Placement,用 SDK 的 placement 代理替换由 nova.utils.get_ksa_adapter('placement') 返回的 keystoneauth1 适配器。除了测试中少量更改之外,这都是透明的。这在 [[3]] 中进行中。最终,SDK 可能会实现更多对 placement 的支持。有了框架,我们可以考虑在可用时集成这些更改。
最终阶段 将只是删除现在未使用的客户端,并清理所有剩余的辅助程序和固定装置。
OpenStack SDK 更改¶
OpenStack SDK 包含一些服务比其他服务更完整的辅助程序选择,但最坏情况下提供与 keystoneauth1 适配器相同的基本组件。开发从 Ironic 开始,Ironic 在 OpenStack SDK 中具有强大的支持。其他服务需要在 OpenStack SDK 中进行额外的工作,或者可能需要使用 openstack.Proxy 提供的 API 基本组件来实现。专注于扩展 OpenStack SDK 对这些项目的支持,而不是在 Nova 中实现它们,更可取。由于 OpenStack SDK 没有规范仓库,我们将尝试在此处概述每个服务的缺失辅助程序。
patch_node 获取)备选方案¶
我们考虑的一种可能性是将对 python-${service}client 的调用替换为通过 keystoneauth1 适配器的 get/put/etc 基本组件直接调用 $service API 的方法。这将有效地将 python-${service}client 代码移植到 nova 中。虽然这使我们有机会清理东西,但它将涉及大量的低级工作,例如版本发现/协商、输入有效负载构造和验证以及输出处理。
数据模型影响¶
无
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
初始阶段的影响将很小,因为唯一的更改是由 OpenStack SDK 而不是直接构建 keystoneauth1 适配器。主要阶段可能不会对性能产生任何差异,而最终阶段应该大致抵消初始阶段的影响。
其他部署者影响¶
无
开发人员影响¶
通过使用 OpenStack SDK 作为与其他服务的唯一联系方式,可以减少维护工作量。这也有助于我们朝着更稳定的 OpenStack SDK 发展,因为更多的消费者通常意味着更多的机会来发现和解决错误。
此外,随着 OpenStack SDK 支持新的方法和服务,将它们引入 Nova 应该比当前方法更简单、更可靠。
升级影响¶
无
实现¶
负责人¶
- 主要负责人
dustinc <dustin.cowles@intel.com>
- 其他贡献者
mordred <mordred@inaugust.com>, dtantsur <dtantsur@protonmail.com>
功能联络人¶
- 功能联络人
efried
工作项¶
(在 Train 中实现) 引入 Nova 的包要求。
(在 Train 中部分实现) 引入管道,为每个
$service构建 openstack.connection.Connection 对象。(在 Train 中部分实现) 对于每个目标
$service(不包括 Placement),在用 SDK 的$service代理替换对python-${service}client的调用时,关闭 OpenStack SDK 中的缺陷。对于 Placement,用 SDK 的 placement 代理替换 keystoneauth1 适配器。
删除现在未使用的
python-${service}client、测试固定装置和其他辅助程序和实用程序。
依赖项¶
Nova 支持使用 keystoneauth1 配置选项来配置 Cinder。
测试¶
现有的单元测试需要更新,以断言对 SDK 的调用,而不是对客户端的调用。在客户端调用被模拟的情况下,这应该只是交换该模拟及其断言的问题。不应需要任何重要的额外单元测试。
现有的功能测试用例应该足够。可能需要在固定装置和其他框架中进行更改。
现有的集成测试应该可以无缝运行。这将是成功的试金石。
文档影响¶
无
参考资料¶
http://lists.openstack.org/pipermail/openstack-discuss/2019-May/005810.html
https://docs.openstack.org/openstacksdk/latest/user/config/configuration.html
https://review.opendev.org/#/c/662881/
Train 中实现的项目¶
历史¶
发布名称 |
描述 |
|---|---|
Train |
引入,部分实现 |
Ussuri |
重新引入 |