oslo-specs/specs/victoria/oslo-vmware-soap-library-sw...

6.0 KiB

Switching oslo.vmware's backing SOAP library

We want to switch the SOAP library used in olso.vmware to another library, zeep, because the currently-used library (suds-jurko) is unmaintained, not compatible with Python 3.10 and lacks in performance.

Problem description

With Python 2 being removed from all of OpenStack, we need the library backing oslo.vmware's SOAP calls to be compatible with Python 3. We see suds-jurko as being unmaintained upstream, so we cannot rely on any changes happening. Since we currently already see deprecation warnings generated by nova's tests for Python 3.6, we need a fix before the release of Python 3.10 or oslo.vmware will stop working alltogether.

Additionally, the vast number of VMs handled by a single compute-node with nova's VMware driver makes suds-jurko a performance bottleneck. This can be overcome with switching to a library more optimized for parsing XML.

Proposed change

We propose to change the backing library of oslo.vmware to zeep. The library is

  • Still maintained
  • Written for Python 2 and 3
  • Uses lxml for faster XML parsing

With the interface of zeep being similar but not the same as suds, we have to introduce some compatibility functions. This is also necessary, because some library-specific representation of objects, e.g. attribute access to ManagedObjectReference objects, leaked through to consuming projects. We therefore propose to change the library and consuming projects in multiple phases.

Phase 1

Add compatibility functions to oslo.vmware for value and type access of ManagedObjectReference and add additional functions/helpers for attribute access to move all code using suds-specificas into oslo.vmware.

Phase 2

Introduce patches to cinder and nova for using the functions introduced in phase 1.

Phase 3

Switch the code in oslo.vmware to use zeep instead of suds-jurko while keeping the interface for consuming projects the same. The core of these changes should be confined to oslo_vmware.service.

Alternatives

There's another fork of suds based on suds-jurko called suds-community, which is still maintained, but while using it may solve the Python compatibility problem it doesn't improve performance.

While there are other libraries around, see e.g. this list in the Python wiki, a quick glance at most of them shows them as unmaintained, not supporting Python 3 or having an interface that requires too many compatibility shims for keeping changes in consuming projects minimal.

Another alternative would be to get rid of oslo.vmware alltogether, which is mainly hindered by nova and cinder still including drivers using this library.

Impact on Existing APIs

Consuming code will be required to use the newly introduced helper-functions for compatibility in attribute access.

Security impact

None

Performance Impact

With the XML parser of the library switching to the C-based lxml, we expect a performance increase. In our (very simple) tests, we achieved up to 50 % reduction in request times and CPU load.

Configuration Impact

None

Developer Impact

Consuming code will be required to use the newly introduced helper-functions for compatibility in attribute access.

Testing Impact

None

Implementation

Assignee(s)

Primary assignee:

jkulik

Milestones

Target Milestone for completion: unclear

Work Items

  • Implement helper functions in oslo.vmware for compatibility layer
  • Patch nova's VMware driver to use helper functions
  • Patch cinder's VMware driver to use helper functions
  • Implement Service object using zeep client in oslo.vmware

Documentation Impact

None

Dependencies

This adds zeep into OpenStack's requirements, while removing suds-jurko.

References

Note

This work is licensed under a Creative Commons Attribution 3.0 Unported License. http://creativecommons.org/licenses/by/3.0/legalcode