Jump to: navigation, search

Difference between revisions of "Python3"

(Other OpenStack Applications and Projects)
(Other OpenStack Applications and Projects)
Line 660: Line 660:
| [https://pypi.python.org/pypi/magnum magnum] || style="background-color: lightgreen;" | Yes || style="background-color: lightgreen;" | voting || style="background-color: lightgreen;" | magnum-functional-api AND magnum-functional-k8s AND magnum-functional-swarm-mode ||
| [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) ||

Revision as of 15:48, 4 February 2019

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

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


  • Replace raw.decode('hex') with binascii.unhexlify(raw)
  • Replace bytes.encode('hex') with binascii.hexlify(bytes)


  • [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.


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:
    def nested(*contexts):
        with contextlib.ExitStack() as stack:
            yield [stack.enter_context(c) for c in contexts]
    nested = contextlib.nested

Another option to replaced contextlib.nested is to use the @mock.patch decorator. Example with nested function:

def test_thing(self):
   def do_test(...):

More options:


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).


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 '[]'.


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)


  • safe_encode(b'\xe9', incoming='latin-1') returns b'\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)).


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

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)
   >>> isinstance(u'foo', six.text_type)
   >>> bytes is str
   >>> b'foo'[0]

Python 3:

   >>> type('foo')
   <class 'str'>
   >>> type(u'foo')
   <class 'str'>
   >>> type(b'foo')
   <class 'bytes'>
   >>> isinstance('foo', six.text_type)
   >>> isinstance(b'foo', six.text_type)
   >>> bytes is str
   >>> b'foo'[0]

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-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-devstack-pdns4-py35 Relies on oslo.service WSGI code that does not work under Python 3. [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 no job

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.
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 no job
aodh Yes voting no job
barbican Yes voting unspecified

Blueprint barbican-py3.

blazar Yes voting blazar-devstack-dsvm-py35
cloudkitty Yes voting no job
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 Unknown non-voting no job
mistral Yes voting no job
monasca-agent Yes voting no job 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 no job

A big thank to Andrey Kurilin for a lot of work in this direction

searchlight Yes voting no job
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

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

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:


Status of Python 3 in Linux distributions

Status of Python 2 Support Being Dropped in Dependencies

Progress reports, meetings and sprints


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.