使用 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 没有规范仓库,我们将尝试在此处概述每个服务的缺失辅助程序。

Ironic
node.get_console
node.inject_nmi
node.list_volume_connectors
node.list_volume_targets
node.set_console_mode (可通过 patch_node 获取)
volume_target.create
volume_target.delete

Cinder
attachments.complete
attachments.delete
attachments.update
volumes.attach
volumes.begin_detaching
volumes.detach
volumes.initialize_connection
volumes.migrate_volume_completion
volumes.reserve
volumes.roll_detaching
volumes.terminate_connection
volumes.unreserve

Glance
image.add_location

Neutron

备选方案

我们考虑的一种可能性是将对 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

工作项

  1. (在 Train 中实现) 引入 Nova 的包要求。

  2. (在 Train 中部分实现) 引入管道,为每个 $service 构建 openstack.connection.Connection 对象。

  3. (在 Train 中部分实现) 对于每个目标 $service(不包括 Placement),在用 SDK 的 $service 代理替换对 python-${service}client 的调用时,关闭 OpenStack SDK 中的缺陷。

    • 对于 Placement,用 SDK 的 placement 代理替换 keystoneauth1 适配器。

  4. 删除现在未使用的 python-${service}client、测试固定装置和其他辅助程序和实用程序。

依赖项

测试

现有的单元测试需要更新,以断言对 SDK 的调用,而不是对客户端的调用。在客户端调用被模拟的情况下,这应该只是交换该模拟及其断言的问题。不应需要任何重要的额外单元测试。

现有的功能测试用例应该足够。可能需要在固定装置和其他框架中进行更改。

现有的集成测试应该可以无缝运行。这将是成功的试金石。

文档影响

参考资料

http://lists.openstack.org/pipermail/openstack-discuss/2019-May/005810.html

https://docs.openstack.org/openstacksdk/latest/user/config/configuration.html

http://eavesdrop.openstack.org/irclogs/%23openstack-sdks/%23openstack-sdks.2019-05-20.log.html#t2019-05-20T13:48:07

https://review.opendev.org/#/c/662881/

Train 中实现的项目

历史

修订

发布名称

描述

Train

引入,部分实现

Ussuri

重新引入