Difference between revisions of "Python3"
(→Dependencies) |
m (Update link for oslo_serialization.jsonutils.dump_as_bytes(obj)) |
||
(508 intermediate revisions by 47 users not shown) | |||
Line 1: | Line 1: | ||
This page tracks the progress of Python 3 effort porting for OpenStack. | This page tracks the progress of Python 3 effort porting for OpenStack. | ||
+ | |||
+ | == IRC: #openstack-dev == | ||
+ | |||
+ | Join the #openstack-dev IRC channel on the Freenode network to discuss Python 3. | ||
== Python 3 == | == Python 3 == | ||
Line 5: | Line 9: | ||
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?] | [http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?] | ||
:''Python 3 is usually seen as the new Python version which breaks compatibility and raises new Unicode issues. Python 3 is much more than that. It’s a new clean language which has a more consistent syntax. It has many new features, not less than 15 new modules. Python 3 is already well supported by major Linux distributions, whereas Python 2.7 reached its end-of-life. Slowly, some bugs cannot be fixed in Python 2.7 anymore and are only fixed in the latest Python 3 release. Python 3 is now 5 years old and considered as a mature programming language.'' | :''Python 3 is usually seen as the new Python version which breaks compatibility and raises new Unicode issues. Python 3 is much more than that. It’s a new clean language which has a more consistent syntax. It has many new features, not less than 15 new modules. Python 3 is already well supported by major Linux distributions, whereas Python 2.7 reached its end-of-life. Slowly, some bugs cannot be fixed in Python 2.7 anymore and are only fixed in the latest Python 3 release. Python 3 is now 5 years old and considered as a mature programming language.'' | ||
+ | |||
+ | == Python 2: Python 2.6 support dropped, Python 2.7 only == | ||
+ | |||
+ | OpenStack Liberty targets Python 2.7 and 3.4. | ||
+ | |||
+ | Python 2.6 support is being dropped in OpenStack since OpenStack Juno for servers. Python 2.6 support is currently kept in Oslo libraries and clients. See [https://etherpad.openstack.org/p/juno-cross-project-future-of-python juno-cross-project-future-of-python] etherpad. | ||
+ | |||
+ | Python 3.3 support is being dropped since OpenStack Liberty. | ||
+ | |||
+ | Python 2.6 is slowly being dropped in the whole OpenStack project, ex: [https://review.openstack.org/#/c/201295/ Remove p26 job from DIB]. | ||
+ | |||
+ | Python 2.6 support will be removed in Oslo and Clients clients for OpenStack Mitaka: [http://markmail.org/message/oe6wewgvbvvyts73 Oslo libraries dropping python 2.6 compatability]. | ||
== Port Python 2 code to Python 3 == | == Port Python 2 code to Python 3 == | ||
− | OpenStack project chose to use the same code base for Python 2 and Python 3. The [http://pythonhosted.org/six/ Six: Python 2 and 3 Compatibility Library] helps to write code working on both versions. OpenStack supported Python 2.6 for RHEL up to Juno, but not Python 2.5 and older. | + | OpenStack project chose to use the same code base for Python 2 and Python 3. The [http://pythonhosted.org/six/ Six: Python 2 and 3 Compatibility Library] helps to write code working on both versions. OpenStack supported Python 2.6 for RHEL up to Juno, but not Python 2.5 and older. As we are targeting Python 3.4 and up, there is no need to avoid u'unicode' syntax. Do not use six.u('unicode'). |
+ | |||
+ | === Before you begin === | ||
+ | |||
+ | If you're doing development with Ubuntu/Debian (and not using devstack with the USE_PYTHON flag set), then you'll need the following packages installed to run the py34 tox unit test targets in the projects: | ||
+ | |||
+ | sudo apt-get install python3.4 python3.4-dev | ||
+ | |||
+ | === sixer tool === | ||
+ | |||
+ | The [https://pypi.python.org/pypi/sixer sixer] tool helps to replace most basic patterns to add Python 3 compatibility and it respects OpenStack coding style. | ||
=== Common patterns === | === Common patterns === | ||
− | * Replace dict.iteritems() with six.iteritems(dict) | + | * Replace "for key in dict.iterkeys()" with "for key in dict" |
+ | * Replace dict.iteritems() with dict.items() | ||
+ | * Replace dict.itervalues() with dict.values() | ||
+ | |||
+ | Note: Replacing dict.iteritems()/.itervalues() with six.iteritems(dict)/six.itervalues(dict) was preferred in the past, but there was [http://lists.openstack.org/pipermail/openstack-dev/2015-June/066391.html a discussion suggesting to avoid six for this]. The overhead of creating a temporary list on Python 2 is negligible. | ||
+ | |||
* Replace iterator.next() with next(iterator) | * Replace iterator.next() with next(iterator) | ||
* Replace basestring with six.string_types | * Replace basestring with six.string_types | ||
* Replace unicode with six.text_type | * Replace unicode with six.text_type | ||
+ | * Replace (str, unicode) with six.string_types | ||
+ | * Replace (int, long) with six.integer_types | ||
+ | * Replace func.func_name with func.__name__ | ||
+ | * Replace exceptions.OSError with OSError and remove "import exceptions" | ||
+ | * map() and filter() if a list is needed on Python 3: | ||
+ | ** Replace map(func, data) with [func(item) for item in data] | ||
+ | ** Replace filter(lambda obj: test(obj), data) with [obj for obj in data if test(obj)] | ||
+ | ** Note: Usually, tests fail because map() or filter() objects have no length | ||
+ | |||
+ | === Serialization: base64, JSON, etc. === | ||
+ | |||
+ | * [with oslo.serialization 1.10 or newer] Get the [http://docs.openstack.org/developer/oslo.serialization/api.html#module-oslo_serialization.base64 base64 module] from oslo_serialization (from oslo_serialization import base64) to get functions: | ||
+ | ** oslo_serialization.base64.decode_as_bytes(encoded) | ||
+ | ** oslo_serialization.base64.decode_as_text(encoded, encoding='utf-8') | ||
+ | ** oslo_serialization.base64.encode_as_bytes(s, encoding='utf-8') | ||
+ | ** oslo_serialization.base64.encode_as_text(s, encoding='utf-8') | ||
+ | * Replace text.encode('base64') and base64.b64encode(text) with: | ||
+ | ** base64.b64encode(text): only accept bytes and returns bytes, | ||
+ | ** or: oslo_serialization.base64.encode_as_bytes(text): accept bytes or Unicode and returns bytes | ||
+ | ** or: oslo_serialization.base64.encode_as_text(text): accept bytes and Unicode and returns Unicode | ||
+ | ** '''Warning:''' base64.encodestring(raw) adds a newline ("\n"), whereas encode_as_bytes() and encode_as_text() don't. | ||
+ | * Replace raw.decode('base64') with: | ||
+ | ** base64.b64decode(raw): return bytes | ||
+ | ** oslo_serialization.base64.decode_as_bytes(encoded): accept bytes and Unicode, returns bytes | ||
+ | ** oslo_serialization.base64.decode_as_text(encoded): accept bytes and Unicode, returns Unicode | ||
+ | |||
+ | Hexadecimal: | ||
+ | |||
+ | * Replace raw.decode('hex') with binascii.unhexlify(raw) | ||
+ | * Replace bytes.encode('hex') with binascii.hexlify(bytes) | ||
+ | |||
+ | JSON: | ||
+ | |||
+ | * [with oslo.serialization 1.10 or newer] Replace json.dumps(obj) with [https://docs.openstack.org/oslo.serialization/latest/reference/index.html#oslo_serialization.jsonutils.dump_as_bytes oslo_serialization.jsonutils.dump_as_bytes(obj)] | ||
+ | * Replace json.loads(obj) with oslo_serialization.jsonutils.loads(obj): it accepts bytes and Unicode, bytes is decoded from UTF-8. It avoids "if isinstance(obj, bytes): obj = obj.decode('utf-8')" which may require a second temporary variable. | ||
+ | |||
+ | === contextlib.nested === | ||
+ | |||
+ | To replaced contextlib.nested is to use [https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack contextlib.ExitStack]. It's available on Python 2 using [https://contextlib2.readthedocs.org/en/latest/#contextlib2.ExitStack contextlib2.ExitStack]. For contextlib.nested, nova/test.py defines: | ||
+ | |||
+ | if six.PY3: | ||
+ | @contextlib.contextmanager | ||
+ | def nested(*contexts): | ||
+ | with contextlib.ExitStack() as stack: | ||
+ | yield [stack.enter_context(c) for c in contexts] | ||
+ | else: | ||
+ | nested = contextlib.nested | ||
+ | |||
+ | Another option to replaced contextlib.nested is to use the @mock.patch decorator. Example with nested function: | ||
+ | |||
+ | def test_thing(self): | ||
+ | @mock.patch(...) | ||
+ | @mock.patch(...) | ||
+ | @mock.patch(...) | ||
+ | def do_test(...): | ||
+ | ... | ||
+ | |||
+ | do_test() | ||
+ | |||
+ | More options: | ||
+ | * Mock provides a context that patches multiple things so that no nesting is needed: [https://docs.python.org/dev/library/unittest.mock.html#patch-multiple mock.patch.multiple()] | ||
+ | * oslotest provides fixtures for mock, so you don't need a context: [http://docs.openstack.org/developer/oslotest/api.html#module-oslotest.mockpatch oslotest.mockpatch]. | ||
+ | |||
+ | === oslo_utils.encodeutils.to_utf8 === | ||
+ | |||
+ | oslo.utils 3.5 has an oslo_utils.encodeutils.to_utf8() function to encode Unicode to UTF-8 and return bytes unchanged. | ||
=== bytes.decode and unicode.encode === | === bytes.decode and unicode.encode === | ||
Line 69: | Line 166: | ||
=== logging module and format exceptions === | === logging module and format exceptions === | ||
+ | |||
+ | The <code>exception_to_unicode(exc)</code> function of oslo_utils.encodeutils is the recommanded way to format an exception to Unicode. This function works on Python 2 and Python 3 and it should avoid mojibake is most cases. | ||
On Python 2, the logging module accepts bytes and text strings. On Python 3, it only accepts text strings. For example, logging.error(b'hello') logs <code>b'hello'</code> instead of <code>'hello'</code>. | On Python 2, the logging module accepts bytes and text strings. On Python 3, it only accepts text strings. For example, logging.error(b'hello') logs <code>b'hello'</code> instead of <code>'hello'</code>. | ||
Line 137: | Line 236: | ||
The "db type could not be determined" error comes from .testrepository/times.dbm used by testr. | The "db type could not be determined" error comes from .testrepository/times.dbm used by testr. | ||
− | Workaround: "rm -rf .testrepository/". | + | Workaround: "rm -rf .testrepository/" and then run "tox -e py34" before running "tox -e py27". You only have to do this once. The problem only occurs with "tox -e py34" when .testrepository/ was created by Python 2. |
== Python 3 Status of OpenStack projects == | == Python 3 Status of OpenStack projects == | ||
− | === Oslo | + | === Common Libraries (Oslo Projects) === |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | See [http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml programs.yaml] for the list of Common Libraries. | ||
{|class="wikitable sortable" | {|class="wikitable sortable" | ||
|- | |- | ||
− | ! | + | ! Project !! Python 3 compatibility !! Comment |
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/automaton automaton] || style="background-color: lightgreen;" | Yes || | |
− | | | ||
− | |||
− | |||
− | | style="background-color: lightgreen" | | ||
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/castellan castellan] || style="background-color: lightgreen;" | Yes || | |
− | | style="background-color: lightgreen" | | ||
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/cliff cliff] || style="background-color: lightgreen;" | Yes || | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | | style="background-color: lightgreen" | | ||
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/debtcollector debtcollector] || style="background-color: lightgreen;" | Yes || | |
− | | style="background-color: lightgreen" | | ||
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/futurist futurist] || style="background-color: lightgreen;" | Yes || | |
− | | | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
− | + | | [https://pypi.python.org/pypi/oslo.cache oslo.cache] || style="background-color: lightgreen;" | Yes || | |
− | |||
− | | [https://pypi.python.org/pypi/ | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style="background-color: | + | | [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style="background-color: lightgreen;" | Yes || |
|- | |- | ||
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.config oslo.config] || style="background-color: lightgreen;" | Yes || | ||
Line 240: | Line 266: | ||
| [https://pypi.python.org/pypi/oslo.context oslo.context] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.context oslo.context] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/oslo.db oslo.db] || style="background-color: | + | | [https://pypi.python.org/pypi/oslo.db oslo.db] || style="background-color: lightgreen;" | Yes || |
+ | PyMySQL driver is now used by default for MySQL. setup.cfg contains the Python 3 classifier. | ||
|- | |- | ||
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style="background-color: lightgreen;" | Yes || | ||
Line 246: | Line 273: | ||
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.log oslo.log] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style="background-color: | + | | [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style="background-color: lightgreen;" | Yes || |
+ | oslo.messaging is now fully compatible with Python 3. The old (and now removed) Qpid transport was not compatible, the AMQP driver was ported recently. | ||
|- | |- | ||
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | [https://pypi.python.org/pypi/oslo.policy oslo.policy] || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | [https://pypi.python.org/pypi/oslo.privsep oslo.privsep] || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | [https://pypi.python.org/pypi/oslo.reports oslo.reports] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style="background-color: lightgreen;" | Yes || | ||
Line 254: | Line 288: | ||
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/oslo.service oslo.service] || style="background-color: orange;" | Partial || |
+ | WSGI module SSL support is broken under Python 3. We want projects to support deployment without relying on that code, but not all do (see glance and designate below). | ||
|- | |- | ||
| [https://pypi.python.org/pypi/oslotest oslotest] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslotest oslotest] || style="background-color: lightgreen;" | Yes || | ||
Line 260: | Line 295: | ||
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style="background-color: | + | | [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style="background-color: lightgreen;" | Yes || Supports Python 3 since oslo.vmware 0.13.0 |
|- | |- | ||
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | + | | pylockfile || style="background-color: lightgreen;" | Yes || | |
− | |||
− | | pylockfile || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
| [https://pypi.python.org/pypi/stevedore stevedore] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/stevedore stevedore] || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
| [https://pypi.python.org/pypi/taskflow taskflow] || style="background-color: lightgreen;" | Yes || | | [https://pypi.python.org/pypi/taskflow taskflow] || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | [https://pypi.python.org/pypi/tooz tooz] || style="background-color: lightgreen;" | Yes || | ||
|} | |} | ||
Line 281: | Line 316: | ||
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || style="background-color: lightgreen;" | yes || | | [https://pypi.python.org/pypi/cookiecutter cookiecutter] || style="background-color: lightgreen;" | yes || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/hacking hacking] || style="background-color: lightgreen;" | yes || | + | | [https://pypi.python.org/pypi/hacking hacking] || style="background-color: lightgreen;" | yes || |
|- | |- | ||
| [https://pypi.python.org/pypi/pbr pbr] || style="background-color: lightgreen;" | yes || | | [https://pypi.python.org/pypi/pbr pbr] || style="background-color: lightgreen;" | yes || | ||
Line 295: | Line 330: | ||
|- | |- | ||
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment | ! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/keystonemiddleware keystonemiddleware] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || python-memcached || keystonemiddleware 1.6.1 supports Python 3. | ||
|- | |- | ||
Line 304: | Line 342: | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen" | On PyPI || || | + | | [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-fuelclient python-fuelclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-glanceclient python-glanceclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color:lightgreen" | On PyPI || || | + | | [https://pypi.python.org/pypi/python-glanceclient python-glanceclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color:lightgreen" | On PyPI || || |
|- | |- | ||
Line 316: | Line 354: | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-ironicclient python-ironicclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen;" | On PyPI || || | + | | [https://pypi.python.org/pypi/python-ironicclient python-ironicclient] || style="background-color: lightgreen;" | Yes|| style="background-color: lightgreen" | Voting || style="background-color: lightgreen;" | On PyPI || || |
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style="background-color: lightgreen;" | Yes || style="background-color:lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-manilaclient python-manilaclient] || style="background-color: lightgreen;" | Yes || style="background-color:lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-masakariclient python-masakariiclient]|| style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-monascaclient python-monascaclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-novaclient python-novaclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On | + | | [https://pypi.python.org/pypi/python-novaclient python-novaclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | | + | | [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-octaviaclient python-octaviaclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-openstackclient python-openstackclient] || style="background-color: lightgreen" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen" | On PyPI || || As of 0.9 |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python-saharaclient python-saharaclient] || style="background-color: lightgreen;" | | + | | [https://pypi.python.org/pypi/python-saharaclient python-saharaclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen" | On PyPI || || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/python- | + | | [https://pypi.python.org/pypi/python-searchlightclient python-searchlightclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen" | On PyPI || || |
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-senlinclient python-senlinclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen" | Voting || style="background-color: lightgreen" | On PyPI || || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-swiftclient python-swiftclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen;" | On PyPI || || | ||
|- | |- | ||
Line 350: | Line 400: | ||
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen" | On PyPI || || | | [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen" | On PyPI || || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-watcherclient python-watcherclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen" | On PyPI || || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/python-designateclient python-designateclient] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | Voting || style="background-color: lightgreen" | On PyPI || || | ||
+ | |||
|} | |} | ||
− | === OpenStack | + | === OpenStack Libraries === |
+ | |||
+ | {|class="wikitable sortable" | ||
+ | |- | ||
+ | ! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Comment | ||
+ | |- | ||
+ | | blazar-nova || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | ceilometermiddleware || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/django_openstack_auth django_openstack_auth] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | django_openstack_auth 2.0 is fully compatible with Python 3. | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/glance_store glance_store] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || glance_store 0.7.0 added the Python 3 support. | ||
+ | |- | ||
+ | |||
+ | | heat-translator || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | |||
+ | | ironic-lib || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
− | + | | keystoneauth || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | |
+ | |- | ||
− | + | | keystonemiddleware || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | |
|- | |- | ||
− | + | ||
+ | | ldappool || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
|- | |- | ||
− | | | + | | monasca-statsd || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
+ | | mistral-lib || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
− | | | + | | neutron-lib || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | + | |- | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | + | | octavia-lib || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
|- | |- | ||
+ | | [https://pypi.python.org/pypi/os-brick os-brick] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || os-brick 0.3.2 added Python 3 support. | ||
− | | | + | |- |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | + | | os-client-config || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
|- | |- | ||
− | | | + | | os-traits || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
− | | | + | | os-vif || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
+ | | os-win || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
+ | | osc-lib || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
− | | | + | | osc-placement || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
+ | | pycadf || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || | ||
+ | |- | ||
− | | | + | | shade || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
+ | | [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style="background-color:lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color:lightgreen;" | Yes || | ||
+ | |- | ||
− | | | + | | sushy || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/taskflow taskflow] || style="background-color:lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
− | + | |- | |
− | |||
− | |||
− | |||
− | |||
− | || | + | | tosca-parser || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | Yes || |
|- | |- | ||
|} | |} | ||
− | + | === Dependencies: Environment markers === | |
− | + | ||
− | + | Example to not install the "futures" dependency on Python 3.3 and newer: | |
− | + | ||
− | + | <pre> | |
− | + | futures; python_version < '3.2' | |
− | + | </pre> | |
− | + | ||
− | + | === OpenStack applications (tc:approved-release) === | |
− | + | ||
− | + | OpenStack applications [https://governance.openstack.org/tc/reference/tags/tc_approved-release.html#tag-tc-approved-release approved by the OpenStack Technical Committee]. | |
− | + | ||
− | + | {| class="wikitable sortable" | |
− | + | |- | |
− | + | ! style="width: 10%;" | Project !! style="width: 10%;" | Unit tests pass on Python 3 !! style="width: 10%;" | py35 gate !! style="width: 20%;" | functional tests !! Comments | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/ceilometer ceilometer] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/cinder cinder] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | integrated-gate-py35 || | |
− | + | [https://blueprints.launchpad.net/cinder/+spec/cinder-python3 cinder-python3] blueprint (written by Victor Stinner) has been accepted for Liberty. Patches: [https://review.openstack.org/#/q/project:openstack/cinder+topic:bp/cinder-python3,n,z bp/cinder-python3 topic]. Note: Commit message must use "Partial-Implements: blueprint cinder-python3" to be linked to the blueprint. Kendall Nelson, Ivan Kolodyazhny (core) and Eric Harney (core) prefer this syntax: see [https://review.openstack.org/#/c/229991/2//COMMIT_MSG COMMIT_MSG]. | |
− | + | |- | |
− | + | ||
− | + | | designate || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | designate-bind9-py36 designate-bind9-py35 || ! style="background-color: orange;" | Relies on oslo.service WSGI code that does not work under Python 3 with SSL. Functional tempest tests are ran on both of these jobs. [http://lists.openstack.org/pipermail/openstack-dev/2018-May/130277.html] | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/glance glance] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | integrated-gate-py35 || ! style="background-color: orange;" | Relies on oslo.service WSGI code that does not work under Python 3. [http://lists.openstack.org/pipermail/openstack-dev/2018-May/130277.html] | |
− | + | Victor Stinner is working on porting Glance to Python3. Patches: [https://review.openstack.org/#/q/status:open+project:openstack/glance+branch:master+topic:py3,n,z Patches for glance (topic: py3)]. | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/heat heat] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | heat-functional-convg-mysql-lbaasv2-py35 || | |
− | + | Sirushti Murugesan wrote and implemented the spec [http://specs.openstack.org/openstack/heat-specs/specs/liberty/heat-python34-support.html Python34 Support] (which was accepted for Liberty). Mitaka version will fully support Python 3. Great job Sirushti Murugesan who did almost all the work! | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/horizon horizon] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | horizon-openstack-tox-python3-django111,horizon-integration-tests, horizon-dsvm-tempest-plugin || | |
− | + | George Peristerakis wrote [https://blueprints.launchpad.net/horizon/+spec/porting-python3 Make Horizon python3.4 compatible] in May 2015, the blueprint was approved. Patches: [https://review.openstack.org/#/q/topic:bp/porting-python3+project:openstack/horizon,n,z bp/porting-python3 topic]. | |
− | + | |- | |
− | + | ||
− | + | | [https://pypi.python.org/pypi/ironic ironic] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3 || | |
− | + | [http://lists.openstack.org/pipermail/openstack-dev/2015-May/064049.html Python 3.4 unit tests are now being run for openstack/ironic. The unit tests are a voting job.] | |
− | + | Thanks to Victor Sergeyev for all of his work to update the Ironic code to make it pass the unit tests using Python 3.4: [https://review.openstack.org/#/c/156192/ Run tests in py34 environment] | |
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/keystone keystone] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | integrated-gate-py35 || | ||
+ | The move to pyldap and new ldappool were major hurdles solved in Newton. Great work by the Keystone team to get the last things through the gate in Newton. | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/neutron neutron] || style="background-color:lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | integrated-gate-py35 || | ||
+ | [https://review.openstack.org/#/c/172962/ Porting to Python 3] spec (by Cyril Roelandt) accepted for Liberty, port in progress. [https://review.openstack.org/#/q/project:openstack/neutron+branch:master+topic:bp/neutron-python3,n,z Patches of the blueprint neutron-python3] | ||
+ | |- | ||
+ | |||
+ | | neutron-lbaas || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | neutron-lbaasv2-dsvm-py3x-api and neutron-lbaasv2-dsvm-py3x-api-namespace || | ||
+ | Patches: [https://review.openstack.org/#/q/topic:bp/neutron-python3 topic:bp/neutron-python3]. | ||
+ | |- | ||
+ | |||
+ | | neutron-fwaas || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | neutron-fwaas-networking-midonet-cross-py35 (non-voting) || | ||
+ | |- | ||
+ | |||
+ | | neutron-vpnaas || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/nova nova] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | integrated-gate-py35 || | ||
+ | Status at 2019-01-24: Unit tests all running and voting under Python 3 via the use of the mox3 package. There are only 3 unit test files left that are using mox3 (nova/tests/unit/cells/test_cells_messaging.py, nova/tests/unit/network/test_neutronv2.py, nova/tests/unit/network/test_manager.py). | ||
+ | |||
+ | We advised contributors not to spend time replacing mox in files testing cells v1 and nova-network (test_cells_messaging.py and test_manager.py), as both are slated for removal as soon as we're able. Progress is being tracked at: https://blueprints.launchpad.net/nova/+spec/mox-removal-stein | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org//pypi/sahara sahara] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | sahara-tests-scenario-py3 (experimental) || Status at 2018-02-23: the job fails during devstack deployment, because swift does not start. The list of its dependencies is minimal and components like keystone are optional. This was partially addressed with an extra dependency: https://review.openstack.org/#/c/544121/ but this requires a) support in devstack (tentative support in https://review.openstack.org/#/c/544383/) b) at least another extra, or a more generic way of doing this; even with an additional extra explicitly required in devstack, the extras would be installed from pip breaking the test of depending patches. | ||
+ | We are facing an issue with pickle library and python 3, once that gets fixed we can try to make the python 3 gate voting. | ||
+ | |- | ||
+ | |||
+ | | [https://pypi.python.org/pypi/swift swift] || style="background-color: red;" | blocked || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
+ | Status at 2016-06-22: 3/4,498 unit tests (0%), TODO: 4,495 tests | ||
+ | |||
+ | Update (2016-06-27): [http://lists.openstack.org/pipermail/openstack-dev/2016-June/097102.html master branch is currently in a soft-freeze in order to get encryption middleware merged] | ||
+ | |||
+ | Python 3 bugs: https://bugs.launchpad.net/swift/+bug/1614289 | ||
+ | |||
+ | [http://lists.openstack.org/pipermail/openstack-dev/2015-October/078058.html Plan to add Python 3 support to Swift]. Patches: [https://review.openstack.org/#/q/project:openstack/swift+branch:master+topic:py3,n,z Patches with the topic py3] | ||
+ | |||
+ | Python 3 unit tests require liberasurecode >= 1.0.9 and PyEClib >= 1.0.9. To install liberasurecode (in /usr): | ||
+ | |||
+ | git clone https://bitbucket.org/tsg-/liberasurecode/ | ||
+ | cd liberasurecode | ||
+ | /autogen.sh && /configure --prefix=/usr && make && sudo make install | ||
+ | |||
+ | liberasurecode >= 1.0.9 is available in Ubuntu Precise, Ubuntu Trusty, Fedora 22, Fedora 23 and CentoOS 7. | ||
+ | |||
+ | Update 2018-02-22: A list of current blockers: https://gist.github.com/tipabu/833b03a865dba96e9fa2230b82f5d075 | ||
+ | |||
+ | Update 2018-03-06: Current list of blockers with progress notes: https://etherpad.openstack.org/p/Swift_py3 | ||
+ | |||
+ | |- | ||
− | === | + | | [https://pypi.python.org/pypi/trove trove] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | trove-devstack-base || |
+ | Status at 2019-01-06: | ||
+ | Unit tests - 1708 tests, 1707 passed, 1 skipped. | ||
− | + | Integration tests are based on trove-devstack-base job. | |
− | Status | + | Status at 2016-07-25: 1,155 / 2,014 (run_tests.py: 398; testr: 1,521; generate_examples: 95) unit tests (57%), TODO: 859 tests |
− | + | Status at 2016-06-22: 839 (testtools) / 1,992 (run_tests.py: 398; testr: 1,499; generate_examples: 95) unit tests (42%), TODO: 1,153 tests | |
− | + | Status at 2018-02-22: It appears that only one test is in the blacklist now: guestagent.test_operating_system | |
− | |||
− | + | run_tests.py (proboscis) failures: https://review.openstack.org/#/c/346905/1 | |
− | + | Victor Stinner proposed the [https://blueprints.launchpad.net/trove/+spec/trove-python3 trove-python3 blueprint] for Mitaka. | |
− | + | From Victor (3/17/2016): "I propose to discuss Python 3 before the summit. For example, prepare a concrete plan to port Trove to Python 3, list technical issues like MySQL-Python, etc." | |
− | + | Patches: [https://review.openstack.org/#/q/topic:bp/trove-python3,n,z search for the bp/trove-python3 topic]. | |
+ | |- | ||
− | + | |} | |
− | + | === Other OpenStack Applications and Projects === | |
− | |||
− | + | List of all OpenStack projects: [http://git.openstack.org/cgit/openstack/governance/tree/reference/projects.yaml projects.yaml]. | |
− | + | {| class="wikitable sortable" | |
+ | |- | ||
+ | ! style="width: 10%;" | Project !! style="width: 10%;" | Unit tests pass on Python 3 !! style="width: 10%;" | py35 gate || style="width: 20%;" | functional tests !! Comments | ||
+ | |- | ||
− | + | | adjutant || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | Partial* || (*) Adjutant's unit tests include a suite of API tests against Adjutant APIs using DRF's internal test classes. While not true functional tests, they do stand up an internal web server and process real workloads from Adjutant's perspective, with mocking for external APIs and services (Keystone, Nova, Neutron, etc) in the places we touch their clients. This tests 92% of the code, so in all likelihood covers most py3 vs py2 issues. Tempest tests are also planned for later. | |
− | + | |- | |
− | |||
− | |||
− | + | | [https://pypi.python.org/pypi/aodh aodh] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | |
+ | |- | ||
− | + | | [https://pypi.python.org/pypi/barbican barbican] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | unspecified || | |
− | + | Blueprint [https://blueprints.launchpad.net/barbican/+spec/barbican-py3 barbican-py3]. | |
− | [ | + | |- |
− | |||
− | |||
− | |||
− | |||
− | + | | blazar || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | blazar-devstack-dsvm-py35 || | |
+ | |- | ||
− | + | | cloudkitty || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | cloudkitty-tempest-full-python3 || | |
+ | |- | ||
− | + | | [https://pypi.python.org/pypi/congress congress] || style="background-color: lightgreen;" | Yes || style="background-color: orange;" | voting* || style="background-color: lightgreen;" | congress-devstack-py35-api-mysql || | |
− | + | (*)py35 support required tiny modification to antlr3 package, creating debian packaging difficulty | |
− | * | ||
− | + | Random Stacker wrote a [https://blueprints.launchpad.net/congress/+spec/support-python3 support-python3 blueprint]. Patches: [https://review.openstack.org/#/q/project:openstack/congress+branch:master+topic:bp/support-python3,n,z search for the topic bp/support-python3]. | |
|- | |- | ||
− | + | ||
+ | | cyborg || style="background-color: red;" | No job || style="background-color: red;" | No job || style="background-color: red;" | no job || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/designate designate] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | designate-devstack-pdns4-py35 (check queue only) || |
+ | Pradeep Kumar Singh proposed the [https://blueprints.launchpad.net/designate/+spec/designate-py3 blueprint designate-py3] which was accepted for Liberty. Patches: [https://review.openstack.org/#/q/status:open+project:openstack/designate+branch:master+topic:bp/designate-py3,n,z topic:bp/designate-py3]. | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/ec2-api ec2-api] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | openstack-tox-py35 || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/freezer freezer] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || |
− | |||
|- | |- | ||
− | | | + | | karbor || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/kuryr-kubernetes kuryr] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | openstack-tox-py35 || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/magnum magnum] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | (voting: magnum-functional-api) AND (non-voting: magnum-functional-k8s AND magnum-functional-swarm-mode) || |
|- | |- | ||
− | | [https:// | + | | [https://github.com/openstack/manila manila] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | manila-tempest-minimal-dsvm-dummy || || |
|- | |- | ||
− | | [https:// | + | | [https://github.com/openstack/manila-ui manila-ui] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | horizon-openstack-tox-python3-django111 || |
|- | |- | ||
− | | | + | | masakari || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | openstack-tox-py35 || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/mistral mistral] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || |
|- | |- | ||
− | | | + | | monasca-agent || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | monasca-tempest-python3-influxdb || https://storyboard.openstack.org/#!/story/2000975 || |
− | |||
− | |||
− | || | ||
− | |||
− | |||
|- | |- | ||
− | | | + | |
+ | | monasca-api || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | monasca-tempest-python3-influxdb || https://storyboard.openstack.org/#!/story/2000975 || | ||
|- | |- | ||
− | | | + | |
+ | | monasca-log-api || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | monascalog-python3-tempest || | ||
|- | |- | ||
− | | | + | |
+ | | monasca-ui || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || https://storyboard.openstack.org/#!/story/2000975 || | ||
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | |
+ | | [https://pypi.python.org/pypi/murano murano] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
+ | Blueprint: [https://blueprints.launchpad.net/murano/+spec/murano-python-3-support murano-python-3-support]. | ||
|- | |- | ||
− | | | + | |
+ | | murano-agent || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
+ | Blueprint: [https://blueprints.launchpad.net/murano/+spec/murano-python-3-support murano-python-3-support]. | ||
|- | |- | ||
− | | [https:// | + | | [https://wiki.openstack.org/wiki/Octavia octavia] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | octavia-tox-functional-py35 || |
|- | |- | ||
− | | | + | | panko || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | panko-tox-py35-mysql and panko-tox-py35-postgresql || |
|- | |- | ||
− | | | + | | qinling || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || |
|- | |- | ||
− | | [https://pypi.python.org/pypi/ | + | | [https://pypi.python.org/pypi/rally rally] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | rally-tox-functional-py3 and rally-tox-self || |
+ | A big thank to Andrey Kurilin for a lot of work in this direction | ||
|- | |- | ||
− | | [https:// | + | | [https://wiki.openstack.org/wiki/Searchlight searchlight] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | openstack-tox-py36 || |
|- | |- | ||
− | | [https:// | + | | [https://wiki.openstack.org/wiki/Senlin senlin] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | senlin-dsvm-tempest-py35-api, senlin-dsvm-tempest-py35-functional, senlin-dsvm-tempest-py35-integration (check only, non-voting) || |
|- | |- | ||
− | | [https:// | + | | [https://wiki.openstack.org/wiki/Solum solum] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | solum-devstack-py35 (check only) || |
− | + | Victor Stinner proposed the [https://blueprints.launchpad.net/solum/+spec/solum-python3 blueprint solum-python3] which was approved. Patches: [https://review.openstack.org/#/q/status:open+topic:bp/solum-python3,n,z search for bp/solum-python3 topic] (open reviews). | |
+ | |- | ||
− | + | | storlets || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job (likely blocked on swift) || | |
|- | |- | ||
− | | | + | | tacker || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: orange;" | tacker-functional-devstack-python3 (check only, non-voting) || |
|- | |- | ||
− | | | + | |
+ | | tricircle || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
|- | |- | ||
− | | | + | |
+ | | vitrage || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | vitrage-dsvm-api-py35 and vitrage-dsvm-datasources-py35 || | ||
|- | |- | ||
− | | [https:// | + | |
+ | | [https://wiki.openstack.org/wiki/Watcher watcher] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
|- | |- | ||
− | | [https:// | + | |
− | + | | [https://wiki.openstack.org/wiki/Zaqar zaqar] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | |
− | |||
− | |||
− | || | ||
|- | |- | ||
− | | [https:// | + | |
+ | | [https://github.com/openstack/zun zun] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | zun-tempest-py35-docker-sql || | ||
|- | |- | ||
− | | | + | |
+ | | networking-l2gw || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: red;" | no job || | ||
|- | |- | ||
− | | [https://pypi | + | |
+ | | [https://pypi.org/project/vmware-nsx vmware-nsx] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | All 3rd part CI jobs are running python 3 || | ||
|- | |- | ||
− | | [https://pypi | + | |
+ | | [https://pypi.org/project/vmware-nsxlib vmware-nsxlib] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | tempest-api-vmware-nsxv3 is running python 3.5 and is voting || | ||
|- | |- | ||
+ | |- | ||
|} | |} | ||
− | == | + | Unsorted projects: |
+ | * [https://wiki.openstack.org/wiki/App-Catalog App Catalog] | ||
+ | * Chef OpenStack (Ruby) | ||
+ | * [https://github.com/openstack/kolla/ Kolla]: ~2100 lines of Python, but not "tox -e py27" target | ||
+ | * OpenStack Ansible (Python): Ansible playbooks and roles for deployment | ||
+ | * Puppet OpenStack (Ruby) | ||
+ | * TripleO | ||
+ | |||
+ | === Enable Python 3 in DevStack === | ||
+ | |||
+ | * Fedora:: | ||
+ | |||
+ | sudo dnf install python3-devel | ||
+ | sudo python3 -m pip install python-memcached # needed by keystonemiddleware | ||
+ | |||
+ | * localrc: add the following line | ||
+ | |||
+ | USE_PYTHON3=True | ||
+ | |||
+ | See [https://review.openstack.org/#/c/414176/ Switch to python 3.5]. | ||
+ | |||
+ | === Functional and Integration Tests === | ||
+ | |||
+ | Etherpad: https://etherpad.openstack.org/p/support-python3.5-functional-tests | ||
+ | |||
+ | Doug Hellmann wrote a cross-project specification to run integration tests on Python 3: [http://specs.openstack.org/openstack/openstack-specs/specs/enable-python-3-int-func-tests.html Enabling Python 3 for Application Integration Tests] (spec approved for Liberty). | ||
+ | |||
+ | Patch for DevStack: [https://review.openstack.org/#/c/181165/ Enable optional Python 3 support]. | ||
+ | |||
+ | Projects wanting to run their existing functional test suite against their services on Python 3 should:- | ||
+ | * Add the Python3.4 trove classifier to the setup.cfg configuration file of the respective service. | ||
+ | * set USE_PYTHON3=True in Devstack's localrc config file before running stack.sh after [https://review.openstack.org/#/c/181165/ the DevStack change] is merged or cherry-pick until then. | ||
+ | * set basepython = python3.5 in tox for the necessary functional/integration tests environment. | ||
+ | |||
+ | Then run tox -e<your functional test suite name>. Example:- tox -efunctional to run the functional the tests of a certain project. | ||
+ | |||
+ | Once the functional test suite is reliably passing against the service in a python 3.5 env, the trove classifiers must be updated along with a new gate job being added to the project. | ||
+ | |||
+ | Sirushti Murugesan's attempt on Heat: https://review.openstack.org/#/c/188033/ | ||
+ | |||
+ | === Python 3.5 === | ||
+ | |||
+ | * project-config: [https://review.openstack.org/#/c/336272/ Add python35 jobs] | ||
+ | * nova: [https://review.openstack.org/#/c/336432/ Add a py35 environment to tox] | ||
+ | * Neutron issues: https://bugs.launchpad.net/neutron/+bug/1559191 | ||
+ | * There is no Jenkins job using Python 3.5 yet | ||
+ | * /usr/bin/python3 is Python 3.5 in Fedora 24, Ubuntu 16.04 LTS (Xenial Xerus) and Debian Stretch (Testing) | ||
+ | |||
+ | === Python 3.6 status === | ||
+ | |||
+ | Python 3.6 is scheduled to be the default/only version of Python available in Ubuntu 18.04 LTS (Bionic Beaver) and Debian 10 (Buster). | ||
+ | |||
+ | Known issues: | ||
+ | |||
+ | * eventlet<0.21.0 is broken with Python 3.6, see https://github.com/eventlet/eventlet/issues/371. There is also https://github.com/eventlet/eventlet/issues/401 which is fixed in 0.22.0, so it might seem feasible to upgrade to eventlet-0.22.1 once we can do proper testing. | ||
+ | * Horizon explicitly only claims support for Python 3.5, when running devstack with Python 3.6 one needs to set: | ||
+ | ENABLED_PYTHON3_PACKAGES=horizon | ||
+ | |||
+ | == Status of Python 3 in Linux distributions == | ||
+ | * ArchLinux already [https://www.archlinux.org/news/python-is-now-python-3 switched to Python 3 by default] in 2011 | ||
+ | * Ubuntu wants to remove Python 2 from the default installation for Ubuntu 18.04 LTS: see [https://wiki.ubuntu.com/Python (Python) Plans for 18.04]. | ||
+ | * Fedora schedules the switch in Fedora 23 (october 2015): [https://fedoraproject.org/wiki/Changes/Python_3_as_Default Python 3 as the Default Implementation] | ||
+ | ** [http://fedora.portingdb.xyz/ Python 3 Porting Database for Fedora] and [http://fedora.portingdb.xyz/history/ history of packages tracked by the Fedora portingdb] | ||
+ | ** [https://lwn.net/Articles/690676/ Python 3 in Fedora] (Python 3 in Fedora) | ||
+ | * RHEL: [https://www.softwarecollections.org/en/scls/rhscl/python33/ Python 3.3] and [https://www.softwarecollections.org/en/scls/rhscl/rh-python34/ Python 3.4] are available on RHEL6 and RHEL7 using SCL. | ||
+ | * CentOS: [https://www.softwarecollections.org/en/scls/rhscl/python33/ Python 3.3] and [https://www.softwarecollections.org/en/scls/rhscl/rh-python34/ Python 3.4] are available on CentOS 6 and 7 using SCL (no Red Hat subscription needed, CentOS has its own flavor of SCL) | ||
+ | * In Debian, the plan is to deprecate Python 2 in Stretch (aka: Debian 9, the next Stable Debian after Jessie) and to completely remove Python 2 for the Buster release of Debian (aka: Debian 10, to be released in approximatively 2019). | ||
+ | |||
+ | Check the [https://governance.openstack.org/tc/reference/project-testing-interface.html#linux-distributions Project Testing Interface] for updates about the platforms each release is tested on. | ||
+ | |||
+ | == Status of Python 2 Support Being Dropped in Dependencies == | ||
+ | |||
+ | * Django 2.0 will not include Python 2 support (23 Jan 2017 we use Django>=1.8,<1.9) | ||
+ | ** https://github.com/django/django/pull/7867/files | ||
+ | ** https://github.com/django/django/pull/7871/files | ||
+ | * Pylons/Pyramid are also considering dropping Python 2 | ||
+ | ** https://github.com/Pylons/pyramid/issues/2903 | ||
+ | ** This is the same team that maintains webob, but it isn't clear if they intend to also drop support there. | ||
+ | |||
+ | [https://governance.openstack.org/tc/resolutions/20180529-python2-deprecation-timeline.html OpenStack plans to start dropping Python 2 support at the start of the U cycle] | ||
+ | |||
+ | == Progress reports, meetings and sprints == | ||
+ | |||
+ | * Pike PTG: https://etherpad.openstack.org/p/ptg-pike-python35 | ||
+ | * Ocata Summit | ||
+ | ** https://etherpad.openstack.org/p/ocata-python-3 | ||
+ | * openstack-dev: [http://lists.openstack.org/pipermail/openstack-dev/2016-June/097930.html Status of the OpenStack port to Python 3] (Jun 22, 2016). 80 projects/83 (96%) have unit tests passing on Python 3, TODO (3): Nova, Swift and Trove. | ||
+ | * Mitaka Summit | ||
+ | ** Cross-project session: Python 3 was proposed, https://etherpad.openstack.org/p/mitaka-cross-project-session-planning | ||
+ | * Liberty Summit | ||
+ | ** Cross-project session on enabling app integration testing: https://etherpad.openstack.org/p/liberty-cross-project-python3 | ||
* Kilo Summit | * Kilo Summit | ||
** Doug Hellmann: "Moving our applications to Python 3" cross-project session | ** Doug Hellmann: "Moving our applications to Python 3" cross-project session | ||
Line 700: | Line 853: | ||
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3 | * Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3 | ||
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3 | * Havana summit notes: https://etherpad.openstack.org/p/havana-python3 | ||
+ | |||
+ | == Articles == | ||
+ | |||
+ | * [http://blogs.rdoproject.org/7894/status-of-python-3-in-openstack-mitaka Status of Python 3 in OpenStack Mitaka] (Victor Stinner, March 2016) | ||
+ | * [http://techs.enovance.com/7807/python-3-status-openstack-liberty Python 3 Status in OpenStack Liberty] (Cyril Roelandt and Victor Stinner, September 2015) | ||
+ | * [http://techs.enovance.com/6722/status-of-the-openstack-port-to-python-3-2 Status of the OpenStack port to Python 3] (Cyril Roelandt, February 2014) | ||
+ | * [http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?] (Victor Stinner, December 2013) | ||
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 == | == Pycon Montreal 2014: Sprint Port OpenStack to Python 3 == | ||
Enovance organized a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday) 2014. See the page [[Python3/SprintPycon2014]]. | Enovance organized a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday) 2014. See the page [[Python3/SprintPycon2014]]. |
Revision as of 14:17, 7 March 2019
This page tracks the progress of Python 3 effort porting for OpenStack.
Contents
- 1 IRC: #openstack-dev
- 2 Python 3
- 3 Python 2: Python 2.6 support dropped, Python 2.7 only
- 4 Port Python 2 code to Python 3
- 4.1 Before you begin
- 4.2 sixer tool
- 4.3 Common patterns
- 4.4 Serialization: base64, JSON, etc.
- 4.5 contextlib.nested
- 4.6 oslo_utils.encodeutils.to_utf8
- 4.7 bytes.decode and unicode.encode
- 4.8 safe_decode
- 4.9 safe_encode
- 4.10 logging module and format exceptions
- 4.11 HTTP
- 4.12 References to port Python 2 code to Python 3
- 4.13 Common pitfalls
- 5 Python 3 Status of OpenStack projects
- 5.1 Common Libraries (Oslo Projects)
- 5.2 Development tools
- 5.3 OpenStack clients
- 5.4 OpenStack Libraries
- 5.5 Dependencies: Environment markers
- 5.6 OpenStack applications (tc:approved-release)
- 5.7 Other OpenStack Applications and Projects
- 5.8 Enable Python 3 in DevStack
- 5.9 Functional and Integration Tests
- 5.10 Python 3.5
- 5.11 Python 3.6 status
- 6 Status of Python 3 in Linux distributions
- 7 Status of Python 2 Support Being Dropped in Dependencies
- 8 Progress reports, meetings and sprints
- 9 Articles
- 10 Pycon Montreal 2014: Sprint Port OpenStack to Python 3
IRC: #openstack-dev
Join the #openstack-dev IRC channel on the Freenode network to discuss Python 3.
Python 3
Why should OpenStack move to Python 3 right now?
- Python 3 is usually seen as the new Python version which breaks compatibility and raises new Unicode issues. Python 3 is much more than that. It’s a new clean language which has a more consistent syntax. It has many new features, not less than 15 new modules. Python 3 is already well supported by major Linux distributions, whereas Python 2.7 reached its end-of-life. Slowly, some bugs cannot be fixed in Python 2.7 anymore and are only fixed in the latest Python 3 release. Python 3 is now 5 years old and considered as a mature programming language.
Python 2: Python 2.6 support dropped, Python 2.7 only
OpenStack Liberty targets Python 2.7 and 3.4.
Python 2.6 support is being dropped in OpenStack since OpenStack Juno for servers. Python 2.6 support is currently kept in Oslo libraries and clients. See juno-cross-project-future-of-python etherpad.
Python 3.3 support is being dropped since OpenStack Liberty.
Python 2.6 is slowly being dropped in the whole OpenStack project, ex: Remove p26 job from DIB.
Python 2.6 support will be removed in Oslo and Clients clients for OpenStack Mitaka: Oslo libraries dropping python 2.6 compatability.
Port Python 2 code to Python 3
OpenStack project chose to use the same code base for Python 2 and Python 3. The Six: Python 2 and 3 Compatibility Library helps to write code working on both versions. OpenStack supported Python 2.6 for RHEL up to Juno, but not Python 2.5 and older. As we are targeting Python 3.4 and up, there is no need to avoid u'unicode' syntax. Do not use six.u('unicode').
Before you begin
If you're doing development with Ubuntu/Debian (and not using devstack with the USE_PYTHON flag set), then you'll need the following packages installed to run the py34 tox unit test targets in the projects:
sudo apt-get install python3.4 python3.4-dev
sixer tool
The sixer tool helps to replace most basic patterns to add Python 3 compatibility and it respects OpenStack coding style.
Common patterns
- Replace "for key in dict.iterkeys()" with "for key in dict"
- Replace dict.iteritems() with dict.items()
- Replace dict.itervalues() with dict.values()
Note: Replacing dict.iteritems()/.itervalues() with six.iteritems(dict)/six.itervalues(dict) was preferred in the past, but there was a discussion suggesting to avoid six for this. The overhead of creating a temporary list on Python 2 is negligible.
- Replace iterator.next() with next(iterator)
- Replace basestring with six.string_types
- Replace unicode with six.text_type
- Replace (str, unicode) with six.string_types
- Replace (int, long) with six.integer_types
- Replace func.func_name with func.__name__
- Replace exceptions.OSError with OSError and remove "import exceptions"
- map() and filter() if a list is needed on Python 3:
- Replace map(func, data) with [func(item) for item in data]
- Replace filter(lambda obj: test(obj), data) with [obj for obj in data if test(obj)]
- Note: Usually, tests fail because map() or filter() objects have no length
Serialization: base64, JSON, etc.
- [with oslo.serialization 1.10 or newer] Get the base64 module from oslo_serialization (from oslo_serialization import base64) to get functions:
- oslo_serialization.base64.decode_as_bytes(encoded)
- oslo_serialization.base64.decode_as_text(encoded, encoding='utf-8')
- oslo_serialization.base64.encode_as_bytes(s, encoding='utf-8')
- oslo_serialization.base64.encode_as_text(s, encoding='utf-8')
- Replace text.encode('base64') and base64.b64encode(text) with:
- base64.b64encode(text): only accept bytes and returns bytes,
- or: oslo_serialization.base64.encode_as_bytes(text): accept bytes or Unicode and returns bytes
- or: oslo_serialization.base64.encode_as_text(text): accept bytes and Unicode and returns Unicode
- Warning: base64.encodestring(raw) adds a newline ("\n"), whereas encode_as_bytes() and encode_as_text() don't.
- Replace raw.decode('base64') with:
- base64.b64decode(raw): return bytes
- oslo_serialization.base64.decode_as_bytes(encoded): accept bytes and Unicode, returns bytes
- oslo_serialization.base64.decode_as_text(encoded): accept bytes and Unicode, returns Unicode
Hexadecimal:
- Replace raw.decode('hex') with binascii.unhexlify(raw)
- Replace bytes.encode('hex') with binascii.hexlify(bytes)
JSON:
- [with oslo.serialization 1.10 or newer] Replace json.dumps(obj) with oslo_serialization.jsonutils.dump_as_bytes(obj)
- Replace json.loads(obj) with oslo_serialization.jsonutils.loads(obj): it accepts bytes and Unicode, bytes is decoded from UTF-8. It avoids "if isinstance(obj, bytes): obj = obj.decode('utf-8')" which may require a second temporary variable.
contextlib.nested
To replaced contextlib.nested is to use contextlib.ExitStack. It's available on Python 2 using contextlib2.ExitStack. For contextlib.nested, nova/test.py defines:
if six.PY3: @contextlib.contextmanager def nested(*contexts): with contextlib.ExitStack() as stack: yield [stack.enter_context(c) for c in contexts] else: nested = contextlib.nested
Another option to replaced contextlib.nested is to use the @mock.patch decorator. Example with nested function:
def test_thing(self): @mock.patch(...) @mock.patch(...) @mock.patch(...) def do_test(...): ...
do_test()
More options:
- Mock provides a context that patches multiple things so that no nesting is needed: mock.patch.multiple()
- oslotest provides fixtures for mock, so you don't need a context: oslotest.mockpatch.
oslo_utils.encodeutils.to_utf8
oslo.utils 3.5 has an oslo_utils.encodeutils.to_utf8() function to encode Unicode to UTF-8 and return bytes unchanged.
bytes.decode and unicode.encode
Python has a notion of "default encoding": sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.
Don't write data.decode()
or text.encode()
without parameter, because you will use a different encoding on Python 2 and Python 3.
Use an explicit encoding instead. Example: data.decode('utf-8')
or text.encode('utf-8')
. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).
safe_decode
Olso Incubator has a function safe_decode() which can be used to decode a bytes string and pass text strings unchanged.
The default encoding is sys.stdin.encoding or sys.getdefaultencoding()
:
- Python 3: the locale encoding, or UTF-8 if sys.stdin is "mocked" (io.StringIO instance)
- Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is "mocked" (StringIO.StringIO instance)
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is "mocked".
Safe usage:
-
safe_decode(data, 'utf-8')
: decode bytes from UTF-8 or returns data unchanged if it's already a text string
Unsafe usage:
-
safe_decode(data)
By default, the decoder is strict. You can specify a different error handler using the optional errors
parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.
safe_encode
Olso Incubator has a function safe_encode() which can be used to encode a string. Its usage is tricky and you should understand how it works and which encodings are used.
-
safe_encode(text)
encodes text to the output encoding -
safe_encode(bytes)
may decode the string and then reencode to a different encoding if input and output encodings are different
The default input encoding (incomding
parameter) is sys.stdin.encoding or sys.getdefaultencoding()
:
- Python 3: the locale encoding, or UTF-8 if sys.stdin is "mocked" (io.StringIO instance)
- Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is "mocked" (StringIO.StringIO instance)
The default output encoding (encoding
parameter) is UTF-8.
It's safer to explicit the input encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is "mocked".
Safe usage:
-
safe_encode(data, incoming='utf-8')
: encode text to UTF-8 or returns data unchanged if it's already a bytes string (since the input and output encoding are UTF-8)
Unsafe usage:
-
safe_encode(data)
Example:
-
safe_encode(b'\xe9', incoming='latin-1')
returnsb'\xc3\xa9'
.
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional errors
parameter. Example: safe_encode(b'[\xff]', incoming='ascii', errors='ignore')
returns b'[]'
.
logging module and format exceptions
The exception_to_unicode(exc)
function of oslo_utils.encodeutils is the recommanded way to format an exception to Unicode. This function works on Python 2 and Python 3 and it should avoid mojibake is most cases.
On Python 2, the logging module accepts bytes and text strings. On Python 3, it only accepts text strings. For example, logging.error(b'hello') logs b'hello'
instead of 'hello'
.
There is no clear rule for format exceptions yet. There are different choices depending on the project:
-
str(exc)
: native string, so use bytes on Python 2 -
six.text_type(exc)
: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2:unicode(Exception("nonascii:\xe9"))
. -
six.u(str(exc))
: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex:unicode(str(Exception("\xff")))
-
LOG.exception(_LE("... %(exc)s ..."), {"exc": exc, ...})
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using str(exc)
. Example: LOG.debug(str(exc))
.
HTTP
The HTTP protocol is based on bytes:
- HTTP body contains bytes. For example, use io.BytesIO for a stream storing an HTTP body.
- HTTPConnection.getresponse().read() returns bytes (in Python 3, str which is bytes in Python 2)
- On Python 3, the http.client accepts text for HTTP headers: keys are encoded to ASCII and values to ISO 8859-1 (which is only a small subset of the Unicode charset)
- It looks like Swift encodes internally HTTP headers to UTF-8 (directly using the UTF-8 encoding, not using a MIME encoding like =?UTF-8?Q?...?=. See the HTTP [RFC 2047 http://www.ietf.org/rfc/rfc2047.txt] and HTTP header should use what character encoding?
References to port Python 2 code to Python 3
- Porting to Python 3 Book by Lennart Regebro, especially the Language differences and workarounds.
- HOWTO: Porting Python 2 Code to Python 3 by Brett Cannon
- Porting Python Code to 3.x
- python-incompatibility: Demonstrates incompatibilities between Python versions.
Common pitfalls
What is a string ?
You should definitely not talk about "strings" in your commit logs/reviews. In Python 2, a 'string' is bytes; in Python 3, it's a Unicode text string. The following code snippet may help in understanding the difference:
Python 2:
>>> type('foo') <type 'str'> >>> type(u'foo') <type 'unicode'> >>> type(b'foo') <type 'str'> >>> isinstance('foo', six.text_type) False >>> isinstance(u'foo', six.text_type) True >>> bytes is str True >>> b'foo'[0] 'f'
Python 3:
>>> type('foo') <class 'str'> >>> type(u'foo') <class 'str'> >>> type(b'foo') <class 'bytes'> >>> isinstance('foo', six.text_type) True >>> isinstance(b'foo', six.text_type) False >>> bytes is str False >>> b'foo'[0] 102
tox/testr error: db type could not be determined
The "db type could not be determined" error comes from .testrepository/times.dbm used by testr.
Workaround: "rm -rf .testrepository/" and then run "tox -e py34" before running "tox -e py27". You only have to do this once. The problem only occurs with "tox -e py34" when .testrepository/ was created by Python 2.
Python 3 Status of OpenStack projects
Common Libraries (Oslo Projects)
See programs.yaml for the list of Common Libraries.
Project | Python 3 compatibility | Comment |
---|---|---|
automaton | Yes | |
castellan | Yes | |
cliff | Yes | |
debtcollector | Yes | |
futurist | Yes | |
oslo.cache | Yes | |
oslo.concurrency | Yes | |
oslo.config | Yes | |
oslo.context | Yes | |
oslo.db | Yes |
PyMySQL driver is now used by default for MySQL. setup.cfg contains the Python 3 classifier. |
oslo.i18n | Yes | |
oslo.log | Yes | |
oslo.messaging | Yes |
oslo.messaging is now fully compatible with Python 3. The old (and now removed) Qpid transport was not compatible, the AMQP driver was ported recently. |
oslo.middleware | Yes | |
oslo.policy | Yes | |
oslo.privsep | Yes | |
oslo.reports | Yes | |
oslo.rootwrap | Yes | |
oslo.serialization | Yes | |
oslo.service | Partial |
WSGI module SSL support is broken under Python 3. We want projects to support deployment without relying on that code, but not all do (see glance and designate below). |
oslotest | Yes | |
oslo.versionedobjects | Yes | |
oslo.vmware | Yes | Supports Python 3 since oslo.vmware 0.13.0 |
oslo.utils | Yes | |
pylockfile | Yes | |
stevedore | Yes | |
taskflow | Yes | |
tooz | Yes |
Development tools
Project | Python 3 compatibility | Comment |
---|---|---|
cookiecutter | yes | |
hacking | yes | |
pbr | yes | |
stackforge/python-jenkins | yes | py33 gate is voting |
openstack-infra/jenkins-job-builder | partial | https://review.openstack.org/172238 |
OpenStack clients
Project | Python 3 compatibility | CI tests running? | Python 3 classifiers ? | Blocked by | Comment |
---|---|---|---|---|---|
keystonemiddleware | Yes | Voting | On PyPI | python-memcached | keystonemiddleware 1.6.1 supports Python 3. |
python-barbicanclient | Yes | Voting | On PyPI | ||
python-ceilometerclient | Yes | Voting | On PyPI | ||
python-cinderclient | Yes | Voting | On PyPI | ||
python-fuelclient | Yes | voting | On PyPI | ||
python-glanceclient | Yes | Voting | On PyPI | ||
python-heatclient | Yes | Voting | On PyPI | ||
python-ironicclient | Yes | Voting | On PyPI | ||
python-keystoneclient | Yes | Voting | On PyPI | ||
python-manilaclient | Yes | Voting | On PyPI | ||
python-marconiclient | Yes | Voting | On PyPI | ||
python-masakariiclient | Yes | Voting | On PyPI | ||
python-monascaclient | Yes | Voting | On PyPI | ||
python-novaclient | Yes | Voting | On PyPI | ||
python-neutronclient | Yes | Voting | On PyPI | ||
python-octaviaclient | Yes | Voting | On PyPI | ||
python-openstackclient | Yes | Voting | On PyPI | As of 0.9 | |
python-saharaclient | Yes | Voting | On PyPI | ||
python-searchlightclient | Yes | Voting | On PyPI | ||
python-senlinclient | Yes | Voting | On PyPI | ||
python-swiftclient | Yes | Voting | On PyPI | ||
python-tuskarclient | Yes | Voting | On PyPI | ||
python-troveclient | Yes | Voting | On PyPI | ||
python-watcherclient | Yes | Voting | On PyPI | ||
python-designateclient | Yes | Voting | On PyPI |
OpenStack Libraries
Project | Python 3 compatibility | CI tests running? | Python 3 classifiers ? | Comment |
---|---|---|---|---|
blazar-nova | Yes | voting | Yes | |
ceilometermiddleware | Yes | voting | Yes | |
django_openstack_auth | Yes | voting | Yes |
django_openstack_auth 2.0 is fully compatible with Python 3. |
glance_store | Yes | voting | Yes | glance_store 0.7.0 added the Python 3 support. |
heat-translator | Yes | voting | Yes | |
ironic-lib | Yes | voting | Yes | |
keystoneauth | Yes | voting | Yes | |
keystonemiddleware | Yes | voting | Yes | |
ldappool | Yes | voting | Yes | |
monasca-statsd | Yes | voting | Yes | |
mistral-lib | Yes | voting | Yes | |
neutron-lib | Yes | voting | Yes | |
octavia-lib | Yes | voting | Yes | |
os-brick | Yes | voting | Yes | os-brick 0.3.2 added Python 3 support. |
os-client-config | Yes | voting | Yes | |
os-traits | Yes | voting | Yes | |
os-vif | Yes | voting | Yes | |
os-win | Yes | voting | Yes | |
osc-lib | Yes | voting | Yes | |
osc-placement | Yes | voting | Yes | |
pycadf | Yes | voting | Yes | |
shade | Yes | voting | Yes | |
sqlalchemy-migrate | Yes | voting | Yes | |
sushy | Yes | voting | Yes | |
taskflow | Yes | voting | Yes | |
tosca-parser | Yes | voting | Yes |
Dependencies: Environment markers
Example to not install the "futures" dependency on Python 3.3 and newer:
futures; python_version < '3.2'
OpenStack applications (tc:approved-release)
OpenStack applications approved by the OpenStack Technical Committee.
Project | Unit tests pass on Python 3 | py35 gate | functional tests | Comments |
---|---|---|---|---|
ceilometer | Yes | voting | no job | |
cinder | Yes | voting | integrated-gate-py35 |
cinder-python3 blueprint (written by Victor Stinner) has been accepted for Liberty. Patches: bp/cinder-python3 topic. Note: Commit message must use "Partial-Implements: blueprint cinder-python3" to be linked to the blueprint. Kendall Nelson, Ivan Kolodyazhny (core) and Eric Harney (core) prefer this syntax: see COMMIT_MSG. |
designate | Yes | voting | designate-bind9-py36 designate-bind9-py35 | Relies on oslo.service WSGI code that does not work under Python 3 with SSL. Functional tempest tests are ran on both of these jobs. [1] |
glance | Yes | voting | integrated-gate-py35 | Relies on oslo.service WSGI code that does not work under Python 3. [2]
Victor Stinner is working on porting Glance to Python3. Patches: Patches for glance (topic: py3). |
heat | Yes | voting | heat-functional-convg-mysql-lbaasv2-py35 |
Sirushti Murugesan wrote and implemented the spec Python34 Support (which was accepted for Liberty). Mitaka version will fully support Python 3. Great job Sirushti Murugesan who did almost all the work! |
horizon | Yes | voting | horizon-openstack-tox-python3-django111,horizon-integration-tests, horizon-dsvm-tempest-plugin |
George Peristerakis wrote Make Horizon python3.4 compatible in May 2015, the blueprint was approved. Patches: bp/porting-python3 topic. |
ironic | Yes | voting | ironic-tempest-dsvm-ipa-partition-pxe_ipmitool-tinyipa-python3 |
Python 3.4 unit tests are now being run for openstack/ironic. The unit tests are a voting job. Thanks to Victor Sergeyev for all of his work to update the Ironic code to make it pass the unit tests using Python 3.4: Run tests in py34 environment |
keystone | Yes | voting | integrated-gate-py35 |
The move to pyldap and new ldappool were major hurdles solved in Newton. Great work by the Keystone team to get the last things through the gate in Newton. |
neutron | Yes | voting | integrated-gate-py35 |
Porting to Python 3 spec (by Cyril Roelandt) accepted for Liberty, port in progress. Patches of the blueprint neutron-python3 |
neutron-lbaas | Yes | voting | neutron-lbaasv2-dsvm-py3x-api and neutron-lbaasv2-dsvm-py3x-api-namespace |
Patches: topic:bp/neutron-python3. |
neutron-fwaas | Yes | voting | neutron-fwaas-networking-midonet-cross-py35 (non-voting) | |
neutron-vpnaas | Yes | voting | no job | |
nova | Yes | voting | integrated-gate-py35 |
Status at 2019-01-24: Unit tests all running and voting under Python 3 via the use of the mox3 package. There are only 3 unit test files left that are using mox3 (nova/tests/unit/cells/test_cells_messaging.py, nova/tests/unit/network/test_neutronv2.py, nova/tests/unit/network/test_manager.py). We advised contributors not to spend time replacing mox in files testing cells v1 and nova-network (test_cells_messaging.py and test_manager.py), as both are slated for removal as soon as we're able. Progress is being tracked at: https://blueprints.launchpad.net/nova/+spec/mox-removal-stein |
sahara | Yes | voting | sahara-tests-scenario-py3 (experimental) | Status at 2018-02-23: the job fails during devstack deployment, because swift does not start. The list of its dependencies is minimal and components like keystone are optional. This was partially addressed with an extra dependency: https://review.openstack.org/#/c/544121/ but this requires a) support in devstack (tentative support in https://review.openstack.org/#/c/544383/) b) at least another extra, or a more generic way of doing this; even with an additional extra explicitly required in devstack, the extras would be installed from pip breaking the test of depending patches.
We are facing an issue with pickle library and python 3, once that gets fixed we can try to make the python 3 gate voting. |
swift | blocked | voting | no job |
Status at 2016-06-22: 3/4,498 unit tests (0%), TODO: 4,495 tests Update (2016-06-27): master branch is currently in a soft-freeze in order to get encryption middleware merged Python 3 bugs: https://bugs.launchpad.net/swift/+bug/1614289 Plan to add Python 3 support to Swift. Patches: Patches with the topic py3 Python 3 unit tests require liberasurecode >= 1.0.9 and PyEClib >= 1.0.9. To install liberasurecode (in /usr): git clone https://bitbucket.org/tsg-/liberasurecode/ cd liberasurecode /autogen.sh && /configure --prefix=/usr && make && sudo make install liberasurecode >= 1.0.9 is available in Ubuntu Precise, Ubuntu Trusty, Fedora 22, Fedora 23 and CentoOS 7. Update 2018-02-22: A list of current blockers: https://gist.github.com/tipabu/833b03a865dba96e9fa2230b82f5d075 Update 2018-03-06: Current list of blockers with progress notes: https://etherpad.openstack.org/p/Swift_py3 |
trove | Yes | voting | trove-devstack-base |
Status at 2019-01-06: Unit tests - 1708 tests, 1707 passed, 1 skipped. Integration tests are based on trove-devstack-base job. Status at 2016-07-25: 1,155 / 2,014 (run_tests.py: 398; testr: 1,521; generate_examples: 95) unit tests (57%), TODO: 859 tests Status at 2016-06-22: 839 (testtools) / 1,992 (run_tests.py: 398; testr: 1,499; generate_examples: 95) unit tests (42%), TODO: 1,153 tests Status at 2018-02-22: It appears that only one test is in the blacklist now: guestagent.test_operating_system run_tests.py (proboscis) failures: https://review.openstack.org/#/c/346905/1 Victor Stinner proposed the trove-python3 blueprint for Mitaka. From Victor (3/17/2016): "I propose to discuss Python 3 before the summit. For example, prepare a concrete plan to port Trove to Python 3, list technical issues like MySQL-Python, etc." Patches: search for the bp/trove-python3 topic. |
Other OpenStack Applications and Projects
List of all OpenStack projects: projects.yaml.
Project | Unit tests pass on Python 3 | py35 gate | functional tests | Comments | |
---|---|---|---|---|---|
adjutant | Yes | voting | Partial* | (*) Adjutant's unit tests include a suite of API tests against Adjutant APIs using DRF's internal test classes. While not true functional tests, they do stand up an internal web server and process real workloads from Adjutant's perspective, with mocking for external APIs and services (Keystone, Nova, Neutron, etc) in the places we touch their clients. This tests 92% of the code, so in all likelihood covers most py3 vs py2 issues. Tempest tests are also planned for later. | |
aodh | Yes | voting | no job | ||
barbican | Yes | voting | unspecified |
Blueprint barbican-py3. | |
blazar | Yes | voting | blazar-devstack-dsvm-py35 | ||
cloudkitty | Yes | voting | cloudkitty-tempest-full-python3 | ||
congress | Yes | voting* | congress-devstack-py35-api-mysql |
(*)py35 support required tiny modification to antlr3 package, creating debian packaging difficulty Random Stacker wrote a support-python3 blueprint. Patches: search for the topic bp/support-python3. | |
cyborg | No job | No job | no job | ||
designate | Yes | voting | designate-devstack-pdns4-py35 (check queue only) |
Pradeep Kumar Singh proposed the blueprint designate-py3 which was accepted for Liberty. Patches: topic:bp/designate-py3. | |
ec2-api | Yes | voting | openstack-tox-py35 | ||
freezer | Yes | voting | no job | ||
karbor | Yes | voting | no job | ||
kuryr | Yes | voting | openstack-tox-py35 | ||
magnum | Yes | voting | (voting: magnum-functional-api) AND (non-voting: magnum-functional-k8s AND magnum-functional-swarm-mode) | ||
manila | Yes | voting | manila-tempest-minimal-dsvm-dummy | ||
manila-ui | Yes | voting | horizon-openstack-tox-python3-django111 | ||
masakari | Yes | voting | openstack-tox-py35 | ||
mistral | Yes | voting | no job | ||
monasca-agent | Yes | voting | monasca-tempest-python3-influxdb | https://storyboard.openstack.org/#!/story/2000975 | |
monasca-api | Yes | voting | monasca-tempest-python3-influxdb | https://storyboard.openstack.org/#!/story/2000975 | |
monasca-log-api | Yes | voting | monascalog-python3-tempest | ||
monasca-ui | Yes | voting | no job | https://storyboard.openstack.org/#!/story/2000975 | |
murano | Yes | voting | no job |
Blueprint: murano-python-3-support. | |
murano-agent | Yes | voting | no job |
Blueprint: murano-python-3-support. | |
octavia | Yes | voting | octavia-tox-functional-py35 | ||
panko | Yes | voting | panko-tox-py35-mysql and panko-tox-py35-postgresql | ||
qinling | Yes | voting | no job | ||
rally | Yes | voting | rally-tox-functional-py3 and rally-tox-self |
A big thank to Andrey Kurilin for a lot of work in this direction | |
searchlight | Yes | voting | openstack-tox-py36 | ||
senlin | Yes | voting | senlin-dsvm-tempest-py35-api, senlin-dsvm-tempest-py35-functional, senlin-dsvm-tempest-py35-integration (check only, non-voting) | ||
solum | Yes | voting | solum-devstack-py35 (check only) |
Victor Stinner proposed the blueprint solum-python3 which was approved. Patches: search for bp/solum-python3 topic (open reviews). | |
storlets | Yes | voting | no job (likely blocked on swift) | ||
tacker | Yes | voting | tacker-functional-devstack-python3 (check only, non-voting) | ||
tricircle | Yes | voting | no job | ||
vitrage | Yes | voting | vitrage-dsvm-api-py35 and vitrage-dsvm-datasources-py35 | ||
watcher | Yes | voting | no job | ||
zaqar | Yes | voting | no job | ||
zun | Yes | voting | zun-tempest-py35-docker-sql | ||
networking-l2gw | Yes | voting | no job | ||
vmware-nsx | Yes | voting | All 3rd part CI jobs are running python 3 | ||
vmware-nsxlib | Yes | voting | tempest-api-vmware-nsxv3 is running python 3.5 and is voting |
Unsorted projects:
- App Catalog
- Chef OpenStack (Ruby)
- Kolla: ~2100 lines of Python, but not "tox -e py27" target
- OpenStack Ansible (Python): Ansible playbooks and roles for deployment
- Puppet OpenStack (Ruby)
- TripleO
Enable Python 3 in DevStack
- Fedora::
sudo dnf install python3-devel sudo python3 -m pip install python-memcached # needed by keystonemiddleware
- localrc: add the following line
USE_PYTHON3=True
See Switch to python 3.5.
Functional and Integration Tests
Etherpad: https://etherpad.openstack.org/p/support-python3.5-functional-tests
Doug Hellmann wrote a cross-project specification to run integration tests on Python 3: Enabling Python 3 for Application Integration Tests (spec approved for Liberty).
Patch for DevStack: Enable optional Python 3 support.
Projects wanting to run their existing functional test suite against their services on Python 3 should:-
- Add the Python3.4 trove classifier to the setup.cfg configuration file of the respective service.
- set USE_PYTHON3=True in Devstack's localrc config file before running stack.sh after the DevStack change is merged or cherry-pick until then.
- set basepython = python3.5 in tox for the necessary functional/integration tests environment.
Then run tox -e<your functional test suite name>. Example:- tox -efunctional to run the functional the tests of a certain project.
Once the functional test suite is reliably passing against the service in a python 3.5 env, the trove classifiers must be updated along with a new gate job being added to the project.
Sirushti Murugesan's attempt on Heat: https://review.openstack.org/#/c/188033/
Python 3.5
- project-config: Add python35 jobs
- nova: Add a py35 environment to tox
- Neutron issues: https://bugs.launchpad.net/neutron/+bug/1559191
- There is no Jenkins job using Python 3.5 yet
- /usr/bin/python3 is Python 3.5 in Fedora 24, Ubuntu 16.04 LTS (Xenial Xerus) and Debian Stretch (Testing)
Python 3.6 status
Python 3.6 is scheduled to be the default/only version of Python available in Ubuntu 18.04 LTS (Bionic Beaver) and Debian 10 (Buster).
Known issues:
- eventlet<0.21.0 is broken with Python 3.6, see https://github.com/eventlet/eventlet/issues/371. There is also https://github.com/eventlet/eventlet/issues/401 which is fixed in 0.22.0, so it might seem feasible to upgrade to eventlet-0.22.1 once we can do proper testing.
- Horizon explicitly only claims support for Python 3.5, when running devstack with Python 3.6 one needs to set:
ENABLED_PYTHON3_PACKAGES=horizon
Status of Python 3 in Linux distributions
- ArchLinux already switched to Python 3 by default in 2011
- Ubuntu wants to remove Python 2 from the default installation for Ubuntu 18.04 LTS: see (Python) Plans for 18.04.
- Fedora schedules the switch in Fedora 23 (october 2015): Python 3 as the Default Implementation
- Python 3 Porting Database for Fedora and history of packages tracked by the Fedora portingdb
- Python 3 in Fedora (Python 3 in Fedora)
- RHEL: Python 3.3 and Python 3.4 are available on RHEL6 and RHEL7 using SCL.
- CentOS: Python 3.3 and Python 3.4 are available on CentOS 6 and 7 using SCL (no Red Hat subscription needed, CentOS has its own flavor of SCL)
- In Debian, the plan is to deprecate Python 2 in Stretch (aka: Debian 9, the next Stable Debian after Jessie) and to completely remove Python 2 for the Buster release of Debian (aka: Debian 10, to be released in approximatively 2019).
Check the Project Testing Interface for updates about the platforms each release is tested on.
Status of Python 2 Support Being Dropped in Dependencies
- Django 2.0 will not include Python 2 support (23 Jan 2017 we use Django>=1.8,<1.9)
- Pylons/Pyramid are also considering dropping Python 2
- https://github.com/Pylons/pyramid/issues/2903
- This is the same team that maintains webob, but it isn't clear if they intend to also drop support there.
OpenStack plans to start dropping Python 2 support at the start of the U cycle
Progress reports, meetings and sprints
- Pike PTG: https://etherpad.openstack.org/p/ptg-pike-python35
- Ocata Summit
- openstack-dev: Status of the OpenStack port to Python 3 (Jun 22, 2016). 80 projects/83 (96%) have unit tests passing on Python 3, TODO (3): Nova, Swift and Trove.
- Mitaka Summit
- Cross-project session: Python 3 was proposed, https://etherpad.openstack.org/p/mitaka-cross-project-session-planning
- Liberty Summit
- Cross-project session on enabling app integration testing: https://etherpad.openstack.org/p/liberty-cross-project-python3
- Kilo Summit
- Doug Hellmann: "Moving our applications to Python 3" cross-project session
- Victor Stinner: "Port nova to Python 3", https://etherpad.openstack.org/p/liberty-nova-summit-ideas
- Juno summit notes: https://etherpad.openstack.org/p/juno-cross-project-future-of-python (Oslo) and https://etherpad.openstack.org/p/juno_swift_python3 (Swift)
- Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3
- Havana summit notes: https://etherpad.openstack.org/p/havana-python3
Articles
- Status of Python 3 in OpenStack Mitaka (Victor Stinner, March 2016)
- Python 3 Status in OpenStack Liberty (Cyril Roelandt and Victor Stinner, September 2015)
- Status of the OpenStack port to Python 3 (Cyril Roelandt, February 2014)
- Why should OpenStack move to Python 3 right now? (Victor Stinner, December 2013)
Pycon Montreal 2014: Sprint Port OpenStack to Python 3
Enovance organized a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday) 2014. See the page Python3/SprintPycon2014.