切换 oslo.vmware 的底层 SOAP 库

我们希望将 olso.vmware 中使用的 SOAP 库切换到另一个库,zeep,因为当前使用的库 (suds-jurko) 已经停止维护,不兼容 Python 3.10,并且性能不足。

问题描述

随着 Python 2 从 OpenStack 中移除,我们需要支持 oslo.vmware 的 SOAP 调用的底层库与 Python 3 兼容。suds-jurko 已经停止维护 上游,因此我们不能依赖任何更改的发生。由于我们目前已经看到 nova 的测试针对 Python 3.6 生成了弃用警告,我们需要在 Python 3.10 发布之前进行修复,否则 oslo.vmware 将完全停止工作。

此外,单个计算节点处理的大量虚拟机使得 suds-jurko 成为 nova 的 VMware 驱动程序的性能瓶颈。可以通过切换到更优化的 XML 解析库来克服这个问题。

提议的变更

我们建议将 oslo.vmware 的底层库更改为 zeep。该库是

  • 仍在维护中

  • 为 Python 2 和 3 编写

  • 使用 lxml 进行更快的 XML 解析

由于 zeep 的接口与 suds 相似但不相同,因此我们需要引入一些兼容性函数。 这也是必要的,因为一些库特定的对象表示,例如对 ManagedObjectReference 对象的属性访问,已经泄露到使用项目中。 因此,我们建议分多个阶段更改库和使用项目。

阶段 1

ManagedObjectReference 的值和类型访问添加 oslo.vmware 的兼容性函数,并添加额外的函数/助手以进行属性访问,将所有使用 suds 特定的代码移到 oslo.vmware 中。

阶段 2

cindernova 引入补丁,以使用第一阶段引入的函数。

阶段 3

oslo.vmware 中的代码切换为使用 zeep 代替 suds-jurko,同时保持对使用项目的接口相同。 这些更改的核心应该限制在 oslo_vmware.service 中。

备选方案

还有另一个基于 suds-jurkosuds 分支,名为 suds-community,该分支仍在维护中,但虽然使用它可能可以解决 Python 兼容性问题,但它并不能提高性能。

虽然还有其他库可用,请参阅例如 Python wiki 上的此列表,但快速浏览大多数库显示它们已经停止维护,不支持 Python 3,或者其接口需要过多的兼容性 shim 以保持使用项目中更改的最小化。

另一种选择是完全删除 oslo.vmware,这主要是受到 nova 和 cinder 仍然包含使用此库的驱动程序的影响。

添加辅助函数以隐藏 sudszeep 之间的差异的替代方案是更改依赖项目的驱动程序以使用新的接口。 但这仍然会泄露支持 oslo.vmare 的 SOAP 库的实现细节到依赖项目中,这也会阻碍未来的库切换。

Impact on Existing APIs

使用代码将需要使用新引入的辅助函数进行兼容性属性访问。

安全影响

性能影响

由于库的 XML 解析器切换到基于 C 的 lxml,我们预计性能会提高。 在我们的(非常简单)测试中,我们实现了高达 50% 的请求时间和 CPU 负载的减少。

Configuration Impact

开发人员影响

使用代码将需要使用新引入的辅助函数进行兼容性属性访问。

Testing Impact

由于有了一种新的访问 ManagedObjectReference 属性的方式,我们需要更新所有测试 - 包括依赖项目的测试 - 以使用我们将要引入的辅助函数。 此外,我们还需要更新依赖项目测试中定义的假 ManagedObjectReference 对象,以包含旧属性和新属性,以便进行过渡阶段。 这是必要的,因为项目的测试必须独立于底层库的辅助函数实现,以便引入更改不会破坏它们。 另一种方法是提供可以通过 oslo.vmware 导入的假对象。 即使这样,仍然可能存在 oslo.vmware 的底层 SOAP 库的对象表示泄露到依赖对象测试中的情况,因为还有其他对象,它们不是 ManagedObjectReferences,但行为完全相同。

实现

负责人

主要负责人

jkulik

里程碑

完成目标里程碑:不明确

工作项

  • oslo.vmware 中实现兼容层辅助函数

  • 修补 nova 的 VMware 驱动程序以使用辅助函数

  • 修补 cinder 的 VMware 驱动程序以使用辅助函数

  • zeep 添加到全局需求中,如 文档 中所述

  • oslo.vmware 中使用 zeep 客户端实现 Service 对象

文档影响

依赖项

这会将 zeep 添加到 OpenStack 的需求中,同时删除 suds-jurko

参考资料

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode