Drop namespace packages
Stop using namespace packages for our libraries. Change-Id: I85fa9b834600d3b12450fe29e39122b75d074c65
This commit is contained in:
parent
50bb32b95c
commit
d5f4a91e0e
248
specs/kilo/drop-namespace-packages.rst
Normal file
248
specs/kilo/drop-namespace-packages.rst
Normal file
@ -0,0 +1,248 @@
|
||||
====================================
|
||||
Drop our use of namespace packages
|
||||
====================================
|
||||
|
||||
https://blueprints.launchpad.net/oslo-incubator/+spec/drop-namespace-packages
|
||||
|
||||
Installing our libraries into a namespace package has caused several
|
||||
types of errors. Rather than continuing to fight with them, I propose
|
||||
that we phase them out.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
The namespace package support in setuptools is fragile, and some of
|
||||
the ways we use code regularly within OpenStack expose the issues in
|
||||
ways that are hard to debug.
|
||||
|
||||
The main issue we have seen is with installing two separate libraries
|
||||
into the same python namespace package using different installation
|
||||
"modes". If one library installed with ``pip install -e`` to enable
|
||||
"editable" mode, and another is installed without the ``-e`` option as
|
||||
a regular library, then the import path for the package is broken and
|
||||
some of the installed components are not importable. This happened a
|
||||
lot when devstack installed Oslo libraries editable, and we have
|
||||
changed devstack to stop doing that by default. It also happens when a
|
||||
developer installs something using a system package and then installs
|
||||
another library from source. We have no real way to control that
|
||||
behavior, so it still crops up from time to time.
|
||||
|
||||
We also see trouble with virtualenvs configured to allow access to the
|
||||
global site-packages directory, as nova needs for libvirt access. If
|
||||
anything from the ``oslo`` namespace package is installed globally, it
|
||||
will shadow the versions visible in the virtualenv. That would
|
||||
normally lead to a version error if some old version is installed
|
||||
globally, but in this case it can also lead to import errors because
|
||||
the namespace package doesn't not properly span the two site-packages
|
||||
directories.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
I propose that we move all current Oslo libraries out of the ``oslo``
|
||||
namespace and create simple packages that can be imported
|
||||
independently. For example, we would change::
|
||||
|
||||
from oslo.foo import bar
|
||||
|
||||
to::
|
||||
|
||||
from oslo_foo import bar
|
||||
|
||||
To avoid issues with distros, we should not rename the ``oslo.foo``
|
||||
library to ``oslo_foo``. This may be a little confusing for
|
||||
developers, so we might look at the decision again in the future, but
|
||||
as a first step this is less obtrusive because it means we don't need
|
||||
to change our requirements lists, repository names, and distro package
|
||||
names.
|
||||
|
||||
To support backwards compatibility, we will provide shadow-packages
|
||||
for the ``oslo`` namespace so that the old import form still works for
|
||||
the Kilo releases of the libraries. That will give us time to update
|
||||
all of the applications and let them cycle out of the long-term
|
||||
support window before dropping the namespace packages entirely during
|
||||
the M release.
|
||||
|
||||
Moving to regular packages will also let us move our unit tests inside
|
||||
the library, so they are delivered and installed under ``oslo_foo``,
|
||||
so we should do that at the same time, retaining just enough of the
|
||||
test suite to ensure that the public API exposed through the namespace
|
||||
package still works.
|
||||
|
||||
The distribution names of existing libraries won't change, and the
|
||||
same pattern will be used to create new libraries to avoid
|
||||
confusion. That means one would ``pip install oslo.foo`` and then
|
||||
``from oslo_foo import bar``.
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
1. lifeless has a patch to oslo.db that sets up the namespace package
|
||||
using pkgutils instead of setuptools:
|
||||
|
||||
https://review.openstack.org/#/c/123604/3/oslo/__init__.py
|
||||
|
||||
This retains the ability to use namespace packages, with the extra
|
||||
cost of shipping a real ``oslo`` library
|
||||
(https://github.com/rbtcollins/oslo) and maintaining the override
|
||||
code ourselves. We don't know what other issues we might find with
|
||||
namespace packages, though, so I'm more comfortable with just
|
||||
dropping them entirely.
|
||||
|
||||
2. Python 3 has better native namespace package support, so we could
|
||||
review the decision when we move to Python 3.
|
||||
|
||||
3. Do nothing, and continue to help developers debug problems on their
|
||||
systems when they come up. If we choose this option, we might want
|
||||
to write a script "why_is_oslo_broken.sh" to put in the incubator.
|
||||
|
||||
The "oslo\_" name prefix was selected to distinguish the libs from the
|
||||
non-production libraries like oslotest and oslosphinx. We could
|
||||
theoretially rename those as well so that all of our branded libraries
|
||||
have the same naming convention. I don't know if that's worth doing or
|
||||
not.
|
||||
|
||||
Impact on Existing APIs
|
||||
-----------------------
|
||||
|
||||
The imports will change, but we should not need to change other
|
||||
aspects of the libraries' APIs.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Configuration Impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Developer Impact
|
||||
----------------
|
||||
|
||||
Developers need to be aware of the import changes. We have a few
|
||||
options for communicating that widely:
|
||||
|
||||
1. Add a deprecation warning to the oslo namespace packages so
|
||||
importing them reports a warning.
|
||||
2. Add a hacking rule to make importing "from oslo." illegal.
|
||||
3. Rely on reviewers to catch it.
|
||||
|
||||
Option 1 is easy for us to do ourselves.
|
||||
|
||||
Option 2 has to wait until we have converted all of our own libraries,
|
||||
and updated all the apps, but it would then prevent improper imports
|
||||
being restored.
|
||||
|
||||
Option 3 is brittle, so I don't think we want to rely on it alone.
|
||||
|
||||
To ease the transition, we should be able to prepare a bash/sed script
|
||||
to make the required edits to a project. I don't think we'll have
|
||||
more than a handful of different types of import statements, but we
|
||||
can update the script as we find new patterns
|
||||
|
||||
Testing Impact
|
||||
--------------
|
||||
|
||||
The unit tests will be updated in each library so that all of them run
|
||||
against the new module name. Then some of the public API tests will be
|
||||
duplicated to use the namespace package to ensure that we don't break
|
||||
that.
|
||||
|
||||
The existing unit tests in applications should cover the uses of the
|
||||
libraries in the applications. We will need to update any mocks in
|
||||
those tests.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
Doug Hellmann
|
||||
|
||||
Other contributors:
|
||||
None
|
||||
|
||||
Milestones
|
||||
----------
|
||||
|
||||
Target Milestone for completion: K-2 (I hope early)
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
1. Rearrange all of our library code, including tests and
|
||||
documentation. See https://review.openstack.org/#/c/127323/ for an
|
||||
example.
|
||||
2. Write helper script for liaisons (maybe a liaison can do this?).
|
||||
|
||||
Incubation
|
||||
==========
|
||||
|
||||
N/A
|
||||
|
||||
Adoption
|
||||
--------
|
||||
|
||||
N/A
|
||||
|
||||
Library
|
||||
-------
|
||||
|
||||
N/A
|
||||
|
||||
Anticipated API Stabilization
|
||||
-----------------------------
|
||||
|
||||
N/A
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
None
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* setuptools bug 250, "develop and
|
||||
`--install-single-version-externally-managed` are not compatible
|
||||
with each other for namespace packages" -
|
||||
https://bitbucket.org/pypa/setuptools/issue/250/develop-and-install-single-version
|
||||
|
||||
* lifeless has a patch to oslo.db that sets up the namespace package
|
||||
using pkgutils instead of setuptools:
|
||||
|
||||
https://review.openstack.org/#/c/123604/3/oslo/__init__.py
|
||||
|
||||
it uses a real oslo package: https://github.com/rbtcollins/oslo
|
||||
|
||||
* PEP-420 spec: http://legacy.python.org/dev/peps/pep-0420/
|
||||
|
||||
* My WIP patch for oslo.i18n to move it out of the namespace package:
|
||||
https://review.openstack.org/#/c/127323/
|
||||
|
||||
* Notes from the Kilo summit session:
|
||||
https://etherpad.openstack.org/p/kilo-oslo-namespace-packages
|
||||
|
||||
* Mailing list thread following up after the Kilo summit:
|
||||
http://lists.openstack.org/pipermail/openstack-dev/2014-November/050313.html
|
||||
|
||||
.. note::
|
||||
|
||||
This work is licensed under a Creative Commons Attribution 3.0
|
||||
Unported License.
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
Loading…
Reference in New Issue
Block a user