<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lennart+Regebro</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lennart+Regebro"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Lennart_Regebro"/>
		<updated>2026-06-30T18:50:34Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75177</id>
		<title>Python3</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75177"/>
				<updated>2015-03-06T11:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Dependencies */ updated status for sphinxcontrib-httpdomain&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page tracks the progress of Python 3 effort porting for OpenStack.&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?]&lt;br /&gt;
:''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.''&lt;br /&gt;
&lt;br /&gt;
== Port Python 2 code to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
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. Debian Stable provides Python 3 but only Python 3.2, so u'unicode' syntax should be avoided (use six.u('unicode') instead).&lt;br /&gt;
&lt;br /&gt;
=== Common patterns ===&lt;br /&gt;
&lt;br /&gt;
* Replace dict.iteritems() with six.iteritems(dict)&lt;br /&gt;
* Replace iterator.next() with next(iterator)&lt;br /&gt;
* Replace basestring with six.string_types&lt;br /&gt;
* Replace unicode with six.text_type&lt;br /&gt;
&lt;br /&gt;
=== bytes.decode and unicode.encode ===&lt;br /&gt;
&lt;br /&gt;
Python has a notion of &amp;quot;default encoding&amp;quot;: sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.&lt;br /&gt;
&lt;br /&gt;
Don't write &amp;lt;code&amp;gt;data.decode()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode()&amp;lt;/code&amp;gt; without parameter, because you will use a different encoding on Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Use an explicit encoding instead. Example: &amp;lt;code&amp;gt;data.decode('utf-8')&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode('utf-8')&amp;lt;/code&amp;gt;. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).&lt;br /&gt;
&lt;br /&gt;
=== safe_decode ===&lt;br /&gt;
&lt;br /&gt;
Olso Incubator has a function '''safe_decode()''' which can be used to decode a bytes string and pass text strings unchanged.&lt;br /&gt;
&lt;br /&gt;
The default encoding is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data, 'utf-8')&amp;lt;/code&amp;gt;: decode bytes from UTF-8 or returns data unchanged if it's already a text string&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, the decoder is strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.&lt;br /&gt;
&lt;br /&gt;
=== safe_encode ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(text)&amp;lt;/code&amp;gt; encodes text to the output encoding&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(bytes)&amp;lt;/code&amp;gt; may decode the string and then reencode to a different encoding if input and output encodings are different&lt;br /&gt;
&lt;br /&gt;
The default input encoding (&amp;lt;code&amp;gt;incomding&amp;lt;/code&amp;gt; parameter) is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
The default output encoding (&amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter) is UTF-8.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data, incoming='utf-8')&amp;lt;/code&amp;gt;: 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)&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(b'\xe9', incoming='latin-1')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'\xc3\xa9'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: &amp;lt;code&amp;gt;safe_encode(b'[\xff]', incoming='ascii', errors='ignore')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'[]'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== logging module and format exceptions ===&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;b'hello'&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;'hello'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is no clear rule for format exceptions yet. There are different choices depending on the project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;: native string, so use bytes on Python 2&lt;br /&gt;
* &amp;lt;code&amp;gt;six.text_type(exc)&amp;lt;/code&amp;gt;: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2: &amp;lt;code&amp;gt;unicode(Exception(&amp;quot;nonascii:\xe9&amp;quot;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;six.u(str(exc))&amp;lt;/code&amp;gt;: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex: &amp;lt;code&amp;gt;unicode(str(Exception(&amp;quot;\xff&amp;quot;)))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;LOG.exception(_LE(&amp;quot;... %(exc)s ...&amp;quot;), {&amp;quot;exc&amp;quot;: exc, ...})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;. Example: &amp;lt;code&amp;gt;LOG.debug(str(exc))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
The HTTP protocol is based on '''bytes''':&lt;br /&gt;
&lt;br /&gt;
* HTTP body contains '''bytes'''. For example, use io.BytesIO for a stream storing an HTTP body.&lt;br /&gt;
* HTTPConnection.getresponse().read() returns '''bytes''' (in Python 3, '''str''' which is bytes in Python 2)&lt;br /&gt;
* 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)&lt;br /&gt;
* 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://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding  HTTP header should use what character encoding?]&lt;br /&gt;
&lt;br /&gt;
=== References to port Python 2 code to Python 3 ===&lt;br /&gt;
* [http://python3porting.com/ Porting to Python 3 Book] by Lennart Regebro, especially the [http://python3porting.com/differences.html Language differences and workarounds].&lt;br /&gt;
* [http://docs.python.org/dev/howto/pyporting.html HOWTO: Porting Python 2 Code to Python 3] by Brett Cannon&lt;br /&gt;
* [https://wiki.python.org/moin/PortingPythonToPy3k Porting Python Code to 3.x]&lt;br /&gt;
* [http://code.google.com/p/python-incompatibility/  python-incompatibility]: Demonstrates incompatibilities between Python versions.&lt;br /&gt;
&lt;br /&gt;
=== Common pitfalls ===&lt;br /&gt;
&lt;br /&gt;
==== What is a string ? ====&lt;br /&gt;
You should definitely not talk about &amp;quot;strings&amp;quot; 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:&lt;br /&gt;
&lt;br /&gt;
Python 2:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;type 'unicode'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(u'foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    'f'&lt;br /&gt;
&lt;br /&gt;
Python 3:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;class 'bytes'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(b'foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    102&lt;br /&gt;
&lt;br /&gt;
==== tox/testr error: db type could not be determined ====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;db type could not be determined&amp;quot; error comes from .testrepository/times.dbm used by testr.&lt;br /&gt;
&lt;br /&gt;
Workaround: &amp;quot;rm -rf .testrepository/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Python 3 Status of OpenStack projects ==&lt;br /&gt;
&lt;br /&gt;
=== Oslo Incubator ===&lt;br /&gt;
&lt;br /&gt;
'''BLOCKER BUG:''' Tests using testscenarios fail on Python 3 with nosetests because of this bug:&lt;br /&gt;
https://bugs.launchpad.net/testscenarios/+bug/872887&lt;br /&gt;
&lt;br /&gt;
Recently merged reviews:&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/79781/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Test (full path) !! Patches !!  Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/config/test_generator.py  || https://review.openstack.org/#/c/88087/ ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/crypto/test_utils.py  || https://review.openstack.org/87413 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migration_common.py  || https://review.openstack.org/#/c/107752/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migrate.py  || https://review.openstack.org/#/c/107921/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_models.py || https://review.openstack.org/#/c/80307/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_options.py || https://review.openstack.org/#/c/80627/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_migrate_cli.py  || https://review.openstack.org/107988 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_utils.py  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_sqlalchemy.py  || ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/fixture/test_logging.py  || https://review.openstack.org/#/c/90318/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_request_id.py || https://review.openstack.org/#/c/80336/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_sizelimit.py || https://review.openstack.org/#/c/80450/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/middleware/test_audit.py  || || depends on pycadf ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_guru_meditation_report.py  || https://review.openstack.org/#/c/87404/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_base_report.py  || https://review.openstack.org/#/c/87973/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_openstack_generators.py  || https://review.openstack.org/#/c/88124/ ||  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_views.py  || https://review.openstack.org/87376 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/rpc/test_common.py || https://review.openstack.org/#/c/80533/  || The RPC code in the incubator is deprecated in favor of oslo.messaging. --[[User:Doug-hellmann|doug-hellmann]] ([[User talk:Doug-hellmann|talk]]) 15:40, 14 April 2014 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_base_filter.py || https://review.openstack.org/#/c/80321/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_weights.py  || https://review.openstack.org/#/c/87336/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_cliutils || https://review.openstack.org/#/c/74433/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_fileutils ||  https://review.openstack.org/#/c/74728/   ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_gettext.py || https://review.openstack.org/#/c/80534/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_imageutils.py || https://review.openstack.org/#/c/90532/ || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_jsonutils.py || https://review.openstack.org/#/c/80370/  ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/test_log.py || https://review.openstack.org/104890 || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/test_processutils.py || || processutils was moved to the new oslo.concurrency project ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_quota.py || https://review.openstack.org/#/c/80564/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_strutils.py || &lt;br /&gt;
*  https://review.openstack.org/#/c/80571/ (safe_encode)&lt;br /&gt;
*  https://review.openstack.org/#/c/80573/&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common Libraries (Oslo Projects) ===&lt;br /&gt;
&lt;br /&gt;
For the list of Common Libraries, see http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml#n160&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cliff cliff] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || https://review.openstack.org/141206&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.db oslo.db] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || No unit tests with MySQL because of DB driver&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || eventlet executor and qpid driver are not supported on Python 3, greenio &lt;br /&gt;
executor may help&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || ? || The project only contains two short .py files, it looks to be Python 3 compatible. Is Sphinx Python 3 compatible?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslotest oslotest] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color: red;&amp;quot; | No || Blocked suds dependency&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| oslo.version || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || not released on PyPI yet&lt;br /&gt;
|-&lt;br /&gt;
| pylockfile || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || related to https://pypi.python.org/pypi/lockfile ?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/stevedore stevedore] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Development tools:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo-cookiecutter oslo-cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/pbr pbr] || ? ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenStack clients ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-barbicanclient python-barbicanclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:orange;&amp;quot; | In the git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ceilometerclient python-ceilometerclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ganttclient python-ganttclient] ||  ? || ? || ? || ? ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-glanceclient python-glanceclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen&amp;quot; | On PyPI || || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-heatclient python-heatclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ironicclient python-ironicclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot;  | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color:lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-melangeclient python-melangeclient] ||  ? || ? || ? || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-novaclient python-novaclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPII || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style=&amp;quot;background-color: orange;&amp;quot; | Not released yet || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-openstackclient python-openstackclient]      || style=&amp;quot;background-color: lightgreen&amp;quot; | OK || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | Yes || || As of 0.9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-saharaclient python-saharaclient]    || style=&amp;quot;background-color: orange;&amp;quot; | In progress || style=&amp;quot;background-color: orange&amp;quot; | Non-voting || ||  || https://review.openstack.org/#/c/73128/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-swiftclient python-swiftclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | [https://pypi.python.org/pypi/python-swiftclient/ On PyPI] || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-tuskarclient python-tuskarclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Core OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Completely updated on Monday, September the 29th.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Trove classifiers !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ceilometer ceilometer] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  croniter&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  thrift (which is blocking happybase)&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  sphinxcontrib-docbookrestapi&lt;br /&gt;
*  sphinxcontrib-httpdomain&lt;br /&gt;
*  sphinxcontrib-pecanwsme&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/cinder cinder] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-barbicanclient&lt;br /&gt;
*  rtslib-fb&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/glance glance] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  glance_store&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  qpid-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/heat heat] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  qpid-python&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/horizon horizon] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  django-pyscss&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  xstatic&lt;br /&gt;
*  xstatic-angular&lt;br /&gt;
*  xstatic-angular-cookies&lt;br /&gt;
*  xstatic-angular-mock&lt;br /&gt;
*  xstatic-bootstrap-datepicker&lt;br /&gt;
*  xstatic-d3&lt;br /&gt;
*  xstatic-font-awesome&lt;br /&gt;
*  xstatic-hogan&lt;br /&gt;
*  xstatic-jasmine&lt;br /&gt;
*  xstatic-jquery&lt;br /&gt;
*  xstatic-jquery-migrate&lt;br /&gt;
*  xstatic-jquery.quicksearch&lt;br /&gt;
*  xstatic-jquery.tablesorter&lt;br /&gt;
*  xstatic-jsencrypt&lt;br /&gt;
*  xstatic-qunit&lt;br /&gt;
*  xstatic-rickshaw&lt;br /&gt;
*  xstatic-spin&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nodeenv&lt;br /&gt;
*  nose-exclude&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/keystone keystone] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  ldappool&lt;br /&gt;
*  paste (which is blocking pysaml2)&lt;br /&gt;
*  python-ldap&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/neutron neutron] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  jsonrpclib&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nova nova] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
*  websockify&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  libvirt-python&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/swift swift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Number of core OpenStack projetcs blocked by each dependency:&lt;br /&gt;
      9 eventlet&lt;br /&gt;
      7 oslo.messaging&lt;br /&gt;
      7 oslo.db&lt;br /&gt;
      6 sqlalchemy-migrate&lt;br /&gt;
      6 paste&lt;br /&gt;
      5 python-neutronclient&lt;br /&gt;
      5 mysql-python&lt;br /&gt;
      2 suds&lt;br /&gt;
      2 qpid-python&lt;br /&gt;
      2 python-saharaclient&lt;br /&gt;
      2 pycadf&lt;br /&gt;
      2 openstack.nose_plugin&lt;br /&gt;
      2 nosehtmloutput&lt;br /&gt;
      1 xstatic-spin&lt;br /&gt;
      1 xstatic-rickshaw&lt;br /&gt;
      1 xstatic-qunit&lt;br /&gt;
      1 xstatic-jsencrypt&lt;br /&gt;
      1 xstatic-jquery.tablesorter&lt;br /&gt;
      1 xstatic-jquery.quicksearch&lt;br /&gt;
      1 xstatic-jquery-migrate&lt;br /&gt;
      1 xstatic-jquery&lt;br /&gt;
      1 xstatic-jasmine&lt;br /&gt;
      1 xstatic-hogan&lt;br /&gt;
      1 xstatic-font-awesome&lt;br /&gt;
      1 xstatic-d3&lt;br /&gt;
      1 xstatic-bootstrap-datepicker&lt;br /&gt;
      1 xstatic-angular-mock&lt;br /&gt;
      1 xstatic-angular-cookies&lt;br /&gt;
      1 xstatic-angular&lt;br /&gt;
      1 xstatic&lt;br /&gt;
      1 websockify&lt;br /&gt;
      1 thrift&lt;br /&gt;
      1 sphinxcontrib-pecanwsme&lt;br /&gt;
      1 sphinxcontrib-httpdomain&lt;br /&gt;
      1 sphinxcontrib-docbookrestapi&lt;br /&gt;
      1 rtslib-fb&lt;br /&gt;
      1 python-ldap&lt;br /&gt;
      1 python-barbicanclient&lt;br /&gt;
      1 nose-exclude&lt;br /&gt;
      1 nodeenv&lt;br /&gt;
      1 libvirt-python&lt;br /&gt;
      1 ldappool&lt;br /&gt;
      1 jsonrpclib&lt;br /&gt;
      1 glance_store&lt;br /&gt;
      1 django-pyscss&lt;br /&gt;
      1 croniter&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
[https://caniusepython3.com/check/4fd5dda2-b1f1-4db4-a636-67cd3276cb6a Porting status] for [https://github.com/openstack/requirements/blob/master/global-requirements.txt global-requirement.txt].&lt;br /&gt;
&lt;br /&gt;
It's now possible to specify different dependencies for Python 2 and Python 3 using:&lt;br /&gt;
* requirements-py2.txt: all dependencies for Python 2 (not only dependencies specific to Python 2)&lt;br /&gt;
* requirements-py3.txt: all dependencies for Python 3 (not only dependencies specific to Python 3)&lt;br /&gt;
* (same for test-requirements.txt)&lt;br /&gt;
&lt;br /&gt;
You have to edit tox.ini to specify the right requirements file. Extract of a tox.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
[testenv:py33]&lt;br /&gt;
deps = -r{toxinidir}/requirements-py3.txt&lt;br /&gt;
       -r{toxinidir}/test-requirements-py3.txt&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also a patch to support markers in requirements (in pip): [https://github.com/pypa/pip/issues/1433 pip issue: Support markers in setup(install_requires)?]; [https://github.com/pypa/pip/pull/1472 Victor Stinner's pull request: &amp;quot;parse requirements in markers&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
OpenStack Dependencies:&lt;br /&gt;
&lt;br /&gt;
* mox: use mox3 or port tests on mock which works on Python 3 (mock has been integrated in Python 3.3 as unittest.mock). Examples:&lt;br /&gt;
** neutronclient: https://review.openstack.org/#/c/95786/&lt;br /&gt;
** Oslo Incubator: https://review.openstack.org/#/c/93729/&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/boto boto] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || See https://github.com/boto/boto3 (experimental) &amp;lt;- This seems dead, and https://github.com/boto/boto works with Python 3.x (since 2.32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-compressor django-compressor] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Requirements upgraded: https://review.openstack.org/94357&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-openstack-auth django-openstack-auth] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || &lt;br /&gt;
As of 1.1.6&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/dnspython dnspython] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Must use the [https://pypi.python.org/pypi/dnspython3/ Python 3 version], see https://github.com/rthalley/dnspython/issues/60&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ecdsa ecdsa] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo || ||Py3 support merge before the 0.10 release (see https://github.com/warner/python-ecdsa/commits/master)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/eventlet eventlet] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || eventlet portage to Python 3 in progress: [https://github.com/eventlet/eventlet/issues/6 eventlet issue #6: Support Python 3.3] and [https://github.com/eventlet/eventlet/pull/99 Pull request #99: Fix several issues with python3 thread patching]. Victor Stinner is working on [http://trollius.readthedocs.org/ Trollius] (asyncio for Python 2) which may replace eventlet: [http://techs.enovance.com/6562/asyncio-openstack-python3 Use the new asyncio module and Trollius in OpenStack]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Cyril Roelandt patch: [https://review.openstack.org/#/c/77585/ Make hacking Python 3 compatible]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/jsonrpclib jsonrpclib] || style=&amp;quot;background-color:red;&amp;quot; | No || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead :(&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/mysql-python mysql-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || 2 pull requests for Python 3 (https://github.com/farcepest/MySQLdb1/pulls). The projects is being renamed to moist (https://github.com/farcepest/moist), Python 3 support might happen there. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/netifaces netifaces] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Patch sent by Victor Stinner (in private): [https://bitbucket.org/haypo/misc/src/tip/openstack/netifaces_python3.patch netifaces_python3.patch], Debian has patches too. Python 3 support as of 0.10.4. Pushed to requirements: https://review.openstack.org/94358 .&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nose-exclude nose-exclude] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/kgrandis/nose-exclude/issue/10/test-failures-with-python-3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nosehtmloutput nosehtmloutput] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  nose-exclude (tests only)&lt;br /&gt;
*  openstack.nose-plugin&lt;br /&gt;
||&lt;br /&gt;
*  https://bugs.launchpad.net/ubuntu/+source/python-nosehtmloutput/+bug/1287247&lt;br /&gt;
*  https://review.openstack.org/#/c/80956/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/nosexcover nosexcover] || style=&amp;quot;background-color:lightgreen;&amp;quot; | No || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Python 3 support since 1.0.9&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/openstack.nose-plugin openstack.nose-plugin] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || suds || &lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Portage in Progress by Victor Stinner ([https://review.openstack.org/#/dashboard/9107 dashboard])&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI (1.1.0) || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || No tests :) || style=&amp;quot;background-color: lightgreen;&amp;quot; | In the git repo, not on PyPI || || https://review.openstack.org/#/c/79311/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.sphinx oslo.sphinx] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Must be replaced by oslosphinx (without the dot)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pam pam] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The fork [https://pypi.python.org/pypi/simplepam simplepam] works on Python 2 and 3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paramiko paramiko] ||  style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Requirements upgraded: https://review.openstack.org/#/c/81132/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paste paste] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/ianb/paste/pull-request/9/python-3-support/diff&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pycadf pycadf] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Classifiers added https://review.openstack.org/#/c/133088/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ldap python-ldap] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-memcached python-memcached] || style=&amp;quot;background-color:green;&amp;quot; | Not released, but last commit on git has it || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || [https://github.com/jbalogh/django-cache-machine/issues/52 Issue #52: Python 3.3 support? ], [https://github.com/linsomniac/python-memcached/pull/26 Pull request #26: Python 3.3 Support] -- Julien Danjou ported [https://pypi.python.org/pypi/pymemcache pymemcache] to Python 3, another memcached client, he suggests to use this one instead&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/qpid-python qpid-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/rtslib-fb rtslib-fb] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-docbookrestapi sphinxcontrib-docbookrestapi] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-httpdomain sphinxcontrib-httpdomain] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-pecanwsme sphinxcontrib-pecanwsme] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No|| &lt;br /&gt;
*  hacking&lt;br /&gt;
*  ibm-db-sa&lt;br /&gt;
*  scripttest&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/suds suds] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || &amp;quot;Lightweight SOAP client&amp;quot;. Last commit 2 years ago: https://fedorahosted.org/suds/browser See also this fork which is promising: https://bitbucket.org/jurko/suds&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/thrift thrift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/websockify websockify] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Python 3 compatible:&lt;br /&gt;
&lt;br /&gt;
* stackforge/python-jenkins : https://review.openstack.org/#/c/95004/ (py33 gate is voting)&lt;br /&gt;
* openstack-infra/jenkins-job-builder : https://review.openstack.org/87810 (Python 3 support finally merged in, Sept. 2014)&lt;br /&gt;
&lt;br /&gt;
== Reports at OpenStack Summits ==&lt;br /&gt;
&lt;br /&gt;
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3&lt;br /&gt;
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
Enovance organizes a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday). See the page [[Python3/SprintPycon2014]].&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75176</id>
		<title>Python3</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75176"/>
				<updated>2015-03-06T11:54:15Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Dependencies */ updated status for sphinxcontrib-httpdomain&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page tracks the progress of Python 3 effort porting for OpenStack.&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?]&lt;br /&gt;
:''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.''&lt;br /&gt;
&lt;br /&gt;
== Port Python 2 code to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
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. Debian Stable provides Python 3 but only Python 3.2, so u'unicode' syntax should be avoided (use six.u('unicode') instead).&lt;br /&gt;
&lt;br /&gt;
=== Common patterns ===&lt;br /&gt;
&lt;br /&gt;
* Replace dict.iteritems() with six.iteritems(dict)&lt;br /&gt;
* Replace iterator.next() with next(iterator)&lt;br /&gt;
* Replace basestring with six.string_types&lt;br /&gt;
* Replace unicode with six.text_type&lt;br /&gt;
&lt;br /&gt;
=== bytes.decode and unicode.encode ===&lt;br /&gt;
&lt;br /&gt;
Python has a notion of &amp;quot;default encoding&amp;quot;: sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.&lt;br /&gt;
&lt;br /&gt;
Don't write &amp;lt;code&amp;gt;data.decode()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode()&amp;lt;/code&amp;gt; without parameter, because you will use a different encoding on Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Use an explicit encoding instead. Example: &amp;lt;code&amp;gt;data.decode('utf-8')&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode('utf-8')&amp;lt;/code&amp;gt;. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).&lt;br /&gt;
&lt;br /&gt;
=== safe_decode ===&lt;br /&gt;
&lt;br /&gt;
Olso Incubator has a function '''safe_decode()''' which can be used to decode a bytes string and pass text strings unchanged.&lt;br /&gt;
&lt;br /&gt;
The default encoding is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data, 'utf-8')&amp;lt;/code&amp;gt;: decode bytes from UTF-8 or returns data unchanged if it's already a text string&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, the decoder is strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.&lt;br /&gt;
&lt;br /&gt;
=== safe_encode ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(text)&amp;lt;/code&amp;gt; encodes text to the output encoding&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(bytes)&amp;lt;/code&amp;gt; may decode the string and then reencode to a different encoding if input and output encodings are different&lt;br /&gt;
&lt;br /&gt;
The default input encoding (&amp;lt;code&amp;gt;incomding&amp;lt;/code&amp;gt; parameter) is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
The default output encoding (&amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter) is UTF-8.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data, incoming='utf-8')&amp;lt;/code&amp;gt;: 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)&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(b'\xe9', incoming='latin-1')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'\xc3\xa9'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: &amp;lt;code&amp;gt;safe_encode(b'[\xff]', incoming='ascii', errors='ignore')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'[]'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== logging module and format exceptions ===&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;b'hello'&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;'hello'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is no clear rule for format exceptions yet. There are different choices depending on the project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;: native string, so use bytes on Python 2&lt;br /&gt;
* &amp;lt;code&amp;gt;six.text_type(exc)&amp;lt;/code&amp;gt;: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2: &amp;lt;code&amp;gt;unicode(Exception(&amp;quot;nonascii:\xe9&amp;quot;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;six.u(str(exc))&amp;lt;/code&amp;gt;: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex: &amp;lt;code&amp;gt;unicode(str(Exception(&amp;quot;\xff&amp;quot;)))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;LOG.exception(_LE(&amp;quot;... %(exc)s ...&amp;quot;), {&amp;quot;exc&amp;quot;: exc, ...})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;. Example: &amp;lt;code&amp;gt;LOG.debug(str(exc))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
The HTTP protocol is based on '''bytes''':&lt;br /&gt;
&lt;br /&gt;
* HTTP body contains '''bytes'''. For example, use io.BytesIO for a stream storing an HTTP body.&lt;br /&gt;
* HTTPConnection.getresponse().read() returns '''bytes''' (in Python 3, '''str''' which is bytes in Python 2)&lt;br /&gt;
* 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)&lt;br /&gt;
* 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://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding  HTTP header should use what character encoding?]&lt;br /&gt;
&lt;br /&gt;
=== References to port Python 2 code to Python 3 ===&lt;br /&gt;
* [http://python3porting.com/ Porting to Python 3 Book] by Lennart Regebro, especially the [http://python3porting.com/differences.html Language differences and workarounds].&lt;br /&gt;
* [http://docs.python.org/dev/howto/pyporting.html HOWTO: Porting Python 2 Code to Python 3] by Brett Cannon&lt;br /&gt;
* [https://wiki.python.org/moin/PortingPythonToPy3k Porting Python Code to 3.x]&lt;br /&gt;
* [http://code.google.com/p/python-incompatibility/  python-incompatibility]: Demonstrates incompatibilities between Python versions.&lt;br /&gt;
&lt;br /&gt;
=== Common pitfalls ===&lt;br /&gt;
&lt;br /&gt;
==== What is a string ? ====&lt;br /&gt;
You should definitely not talk about &amp;quot;strings&amp;quot; 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:&lt;br /&gt;
&lt;br /&gt;
Python 2:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;type 'unicode'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(u'foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    'f'&lt;br /&gt;
&lt;br /&gt;
Python 3:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;class 'bytes'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(b'foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    102&lt;br /&gt;
&lt;br /&gt;
==== tox/testr error: db type could not be determined ====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;db type could not be determined&amp;quot; error comes from .testrepository/times.dbm used by testr.&lt;br /&gt;
&lt;br /&gt;
Workaround: &amp;quot;rm -rf .testrepository/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Python 3 Status of OpenStack projects ==&lt;br /&gt;
&lt;br /&gt;
=== Oslo Incubator ===&lt;br /&gt;
&lt;br /&gt;
'''BLOCKER BUG:''' Tests using testscenarios fail on Python 3 with nosetests because of this bug:&lt;br /&gt;
https://bugs.launchpad.net/testscenarios/+bug/872887&lt;br /&gt;
&lt;br /&gt;
Recently merged reviews:&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/79781/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Test (full path) !! Patches !!  Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/config/test_generator.py  || https://review.openstack.org/#/c/88087/ ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/crypto/test_utils.py  || https://review.openstack.org/87413 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migration_common.py  || https://review.openstack.org/#/c/107752/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migrate.py  || https://review.openstack.org/#/c/107921/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_models.py || https://review.openstack.org/#/c/80307/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_options.py || https://review.openstack.org/#/c/80627/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_migrate_cli.py  || https://review.openstack.org/107988 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_utils.py  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_sqlalchemy.py  || ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/fixture/test_logging.py  || https://review.openstack.org/#/c/90318/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_request_id.py || https://review.openstack.org/#/c/80336/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_sizelimit.py || https://review.openstack.org/#/c/80450/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/middleware/test_audit.py  || || depends on pycadf ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_guru_meditation_report.py  || https://review.openstack.org/#/c/87404/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_base_report.py  || https://review.openstack.org/#/c/87973/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_openstack_generators.py  || https://review.openstack.org/#/c/88124/ ||  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_views.py  || https://review.openstack.org/87376 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/rpc/test_common.py || https://review.openstack.org/#/c/80533/  || The RPC code in the incubator is deprecated in favor of oslo.messaging. --[[User:Doug-hellmann|doug-hellmann]] ([[User talk:Doug-hellmann|talk]]) 15:40, 14 April 2014 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_base_filter.py || https://review.openstack.org/#/c/80321/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_weights.py  || https://review.openstack.org/#/c/87336/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_cliutils || https://review.openstack.org/#/c/74433/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_fileutils ||  https://review.openstack.org/#/c/74728/   ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_gettext.py || https://review.openstack.org/#/c/80534/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_imageutils.py || https://review.openstack.org/#/c/90532/ || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_jsonutils.py || https://review.openstack.org/#/c/80370/  ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/test_log.py || https://review.openstack.org/104890 || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/test_processutils.py || || processutils was moved to the new oslo.concurrency project ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_quota.py || https://review.openstack.org/#/c/80564/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_strutils.py || &lt;br /&gt;
*  https://review.openstack.org/#/c/80571/ (safe_encode)&lt;br /&gt;
*  https://review.openstack.org/#/c/80573/&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common Libraries (Oslo Projects) ===&lt;br /&gt;
&lt;br /&gt;
For the list of Common Libraries, see http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml#n160&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cliff cliff] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || https://review.openstack.org/141206&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.db oslo.db] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || No unit tests with MySQL because of DB driver&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || eventlet executor and qpid driver are not supported on Python 3, greenio &lt;br /&gt;
executor may help&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || ? || The project only contains two short .py files, it looks to be Python 3 compatible. Is Sphinx Python 3 compatible?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslotest oslotest] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color: red;&amp;quot; | No || Blocked suds dependency&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| oslo.version || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || not released on PyPI yet&lt;br /&gt;
|-&lt;br /&gt;
| pylockfile || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || related to https://pypi.python.org/pypi/lockfile ?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/stevedore stevedore] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Development tools:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo-cookiecutter oslo-cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/pbr pbr] || ? ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenStack clients ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-barbicanclient python-barbicanclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:orange;&amp;quot; | In the git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ceilometerclient python-ceilometerclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ganttclient python-ganttclient] ||  ? || ? || ? || ? ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-glanceclient python-glanceclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen&amp;quot; | On PyPI || || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-heatclient python-heatclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ironicclient python-ironicclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot;  | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color:lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-melangeclient python-melangeclient] ||  ? || ? || ? || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-novaclient python-novaclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPII || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style=&amp;quot;background-color: orange;&amp;quot; | Not released yet || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-openstackclient python-openstackclient]      || style=&amp;quot;background-color: lightgreen&amp;quot; | OK || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | Yes || || As of 0.9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-saharaclient python-saharaclient]    || style=&amp;quot;background-color: orange;&amp;quot; | In progress || style=&amp;quot;background-color: orange&amp;quot; | Non-voting || ||  || https://review.openstack.org/#/c/73128/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-swiftclient python-swiftclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | [https://pypi.python.org/pypi/python-swiftclient/ On PyPI] || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-tuskarclient python-tuskarclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Core OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Completely updated on Monday, September the 29th.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Trove classifiers !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ceilometer ceilometer] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  croniter&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  thrift (which is blocking happybase)&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  sphinxcontrib-docbookrestapi&lt;br /&gt;
*  sphinxcontrib-httpdomain&lt;br /&gt;
*  sphinxcontrib-pecanwsme&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/cinder cinder] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-barbicanclient&lt;br /&gt;
*  rtslib-fb&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/glance glance] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  glance_store&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  qpid-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/heat heat] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  qpid-python&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/horizon horizon] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  django-pyscss&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  xstatic&lt;br /&gt;
*  xstatic-angular&lt;br /&gt;
*  xstatic-angular-cookies&lt;br /&gt;
*  xstatic-angular-mock&lt;br /&gt;
*  xstatic-bootstrap-datepicker&lt;br /&gt;
*  xstatic-d3&lt;br /&gt;
*  xstatic-font-awesome&lt;br /&gt;
*  xstatic-hogan&lt;br /&gt;
*  xstatic-jasmine&lt;br /&gt;
*  xstatic-jquery&lt;br /&gt;
*  xstatic-jquery-migrate&lt;br /&gt;
*  xstatic-jquery.quicksearch&lt;br /&gt;
*  xstatic-jquery.tablesorter&lt;br /&gt;
*  xstatic-jsencrypt&lt;br /&gt;
*  xstatic-qunit&lt;br /&gt;
*  xstatic-rickshaw&lt;br /&gt;
*  xstatic-spin&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nodeenv&lt;br /&gt;
*  nose-exclude&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/keystone keystone] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  ldappool&lt;br /&gt;
*  paste (which is blocking pysaml2)&lt;br /&gt;
*  python-ldap&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/neutron neutron] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  jsonrpclib&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nova nova] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
*  websockify&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  libvirt-python&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/swift swift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Number of core OpenStack projetcs blocked by each dependency:&lt;br /&gt;
      9 eventlet&lt;br /&gt;
      7 oslo.messaging&lt;br /&gt;
      7 oslo.db&lt;br /&gt;
      6 sqlalchemy-migrate&lt;br /&gt;
      6 paste&lt;br /&gt;
      5 python-neutronclient&lt;br /&gt;
      5 mysql-python&lt;br /&gt;
      2 suds&lt;br /&gt;
      2 qpid-python&lt;br /&gt;
      2 python-saharaclient&lt;br /&gt;
      2 pycadf&lt;br /&gt;
      2 openstack.nose_plugin&lt;br /&gt;
      2 nosehtmloutput&lt;br /&gt;
      1 xstatic-spin&lt;br /&gt;
      1 xstatic-rickshaw&lt;br /&gt;
      1 xstatic-qunit&lt;br /&gt;
      1 xstatic-jsencrypt&lt;br /&gt;
      1 xstatic-jquery.tablesorter&lt;br /&gt;
      1 xstatic-jquery.quicksearch&lt;br /&gt;
      1 xstatic-jquery-migrate&lt;br /&gt;
      1 xstatic-jquery&lt;br /&gt;
      1 xstatic-jasmine&lt;br /&gt;
      1 xstatic-hogan&lt;br /&gt;
      1 xstatic-font-awesome&lt;br /&gt;
      1 xstatic-d3&lt;br /&gt;
      1 xstatic-bootstrap-datepicker&lt;br /&gt;
      1 xstatic-angular-mock&lt;br /&gt;
      1 xstatic-angular-cookies&lt;br /&gt;
      1 xstatic-angular&lt;br /&gt;
      1 xstatic&lt;br /&gt;
      1 websockify&lt;br /&gt;
      1 thrift&lt;br /&gt;
      1 sphinxcontrib-pecanwsme&lt;br /&gt;
      1 sphinxcontrib-httpdomain&lt;br /&gt;
      1 sphinxcontrib-docbookrestapi&lt;br /&gt;
      1 rtslib-fb&lt;br /&gt;
      1 python-ldap&lt;br /&gt;
      1 python-barbicanclient&lt;br /&gt;
      1 nose-exclude&lt;br /&gt;
      1 nodeenv&lt;br /&gt;
      1 libvirt-python&lt;br /&gt;
      1 ldappool&lt;br /&gt;
      1 jsonrpclib&lt;br /&gt;
      1 glance_store&lt;br /&gt;
      1 django-pyscss&lt;br /&gt;
      1 croniter&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
[https://caniusepython3.com/check/4fd5dda2-b1f1-4db4-a636-67cd3276cb6a Porting status] for [https://github.com/openstack/requirements/blob/master/global-requirements.txt global-requirement.txt].&lt;br /&gt;
&lt;br /&gt;
It's now possible to specify different dependencies for Python 2 and Python 3 using:&lt;br /&gt;
* requirements-py2.txt: all dependencies for Python 2 (not only dependencies specific to Python 2)&lt;br /&gt;
* requirements-py3.txt: all dependencies for Python 3 (not only dependencies specific to Python 3)&lt;br /&gt;
* (same for test-requirements.txt)&lt;br /&gt;
&lt;br /&gt;
You have to edit tox.ini to specify the right requirements file. Extract of a tox.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
[testenv:py33]&lt;br /&gt;
deps = -r{toxinidir}/requirements-py3.txt&lt;br /&gt;
       -r{toxinidir}/test-requirements-py3.txt&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also a patch to support markers in requirements (in pip): [https://github.com/pypa/pip/issues/1433 pip issue: Support markers in setup(install_requires)?]; [https://github.com/pypa/pip/pull/1472 Victor Stinner's pull request: &amp;quot;parse requirements in markers&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
OpenStack Dependencies:&lt;br /&gt;
&lt;br /&gt;
* mox: use mox3 or port tests on mock which works on Python 3 (mock has been integrated in Python 3.3 as unittest.mock). Examples:&lt;br /&gt;
** neutronclient: https://review.openstack.org/#/c/95786/&lt;br /&gt;
** Oslo Incubator: https://review.openstack.org/#/c/93729/&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/boto boto] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || See https://github.com/boto/boto3 (experimental) &amp;lt;- This seems dead, and https://github.com/boto/boto works with Python 3.x (since 2.32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-compressor django-compressor] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Requirements upgraded: https://review.openstack.org/94357&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-openstack-auth django-openstack-auth] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || &lt;br /&gt;
As of 1.1.6&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/dnspython dnspython] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Must use the [https://pypi.python.org/pypi/dnspython3/ Python 3 version], see https://github.com/rthalley/dnspython/issues/60&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ecdsa ecdsa] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo || ||Py3 support merge before the 0.10 release (see https://github.com/warner/python-ecdsa/commits/master)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/eventlet eventlet] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || eventlet portage to Python 3 in progress: [https://github.com/eventlet/eventlet/issues/6 eventlet issue #6: Support Python 3.3] and [https://github.com/eventlet/eventlet/pull/99 Pull request #99: Fix several issues with python3 thread patching]. Victor Stinner is working on [http://trollius.readthedocs.org/ Trollius] (asyncio for Python 2) which may replace eventlet: [http://techs.enovance.com/6562/asyncio-openstack-python3 Use the new asyncio module and Trollius in OpenStack]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Cyril Roelandt patch: [https://review.openstack.org/#/c/77585/ Make hacking Python 3 compatible]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/jsonrpclib jsonrpclib] || style=&amp;quot;background-color:red;&amp;quot; | No || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead :(&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/mysql-python mysql-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || 2 pull requests for Python 3 (https://github.com/farcepest/MySQLdb1/pulls). The projects is being renamed to moist (https://github.com/farcepest/moist), Python 3 support might happen there. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/netifaces netifaces] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Patch sent by Victor Stinner (in private): [https://bitbucket.org/haypo/misc/src/tip/openstack/netifaces_python3.patch netifaces_python3.patch], Debian has patches too. Python 3 support as of 0.10.4. Pushed to requirements: https://review.openstack.org/94358 .&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nose-exclude nose-exclude] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/kgrandis/nose-exclude/issue/10/test-failures-with-python-3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nosehtmloutput nosehtmloutput] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  nose-exclude (tests only)&lt;br /&gt;
*  openstack.nose-plugin&lt;br /&gt;
||&lt;br /&gt;
*  https://bugs.launchpad.net/ubuntu/+source/python-nosehtmloutput/+bug/1287247&lt;br /&gt;
*  https://review.openstack.org/#/c/80956/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/nosexcover nosexcover] || style=&amp;quot;background-color:lightgreen;&amp;quot; | No || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Python 3 support since 1.0.9&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/openstack.nose-plugin openstack.nose-plugin] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || suds || &lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Portage in Progress by Victor Stinner ([https://review.openstack.org/#/dashboard/9107 dashboard])&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI (1.1.0) || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || No tests :) || style=&amp;quot;background-color: lightgreen;&amp;quot; | In the git repo, not on PyPI || || https://review.openstack.org/#/c/79311/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.sphinx oslo.sphinx] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Must be replaced by oslosphinx (without the dot)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pam pam] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The fork [https://pypi.python.org/pypi/simplepam simplepam] works on Python 2 and 3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paramiko paramiko] ||  style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Requirements upgraded: https://review.openstack.org/#/c/81132/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paste paste] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/ianb/paste/pull-request/9/python-3-support/diff&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pycadf pycadf] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Classifiers added https://review.openstack.org/#/c/133088/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ldap python-ldap] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-memcached python-memcached] || style=&amp;quot;background-color:green;&amp;quot; | Not released, but last commit on git has it || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || [https://github.com/jbalogh/django-cache-machine/issues/52 Issue #52: Python 3.3 support? ], [https://github.com/linsomniac/python-memcached/pull/26 Pull request #26: Python 3.3 Support] -- Julien Danjou ported [https://pypi.python.org/pypi/pymemcache pymemcache] to Python 3, another memcached client, he suggests to use this one instead&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/qpid-python qpid-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/rtslib-fb rtslib-fb] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-docbookrestapi sphinxcontrib-docbookrestapi] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-httpdomain sphinxcontrib-httpdomain] || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-pecanwsme sphinxcontrib-pecanwsme] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No|| &lt;br /&gt;
*  hacking&lt;br /&gt;
*  ibm-db-sa&lt;br /&gt;
*  scripttest&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/suds suds] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || &amp;quot;Lightweight SOAP client&amp;quot;. Last commit 2 years ago: https://fedorahosted.org/suds/browser See also this fork which is promising: https://bitbucket.org/jurko/suds&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/thrift thrift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/websockify websockify] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Python 3 compatible:&lt;br /&gt;
&lt;br /&gt;
* stackforge/python-jenkins : https://review.openstack.org/#/c/95004/ (py33 gate is voting)&lt;br /&gt;
* openstack-infra/jenkins-job-builder : https://review.openstack.org/87810 (Python 3 support finally merged in, Sept. 2014)&lt;br /&gt;
&lt;br /&gt;
== Reports at OpenStack Summits ==&lt;br /&gt;
&lt;br /&gt;
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3&lt;br /&gt;
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
Enovance organizes a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday). See the page [[Python3/SprintPycon2014]].&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75175</id>
		<title>Python3</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75175"/>
				<updated>2015-03-06T11:51:45Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Dependencies */ Even better&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page tracks the progress of Python 3 effort porting for OpenStack.&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?]&lt;br /&gt;
:''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.''&lt;br /&gt;
&lt;br /&gt;
== Port Python 2 code to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
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. Debian Stable provides Python 3 but only Python 3.2, so u'unicode' syntax should be avoided (use six.u('unicode') instead).&lt;br /&gt;
&lt;br /&gt;
=== Common patterns ===&lt;br /&gt;
&lt;br /&gt;
* Replace dict.iteritems() with six.iteritems(dict)&lt;br /&gt;
* Replace iterator.next() with next(iterator)&lt;br /&gt;
* Replace basestring with six.string_types&lt;br /&gt;
* Replace unicode with six.text_type&lt;br /&gt;
&lt;br /&gt;
=== bytes.decode and unicode.encode ===&lt;br /&gt;
&lt;br /&gt;
Python has a notion of &amp;quot;default encoding&amp;quot;: sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.&lt;br /&gt;
&lt;br /&gt;
Don't write &amp;lt;code&amp;gt;data.decode()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode()&amp;lt;/code&amp;gt; without parameter, because you will use a different encoding on Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Use an explicit encoding instead. Example: &amp;lt;code&amp;gt;data.decode('utf-8')&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode('utf-8')&amp;lt;/code&amp;gt;. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).&lt;br /&gt;
&lt;br /&gt;
=== safe_decode ===&lt;br /&gt;
&lt;br /&gt;
Olso Incubator has a function '''safe_decode()''' which can be used to decode a bytes string and pass text strings unchanged.&lt;br /&gt;
&lt;br /&gt;
The default encoding is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data, 'utf-8')&amp;lt;/code&amp;gt;: decode bytes from UTF-8 or returns data unchanged if it's already a text string&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, the decoder is strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.&lt;br /&gt;
&lt;br /&gt;
=== safe_encode ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(text)&amp;lt;/code&amp;gt; encodes text to the output encoding&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(bytes)&amp;lt;/code&amp;gt; may decode the string and then reencode to a different encoding if input and output encodings are different&lt;br /&gt;
&lt;br /&gt;
The default input encoding (&amp;lt;code&amp;gt;incomding&amp;lt;/code&amp;gt; parameter) is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
The default output encoding (&amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter) is UTF-8.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data, incoming='utf-8')&amp;lt;/code&amp;gt;: 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)&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(b'\xe9', incoming='latin-1')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'\xc3\xa9'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: &amp;lt;code&amp;gt;safe_encode(b'[\xff]', incoming='ascii', errors='ignore')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'[]'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== logging module and format exceptions ===&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;b'hello'&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;'hello'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is no clear rule for format exceptions yet. There are different choices depending on the project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;: native string, so use bytes on Python 2&lt;br /&gt;
* &amp;lt;code&amp;gt;six.text_type(exc)&amp;lt;/code&amp;gt;: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2: &amp;lt;code&amp;gt;unicode(Exception(&amp;quot;nonascii:\xe9&amp;quot;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;six.u(str(exc))&amp;lt;/code&amp;gt;: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex: &amp;lt;code&amp;gt;unicode(str(Exception(&amp;quot;\xff&amp;quot;)))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;LOG.exception(_LE(&amp;quot;... %(exc)s ...&amp;quot;), {&amp;quot;exc&amp;quot;: exc, ...})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;. Example: &amp;lt;code&amp;gt;LOG.debug(str(exc))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
The HTTP protocol is based on '''bytes''':&lt;br /&gt;
&lt;br /&gt;
* HTTP body contains '''bytes'''. For example, use io.BytesIO for a stream storing an HTTP body.&lt;br /&gt;
* HTTPConnection.getresponse().read() returns '''bytes''' (in Python 3, '''str''' which is bytes in Python 2)&lt;br /&gt;
* 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)&lt;br /&gt;
* 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://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding  HTTP header should use what character encoding?]&lt;br /&gt;
&lt;br /&gt;
=== References to port Python 2 code to Python 3 ===&lt;br /&gt;
* [http://python3porting.com/ Porting to Python 3 Book] by Lennart Regebro, especially the [http://python3porting.com/differences.html Language differences and workarounds].&lt;br /&gt;
* [http://docs.python.org/dev/howto/pyporting.html HOWTO: Porting Python 2 Code to Python 3] by Brett Cannon&lt;br /&gt;
* [https://wiki.python.org/moin/PortingPythonToPy3k Porting Python Code to 3.x]&lt;br /&gt;
* [http://code.google.com/p/python-incompatibility/  python-incompatibility]: Demonstrates incompatibilities between Python versions.&lt;br /&gt;
&lt;br /&gt;
=== Common pitfalls ===&lt;br /&gt;
&lt;br /&gt;
==== What is a string ? ====&lt;br /&gt;
You should definitely not talk about &amp;quot;strings&amp;quot; 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:&lt;br /&gt;
&lt;br /&gt;
Python 2:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;type 'unicode'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(u'foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    'f'&lt;br /&gt;
&lt;br /&gt;
Python 3:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;class 'bytes'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(b'foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    102&lt;br /&gt;
&lt;br /&gt;
==== tox/testr error: db type could not be determined ====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;db type could not be determined&amp;quot; error comes from .testrepository/times.dbm used by testr.&lt;br /&gt;
&lt;br /&gt;
Workaround: &amp;quot;rm -rf .testrepository/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Python 3 Status of OpenStack projects ==&lt;br /&gt;
&lt;br /&gt;
=== Oslo Incubator ===&lt;br /&gt;
&lt;br /&gt;
'''BLOCKER BUG:''' Tests using testscenarios fail on Python 3 with nosetests because of this bug:&lt;br /&gt;
https://bugs.launchpad.net/testscenarios/+bug/872887&lt;br /&gt;
&lt;br /&gt;
Recently merged reviews:&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/79781/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Test (full path) !! Patches !!  Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/config/test_generator.py  || https://review.openstack.org/#/c/88087/ ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/crypto/test_utils.py  || https://review.openstack.org/87413 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migration_common.py  || https://review.openstack.org/#/c/107752/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migrate.py  || https://review.openstack.org/#/c/107921/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_models.py || https://review.openstack.org/#/c/80307/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_options.py || https://review.openstack.org/#/c/80627/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_migrate_cli.py  || https://review.openstack.org/107988 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_utils.py  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_sqlalchemy.py  || ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/fixture/test_logging.py  || https://review.openstack.org/#/c/90318/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_request_id.py || https://review.openstack.org/#/c/80336/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_sizelimit.py || https://review.openstack.org/#/c/80450/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/middleware/test_audit.py  || || depends on pycadf ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_guru_meditation_report.py  || https://review.openstack.org/#/c/87404/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_base_report.py  || https://review.openstack.org/#/c/87973/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_openstack_generators.py  || https://review.openstack.org/#/c/88124/ ||  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_views.py  || https://review.openstack.org/87376 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/rpc/test_common.py || https://review.openstack.org/#/c/80533/  || The RPC code in the incubator is deprecated in favor of oslo.messaging. --[[User:Doug-hellmann|doug-hellmann]] ([[User talk:Doug-hellmann|talk]]) 15:40, 14 April 2014 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_base_filter.py || https://review.openstack.org/#/c/80321/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_weights.py  || https://review.openstack.org/#/c/87336/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_cliutils || https://review.openstack.org/#/c/74433/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_fileutils ||  https://review.openstack.org/#/c/74728/   ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_gettext.py || https://review.openstack.org/#/c/80534/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_imageutils.py || https://review.openstack.org/#/c/90532/ || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_jsonutils.py || https://review.openstack.org/#/c/80370/  ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/test_log.py || https://review.openstack.org/104890 || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/test_processutils.py || || processutils was moved to the new oslo.concurrency project ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_quota.py || https://review.openstack.org/#/c/80564/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_strutils.py || &lt;br /&gt;
*  https://review.openstack.org/#/c/80571/ (safe_encode)&lt;br /&gt;
*  https://review.openstack.org/#/c/80573/&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common Libraries (Oslo Projects) ===&lt;br /&gt;
&lt;br /&gt;
For the list of Common Libraries, see http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml#n160&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cliff cliff] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || https://review.openstack.org/141206&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.db oslo.db] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || No unit tests with MySQL because of DB driver&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || eventlet executor and qpid driver are not supported on Python 3, greenio &lt;br /&gt;
executor may help&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || ? || The project only contains two short .py files, it looks to be Python 3 compatible. Is Sphinx Python 3 compatible?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslotest oslotest] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color: red;&amp;quot; | No || Blocked suds dependency&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| oslo.version || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || not released on PyPI yet&lt;br /&gt;
|-&lt;br /&gt;
| pylockfile || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || related to https://pypi.python.org/pypi/lockfile ?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/stevedore stevedore] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Development tools:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo-cookiecutter oslo-cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/pbr pbr] || ? ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenStack clients ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-barbicanclient python-barbicanclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:orange;&amp;quot; | In the git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ceilometerclient python-ceilometerclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ganttclient python-ganttclient] ||  ? || ? || ? || ? ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-glanceclient python-glanceclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen&amp;quot; | On PyPI || || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-heatclient python-heatclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ironicclient python-ironicclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot;  | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color:lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-melangeclient python-melangeclient] ||  ? || ? || ? || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-novaclient python-novaclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPII || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style=&amp;quot;background-color: orange;&amp;quot; | Not released yet || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-openstackclient python-openstackclient]      || style=&amp;quot;background-color: lightgreen&amp;quot; | OK || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | Yes || || As of 0.9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-saharaclient python-saharaclient]    || style=&amp;quot;background-color: orange;&amp;quot; | In progress || style=&amp;quot;background-color: orange&amp;quot; | Non-voting || ||  || https://review.openstack.org/#/c/73128/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-swiftclient python-swiftclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | [https://pypi.python.org/pypi/python-swiftclient/ On PyPI] || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-tuskarclient python-tuskarclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Core OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Completely updated on Monday, September the 29th.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Trove classifiers !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ceilometer ceilometer] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  croniter&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  thrift (which is blocking happybase)&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  sphinxcontrib-docbookrestapi&lt;br /&gt;
*  sphinxcontrib-httpdomain&lt;br /&gt;
*  sphinxcontrib-pecanwsme&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/cinder cinder] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-barbicanclient&lt;br /&gt;
*  rtslib-fb&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/glance glance] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  glance_store&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  qpid-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/heat heat] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  qpid-python&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/horizon horizon] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  django-pyscss&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  xstatic&lt;br /&gt;
*  xstatic-angular&lt;br /&gt;
*  xstatic-angular-cookies&lt;br /&gt;
*  xstatic-angular-mock&lt;br /&gt;
*  xstatic-bootstrap-datepicker&lt;br /&gt;
*  xstatic-d3&lt;br /&gt;
*  xstatic-font-awesome&lt;br /&gt;
*  xstatic-hogan&lt;br /&gt;
*  xstatic-jasmine&lt;br /&gt;
*  xstatic-jquery&lt;br /&gt;
*  xstatic-jquery-migrate&lt;br /&gt;
*  xstatic-jquery.quicksearch&lt;br /&gt;
*  xstatic-jquery.tablesorter&lt;br /&gt;
*  xstatic-jsencrypt&lt;br /&gt;
*  xstatic-qunit&lt;br /&gt;
*  xstatic-rickshaw&lt;br /&gt;
*  xstatic-spin&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nodeenv&lt;br /&gt;
*  nose-exclude&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/keystone keystone] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  ldappool&lt;br /&gt;
*  paste (which is blocking pysaml2)&lt;br /&gt;
*  python-ldap&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/neutron neutron] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  jsonrpclib&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nova nova] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
*  websockify&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  libvirt-python&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/swift swift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Number of core OpenStack projetcs blocked by each dependency:&lt;br /&gt;
      9 eventlet&lt;br /&gt;
      7 oslo.messaging&lt;br /&gt;
      7 oslo.db&lt;br /&gt;
      6 sqlalchemy-migrate&lt;br /&gt;
      6 paste&lt;br /&gt;
      5 python-neutronclient&lt;br /&gt;
      5 mysql-python&lt;br /&gt;
      2 suds&lt;br /&gt;
      2 qpid-python&lt;br /&gt;
      2 python-saharaclient&lt;br /&gt;
      2 pycadf&lt;br /&gt;
      2 openstack.nose_plugin&lt;br /&gt;
      2 nosehtmloutput&lt;br /&gt;
      1 xstatic-spin&lt;br /&gt;
      1 xstatic-rickshaw&lt;br /&gt;
      1 xstatic-qunit&lt;br /&gt;
      1 xstatic-jsencrypt&lt;br /&gt;
      1 xstatic-jquery.tablesorter&lt;br /&gt;
      1 xstatic-jquery.quicksearch&lt;br /&gt;
      1 xstatic-jquery-migrate&lt;br /&gt;
      1 xstatic-jquery&lt;br /&gt;
      1 xstatic-jasmine&lt;br /&gt;
      1 xstatic-hogan&lt;br /&gt;
      1 xstatic-font-awesome&lt;br /&gt;
      1 xstatic-d3&lt;br /&gt;
      1 xstatic-bootstrap-datepicker&lt;br /&gt;
      1 xstatic-angular-mock&lt;br /&gt;
      1 xstatic-angular-cookies&lt;br /&gt;
      1 xstatic-angular&lt;br /&gt;
      1 xstatic&lt;br /&gt;
      1 websockify&lt;br /&gt;
      1 thrift&lt;br /&gt;
      1 sphinxcontrib-pecanwsme&lt;br /&gt;
      1 sphinxcontrib-httpdomain&lt;br /&gt;
      1 sphinxcontrib-docbookrestapi&lt;br /&gt;
      1 rtslib-fb&lt;br /&gt;
      1 python-ldap&lt;br /&gt;
      1 python-barbicanclient&lt;br /&gt;
      1 nose-exclude&lt;br /&gt;
      1 nodeenv&lt;br /&gt;
      1 libvirt-python&lt;br /&gt;
      1 ldappool&lt;br /&gt;
      1 jsonrpclib&lt;br /&gt;
      1 glance_store&lt;br /&gt;
      1 django-pyscss&lt;br /&gt;
      1 croniter&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
[https://caniusepython3.com/check/4fd5dda2-b1f1-4db4-a636-67cd3276cb6a Porting status] for [https://github.com/openstack/requirements/blob/master/global-requirements.txt global-requirement.txt].&lt;br /&gt;
&lt;br /&gt;
It's now possible to specify different dependencies for Python 2 and Python 3 using:&lt;br /&gt;
* requirements-py2.txt: all dependencies for Python 2 (not only dependencies specific to Python 2)&lt;br /&gt;
* requirements-py3.txt: all dependencies for Python 3 (not only dependencies specific to Python 3)&lt;br /&gt;
* (same for test-requirements.txt)&lt;br /&gt;
&lt;br /&gt;
You have to edit tox.ini to specify the right requirements file. Extract of a tox.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
[testenv:py33]&lt;br /&gt;
deps = -r{toxinidir}/requirements-py3.txt&lt;br /&gt;
       -r{toxinidir}/test-requirements-py3.txt&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also a patch to support markers in requirements (in pip): [https://github.com/pypa/pip/issues/1433 pip issue: Support markers in setup(install_requires)?]; [https://github.com/pypa/pip/pull/1472 Victor Stinner's pull request: &amp;quot;parse requirements in markers&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
OpenStack Dependencies:&lt;br /&gt;
&lt;br /&gt;
* mox: use mox3 or port tests on mock which works on Python 3 (mock has been integrated in Python 3.3 as unittest.mock). Examples:&lt;br /&gt;
** neutronclient: https://review.openstack.org/#/c/95786/&lt;br /&gt;
** Oslo Incubator: https://review.openstack.org/#/c/93729/&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/boto boto] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || See https://github.com/boto/boto3 (experimental) &amp;lt;- This seems dead, and https://github.com/boto/boto works with Python 3.x (since 2.32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-compressor django-compressor] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Requirements upgraded: https://review.openstack.org/94357&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-openstack-auth django-openstack-auth] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || &lt;br /&gt;
As of 1.1.6&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/dnspython dnspython] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Must use the [https://pypi.python.org/pypi/dnspython3/ Python 3 version], see https://github.com/rthalley/dnspython/issues/60&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ecdsa ecdsa] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo || ||Py3 support merge before the 0.10 release (see https://github.com/warner/python-ecdsa/commits/master)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/eventlet eventlet] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || eventlet portage to Python 3 in progress: [https://github.com/eventlet/eventlet/issues/6 eventlet issue #6: Support Python 3.3] and [https://github.com/eventlet/eventlet/pull/99 Pull request #99: Fix several issues with python3 thread patching]. Victor Stinner is working on [http://trollius.readthedocs.org/ Trollius] (asyncio for Python 2) which may replace eventlet: [http://techs.enovance.com/6562/asyncio-openstack-python3 Use the new asyncio module and Trollius in OpenStack]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Cyril Roelandt patch: [https://review.openstack.org/#/c/77585/ Make hacking Python 3 compatible]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/jsonrpclib jsonrpclib] || style=&amp;quot;background-color:red;&amp;quot; | No || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead :(&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/mysql-python mysql-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || 2 pull requests for Python 3 (https://github.com/farcepest/MySQLdb1/pulls). The projects is being renamed to moist (https://github.com/farcepest/moist), Python 3 support might happen there. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/netifaces netifaces] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Patch sent by Victor Stinner (in private): [https://bitbucket.org/haypo/misc/src/tip/openstack/netifaces_python3.patch netifaces_python3.patch], Debian has patches too. Python 3 support as of 0.10.4. Pushed to requirements: https://review.openstack.org/94358 .&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nose-exclude nose-exclude] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/kgrandis/nose-exclude/issue/10/test-failures-with-python-3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nosehtmloutput nosehtmloutput] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  nose-exclude (tests only)&lt;br /&gt;
*  openstack.nose-plugin&lt;br /&gt;
||&lt;br /&gt;
*  https://bugs.launchpad.net/ubuntu/+source/python-nosehtmloutput/+bug/1287247&lt;br /&gt;
*  https://review.openstack.org/#/c/80956/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/nosexcover nosexcover] || style=&amp;quot;background-color:lightgreen;&amp;quot; | No || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Python 3 support since 1.0.9&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/openstack.nose-plugin openstack.nose-plugin] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || suds || &lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Portage in Progress by Victor Stinner ([https://review.openstack.org/#/dashboard/9107 dashboard])&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI (1.1.0) || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || No tests :) || style=&amp;quot;background-color: lightgreen;&amp;quot; | In the git repo, not on PyPI || || https://review.openstack.org/#/c/79311/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.sphinx oslo.sphinx] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Must be replaced by oslosphinx (without the dot)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pam pam] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The fork [https://pypi.python.org/pypi/simplepam simplepam] works on Python 2 and 3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paramiko paramiko] ||  style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Requirements upgraded: https://review.openstack.org/#/c/81132/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paste paste] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/ianb/paste/pull-request/9/python-3-support/diff&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pycadf pycadf] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Classifiers added https://review.openstack.org/#/c/133088/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ldap python-ldap] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-memcached python-memcached] || style=&amp;quot;background-color:green;&amp;quot; | Not released, but last commit on git has it || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || [https://github.com/jbalogh/django-cache-machine/issues/52 Issue #52: Python 3.3 support? ], [https://github.com/linsomniac/python-memcached/pull/26 Pull request #26: Python 3.3 Support] -- Julien Danjou ported [https://pypi.python.org/pypi/pymemcache pymemcache] to Python 3, another memcached client, he suggests to use this one instead&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/qpid-python qpid-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/rtslib-fb rtslib-fb] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-docbookrestapi sphinxcontrib-docbookrestapi] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-httpdomain sphinxcontrib-httpdomain] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-pecanwsme sphinxcontrib-pecanwsme] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No|| &lt;br /&gt;
*  hacking&lt;br /&gt;
*  ibm-db-sa&lt;br /&gt;
*  scripttest&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/suds suds] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || &amp;quot;Lightweight SOAP client&amp;quot;. Last commit 2 years ago: https://fedorahosted.org/suds/browser See also this fork which is promising: https://bitbucket.org/jurko/suds&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/thrift thrift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/websockify websockify] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Python 3 compatible:&lt;br /&gt;
&lt;br /&gt;
* stackforge/python-jenkins : https://review.openstack.org/#/c/95004/ (py33 gate is voting)&lt;br /&gt;
* openstack-infra/jenkins-job-builder : https://review.openstack.org/87810 (Python 3 support finally merged in, Sept. 2014)&lt;br /&gt;
&lt;br /&gt;
== Reports at OpenStack Summits ==&lt;br /&gt;
&lt;br /&gt;
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3&lt;br /&gt;
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
Enovance organizes a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday). See the page [[Python3/SprintPycon2014]].&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75174</id>
		<title>Python3</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75174"/>
				<updated>2015-03-06T11:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Dependencies */ Wrong color&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page tracks the progress of Python 3 effort porting for OpenStack.&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?]&lt;br /&gt;
:''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.''&lt;br /&gt;
&lt;br /&gt;
== Port Python 2 code to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
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. Debian Stable provides Python 3 but only Python 3.2, so u'unicode' syntax should be avoided (use six.u('unicode') instead).&lt;br /&gt;
&lt;br /&gt;
=== Common patterns ===&lt;br /&gt;
&lt;br /&gt;
* Replace dict.iteritems() with six.iteritems(dict)&lt;br /&gt;
* Replace iterator.next() with next(iterator)&lt;br /&gt;
* Replace basestring with six.string_types&lt;br /&gt;
* Replace unicode with six.text_type&lt;br /&gt;
&lt;br /&gt;
=== bytes.decode and unicode.encode ===&lt;br /&gt;
&lt;br /&gt;
Python has a notion of &amp;quot;default encoding&amp;quot;: sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.&lt;br /&gt;
&lt;br /&gt;
Don't write &amp;lt;code&amp;gt;data.decode()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode()&amp;lt;/code&amp;gt; without parameter, because you will use a different encoding on Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Use an explicit encoding instead. Example: &amp;lt;code&amp;gt;data.decode('utf-8')&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode('utf-8')&amp;lt;/code&amp;gt;. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).&lt;br /&gt;
&lt;br /&gt;
=== safe_decode ===&lt;br /&gt;
&lt;br /&gt;
Olso Incubator has a function '''safe_decode()''' which can be used to decode a bytes string and pass text strings unchanged.&lt;br /&gt;
&lt;br /&gt;
The default encoding is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data, 'utf-8')&amp;lt;/code&amp;gt;: decode bytes from UTF-8 or returns data unchanged if it's already a text string&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, the decoder is strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.&lt;br /&gt;
&lt;br /&gt;
=== safe_encode ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(text)&amp;lt;/code&amp;gt; encodes text to the output encoding&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(bytes)&amp;lt;/code&amp;gt; may decode the string and then reencode to a different encoding if input and output encodings are different&lt;br /&gt;
&lt;br /&gt;
The default input encoding (&amp;lt;code&amp;gt;incomding&amp;lt;/code&amp;gt; parameter) is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
The default output encoding (&amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter) is UTF-8.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data, incoming='utf-8')&amp;lt;/code&amp;gt;: 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)&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(b'\xe9', incoming='latin-1')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'\xc3\xa9'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: &amp;lt;code&amp;gt;safe_encode(b'[\xff]', incoming='ascii', errors='ignore')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'[]'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== logging module and format exceptions ===&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;b'hello'&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;'hello'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is no clear rule for format exceptions yet. There are different choices depending on the project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;: native string, so use bytes on Python 2&lt;br /&gt;
* &amp;lt;code&amp;gt;six.text_type(exc)&amp;lt;/code&amp;gt;: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2: &amp;lt;code&amp;gt;unicode(Exception(&amp;quot;nonascii:\xe9&amp;quot;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;six.u(str(exc))&amp;lt;/code&amp;gt;: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex: &amp;lt;code&amp;gt;unicode(str(Exception(&amp;quot;\xff&amp;quot;)))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;LOG.exception(_LE(&amp;quot;... %(exc)s ...&amp;quot;), {&amp;quot;exc&amp;quot;: exc, ...})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;. Example: &amp;lt;code&amp;gt;LOG.debug(str(exc))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
The HTTP protocol is based on '''bytes''':&lt;br /&gt;
&lt;br /&gt;
* HTTP body contains '''bytes'''. For example, use io.BytesIO for a stream storing an HTTP body.&lt;br /&gt;
* HTTPConnection.getresponse().read() returns '''bytes''' (in Python 3, '''str''' which is bytes in Python 2)&lt;br /&gt;
* 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)&lt;br /&gt;
* 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://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding  HTTP header should use what character encoding?]&lt;br /&gt;
&lt;br /&gt;
=== References to port Python 2 code to Python 3 ===&lt;br /&gt;
* [http://python3porting.com/ Porting to Python 3 Book] by Lennart Regebro, especially the [http://python3porting.com/differences.html Language differences and workarounds].&lt;br /&gt;
* [http://docs.python.org/dev/howto/pyporting.html HOWTO: Porting Python 2 Code to Python 3] by Brett Cannon&lt;br /&gt;
* [https://wiki.python.org/moin/PortingPythonToPy3k Porting Python Code to 3.x]&lt;br /&gt;
* [http://code.google.com/p/python-incompatibility/  python-incompatibility]: Demonstrates incompatibilities between Python versions.&lt;br /&gt;
&lt;br /&gt;
=== Common pitfalls ===&lt;br /&gt;
&lt;br /&gt;
==== What is a string ? ====&lt;br /&gt;
You should definitely not talk about &amp;quot;strings&amp;quot; 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:&lt;br /&gt;
&lt;br /&gt;
Python 2:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;type 'unicode'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(u'foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    'f'&lt;br /&gt;
&lt;br /&gt;
Python 3:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;class 'bytes'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(b'foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    102&lt;br /&gt;
&lt;br /&gt;
==== tox/testr error: db type could not be determined ====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;db type could not be determined&amp;quot; error comes from .testrepository/times.dbm used by testr.&lt;br /&gt;
&lt;br /&gt;
Workaround: &amp;quot;rm -rf .testrepository/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Python 3 Status of OpenStack projects ==&lt;br /&gt;
&lt;br /&gt;
=== Oslo Incubator ===&lt;br /&gt;
&lt;br /&gt;
'''BLOCKER BUG:''' Tests using testscenarios fail on Python 3 with nosetests because of this bug:&lt;br /&gt;
https://bugs.launchpad.net/testscenarios/+bug/872887&lt;br /&gt;
&lt;br /&gt;
Recently merged reviews:&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/79781/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Test (full path) !! Patches !!  Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/config/test_generator.py  || https://review.openstack.org/#/c/88087/ ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/crypto/test_utils.py  || https://review.openstack.org/87413 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migration_common.py  || https://review.openstack.org/#/c/107752/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migrate.py  || https://review.openstack.org/#/c/107921/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_models.py || https://review.openstack.org/#/c/80307/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_options.py || https://review.openstack.org/#/c/80627/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_migrate_cli.py  || https://review.openstack.org/107988 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_utils.py  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_sqlalchemy.py  || ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/fixture/test_logging.py  || https://review.openstack.org/#/c/90318/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_request_id.py || https://review.openstack.org/#/c/80336/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_sizelimit.py || https://review.openstack.org/#/c/80450/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/middleware/test_audit.py  || || depends on pycadf ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_guru_meditation_report.py  || https://review.openstack.org/#/c/87404/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_base_report.py  || https://review.openstack.org/#/c/87973/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_openstack_generators.py  || https://review.openstack.org/#/c/88124/ ||  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_views.py  || https://review.openstack.org/87376 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/rpc/test_common.py || https://review.openstack.org/#/c/80533/  || The RPC code in the incubator is deprecated in favor of oslo.messaging. --[[User:Doug-hellmann|doug-hellmann]] ([[User talk:Doug-hellmann|talk]]) 15:40, 14 April 2014 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_base_filter.py || https://review.openstack.org/#/c/80321/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_weights.py  || https://review.openstack.org/#/c/87336/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_cliutils || https://review.openstack.org/#/c/74433/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_fileutils ||  https://review.openstack.org/#/c/74728/   ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_gettext.py || https://review.openstack.org/#/c/80534/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_imageutils.py || https://review.openstack.org/#/c/90532/ || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_jsonutils.py || https://review.openstack.org/#/c/80370/  ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/test_log.py || https://review.openstack.org/104890 || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/test_processutils.py || || processutils was moved to the new oslo.concurrency project ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_quota.py || https://review.openstack.org/#/c/80564/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_strutils.py || &lt;br /&gt;
*  https://review.openstack.org/#/c/80571/ (safe_encode)&lt;br /&gt;
*  https://review.openstack.org/#/c/80573/&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common Libraries (Oslo Projects) ===&lt;br /&gt;
&lt;br /&gt;
For the list of Common Libraries, see http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml#n160&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cliff cliff] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || https://review.openstack.org/141206&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.db oslo.db] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || No unit tests with MySQL because of DB driver&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || eventlet executor and qpid driver are not supported on Python 3, greenio &lt;br /&gt;
executor may help&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || ? || The project only contains two short .py files, it looks to be Python 3 compatible. Is Sphinx Python 3 compatible?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslotest oslotest] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color: red;&amp;quot; | No || Blocked suds dependency&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| oslo.version || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || not released on PyPI yet&lt;br /&gt;
|-&lt;br /&gt;
| pylockfile || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || related to https://pypi.python.org/pypi/lockfile ?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/stevedore stevedore] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Development tools:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo-cookiecutter oslo-cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/pbr pbr] || ? ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenStack clients ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-barbicanclient python-barbicanclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:orange;&amp;quot; | In the git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ceilometerclient python-ceilometerclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ganttclient python-ganttclient] ||  ? || ? || ? || ? ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-glanceclient python-glanceclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen&amp;quot; | On PyPI || || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-heatclient python-heatclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ironicclient python-ironicclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot;  | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color:lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-melangeclient python-melangeclient] ||  ? || ? || ? || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-novaclient python-novaclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPII || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style=&amp;quot;background-color: orange;&amp;quot; | Not released yet || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-openstackclient python-openstackclient]      || style=&amp;quot;background-color: lightgreen&amp;quot; | OK || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | Yes || || As of 0.9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-saharaclient python-saharaclient]    || style=&amp;quot;background-color: orange;&amp;quot; | In progress || style=&amp;quot;background-color: orange&amp;quot; | Non-voting || ||  || https://review.openstack.org/#/c/73128/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-swiftclient python-swiftclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | [https://pypi.python.org/pypi/python-swiftclient/ On PyPI] || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-tuskarclient python-tuskarclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Core OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Completely updated on Monday, September the 29th.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Trove classifiers !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ceilometer ceilometer] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  croniter&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  thrift (which is blocking happybase)&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  sphinxcontrib-docbookrestapi&lt;br /&gt;
*  sphinxcontrib-httpdomain&lt;br /&gt;
*  sphinxcontrib-pecanwsme&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/cinder cinder] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-barbicanclient&lt;br /&gt;
*  rtslib-fb&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/glance glance] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  glance_store&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  qpid-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/heat heat] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  qpid-python&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/horizon horizon] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  django-pyscss&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  xstatic&lt;br /&gt;
*  xstatic-angular&lt;br /&gt;
*  xstatic-angular-cookies&lt;br /&gt;
*  xstatic-angular-mock&lt;br /&gt;
*  xstatic-bootstrap-datepicker&lt;br /&gt;
*  xstatic-d3&lt;br /&gt;
*  xstatic-font-awesome&lt;br /&gt;
*  xstatic-hogan&lt;br /&gt;
*  xstatic-jasmine&lt;br /&gt;
*  xstatic-jquery&lt;br /&gt;
*  xstatic-jquery-migrate&lt;br /&gt;
*  xstatic-jquery.quicksearch&lt;br /&gt;
*  xstatic-jquery.tablesorter&lt;br /&gt;
*  xstatic-jsencrypt&lt;br /&gt;
*  xstatic-qunit&lt;br /&gt;
*  xstatic-rickshaw&lt;br /&gt;
*  xstatic-spin&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nodeenv&lt;br /&gt;
*  nose-exclude&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/keystone keystone] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  ldappool&lt;br /&gt;
*  paste (which is blocking pysaml2)&lt;br /&gt;
*  python-ldap&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/neutron neutron] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  jsonrpclib&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nova nova] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
*  websockify&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  libvirt-python&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/swift swift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Number of core OpenStack projetcs blocked by each dependency:&lt;br /&gt;
      9 eventlet&lt;br /&gt;
      7 oslo.messaging&lt;br /&gt;
      7 oslo.db&lt;br /&gt;
      6 sqlalchemy-migrate&lt;br /&gt;
      6 paste&lt;br /&gt;
      5 python-neutronclient&lt;br /&gt;
      5 mysql-python&lt;br /&gt;
      2 suds&lt;br /&gt;
      2 qpid-python&lt;br /&gt;
      2 python-saharaclient&lt;br /&gt;
      2 pycadf&lt;br /&gt;
      2 openstack.nose_plugin&lt;br /&gt;
      2 nosehtmloutput&lt;br /&gt;
      1 xstatic-spin&lt;br /&gt;
      1 xstatic-rickshaw&lt;br /&gt;
      1 xstatic-qunit&lt;br /&gt;
      1 xstatic-jsencrypt&lt;br /&gt;
      1 xstatic-jquery.tablesorter&lt;br /&gt;
      1 xstatic-jquery.quicksearch&lt;br /&gt;
      1 xstatic-jquery-migrate&lt;br /&gt;
      1 xstatic-jquery&lt;br /&gt;
      1 xstatic-jasmine&lt;br /&gt;
      1 xstatic-hogan&lt;br /&gt;
      1 xstatic-font-awesome&lt;br /&gt;
      1 xstatic-d3&lt;br /&gt;
      1 xstatic-bootstrap-datepicker&lt;br /&gt;
      1 xstatic-angular-mock&lt;br /&gt;
      1 xstatic-angular-cookies&lt;br /&gt;
      1 xstatic-angular&lt;br /&gt;
      1 xstatic&lt;br /&gt;
      1 websockify&lt;br /&gt;
      1 thrift&lt;br /&gt;
      1 sphinxcontrib-pecanwsme&lt;br /&gt;
      1 sphinxcontrib-httpdomain&lt;br /&gt;
      1 sphinxcontrib-docbookrestapi&lt;br /&gt;
      1 rtslib-fb&lt;br /&gt;
      1 python-ldap&lt;br /&gt;
      1 python-barbicanclient&lt;br /&gt;
      1 nose-exclude&lt;br /&gt;
      1 nodeenv&lt;br /&gt;
      1 libvirt-python&lt;br /&gt;
      1 ldappool&lt;br /&gt;
      1 jsonrpclib&lt;br /&gt;
      1 glance_store&lt;br /&gt;
      1 django-pyscss&lt;br /&gt;
      1 croniter&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
[https://caniusepython3.com/check/4fd5dda2-b1f1-4db4-a636-67cd3276cb6a Porting status] for [https://github.com/openstack/requirements/blob/master/global-requirements.txt global-requirement.txt].&lt;br /&gt;
&lt;br /&gt;
It's now possible to specify different dependencies for Python 2 and Python 3 using:&lt;br /&gt;
* requirements-py2.txt: all dependencies for Python 2 (not only dependencies specific to Python 2)&lt;br /&gt;
* requirements-py3.txt: all dependencies for Python 3 (not only dependencies specific to Python 3)&lt;br /&gt;
* (same for test-requirements.txt)&lt;br /&gt;
&lt;br /&gt;
You have to edit tox.ini to specify the right requirements file. Extract of a tox.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
[testenv:py33]&lt;br /&gt;
deps = -r{toxinidir}/requirements-py3.txt&lt;br /&gt;
       -r{toxinidir}/test-requirements-py3.txt&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also a patch to support markers in requirements (in pip): [https://github.com/pypa/pip/issues/1433 pip issue: Support markers in setup(install_requires)?]; [https://github.com/pypa/pip/pull/1472 Victor Stinner's pull request: &amp;quot;parse requirements in markers&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
OpenStack Dependencies:&lt;br /&gt;
&lt;br /&gt;
* mox: use mox3 or port tests on mock which works on Python 3 (mock has been integrated in Python 3.3 as unittest.mock). Examples:&lt;br /&gt;
** neutronclient: https://review.openstack.org/#/c/95786/&lt;br /&gt;
** Oslo Incubator: https://review.openstack.org/#/c/93729/&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/boto boto] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || See https://github.com/boto/boto3 (experimental) &amp;lt;- This seems dead, and https://github.com/boto/boto works with Python 3.x (since 2.32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-compressor django-compressor] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Requirements upgraded: https://review.openstack.org/94357&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-openstack-auth django-openstack-auth] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || &lt;br /&gt;
As of 1.1.6&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/dnspython dnspython] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Must use the [https://pypi.python.org/pypi/dnspython3/ Python 3 version], see https://github.com/rthalley/dnspython/issues/60&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ecdsa ecdsa] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo || ||Py3 support merge before the 0.10 release (see https://github.com/warner/python-ecdsa/commits/master)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/eventlet eventlet] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || eventlet portage to Python 3 in progress: [https://github.com/eventlet/eventlet/issues/6 eventlet issue #6: Support Python 3.3] and [https://github.com/eventlet/eventlet/pull/99 Pull request #99: Fix several issues with python3 thread patching]. Victor Stinner is working on [http://trollius.readthedocs.org/ Trollius] (asyncio for Python 2) which may replace eventlet: [http://techs.enovance.com/6562/asyncio-openstack-python3 Use the new asyncio module and Trollius in OpenStack]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Cyril Roelandt patch: [https://review.openstack.org/#/c/77585/ Make hacking Python 3 compatible]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/jsonrpclib jsonrpclib] || style=&amp;quot;background-color:red;&amp;quot; | No || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead :(&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/mysql-python mysql-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || 2 pull requests for Python 3 (https://github.com/farcepest/MySQLdb1/pulls). The projects is being renamed to moist (https://github.com/farcepest/moist), Python 3 support might happen there. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/netifaces netifaces] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Patch sent by Victor Stinner (in private): [https://bitbucket.org/haypo/misc/src/tip/openstack/netifaces_python3.patch netifaces_python3.patch], Debian has patches too. Python 3 support as of 0.10.4. Pushed to requirements: https://review.openstack.org/94358 .&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nose-exclude nose-exclude] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/kgrandis/nose-exclude/issue/10/test-failures-with-python-3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nosehtmloutput nosehtmloutput] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  nose-exclude (tests only)&lt;br /&gt;
*  openstack.nose-plugin&lt;br /&gt;
||&lt;br /&gt;
*  https://bugs.launchpad.net/ubuntu/+source/python-nosehtmloutput/+bug/1287247&lt;br /&gt;
*  https://review.openstack.org/#/c/80956/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/nosexcover nosexcover] || style=&amp;quot;background-color:lightgreen;&amp;quot; | No || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Python 3 support since 1.0.9&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/openstack.nose-plugin openstack.nose-plugin] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || suds || &lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Portage in Progress by Victor Stinner ([https://review.openstack.org/#/dashboard/9107 dashboard])&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI (1.1.0) || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || No tests :) || style=&amp;quot;background-color: lightgreen;&amp;quot; | In the git repo, not on PyPI || || https://review.openstack.org/#/c/79311/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.sphinx oslo.sphinx] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Must be replaced by oslosphinx (without the dot)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pam pam] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The fork [https://pypi.python.org/pypi/simplepam simplepam] works on Python 2 and 3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paramiko paramiko] ||  style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Requirements upgraded: https://review.openstack.org/#/c/81132/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paste paste] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/ianb/paste/pull-request/9/python-3-support/diff&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pycadf pycadf] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Classifiers added https://review.openstack.org/#/c/133088/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ldap python-ldap] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-memcached python-memcached] || style=&amp;quot;background-color:green;&amp;quot; | Not released, but last commit on git has it || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || [https://github.com/jbalogh/django-cache-machine/issues/52 Issue #52: Python 3.3 support? ], [https://github.com/linsomniac/python-memcached/pull/26 Pull request #26: Python 3.3 Support] -- Julien Danjou ported [https://pypi.python.org/pypi/pymemcache pymemcache] to Python 3, another memcached client, he suggests to use this one instead&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/qpid-python qpid-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/rtslib-fb rtslib-fb] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-docbookrestapi sphinxcontrib-docbookrestapi] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Support for 3.3, but not for 3.4, PyPI not updated.&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-httpdomain sphinxcontrib-httpdomain] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-pecanwsme sphinxcontrib-pecanwsme] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No|| &lt;br /&gt;
*  hacking&lt;br /&gt;
*  ibm-db-sa&lt;br /&gt;
*  scripttest&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/suds suds] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || &amp;quot;Lightweight SOAP client&amp;quot;. Last commit 2 years ago: https://fedorahosted.org/suds/browser See also this fork which is promising: https://bitbucket.org/jurko/suds&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/thrift thrift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/websockify websockify] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Python 3 compatible:&lt;br /&gt;
&lt;br /&gt;
* stackforge/python-jenkins : https://review.openstack.org/#/c/95004/ (py33 gate is voting)&lt;br /&gt;
* openstack-infra/jenkins-job-builder : https://review.openstack.org/87810 (Python 3 support finally merged in, Sept. 2014)&lt;br /&gt;
&lt;br /&gt;
== Reports at OpenStack Summits ==&lt;br /&gt;
&lt;br /&gt;
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3&lt;br /&gt;
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
Enovance organizes a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday). See the page [[Python3/SprintPycon2014]].&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75173</id>
		<title>Python3</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Python3&amp;diff=75173"/>
				<updated>2015-03-06T11:49:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Dependencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page tracks the progress of Python 3 effort porting for OpenStack.&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[http://techs.enovance.com/6521/openstack_python3 Why should OpenStack move to Python 3 right now?]&lt;br /&gt;
:''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.''&lt;br /&gt;
&lt;br /&gt;
== Port Python 2 code to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
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. Debian Stable provides Python 3 but only Python 3.2, so u'unicode' syntax should be avoided (use six.u('unicode') instead).&lt;br /&gt;
&lt;br /&gt;
=== Common patterns ===&lt;br /&gt;
&lt;br /&gt;
* Replace dict.iteritems() with six.iteritems(dict)&lt;br /&gt;
* Replace iterator.next() with next(iterator)&lt;br /&gt;
* Replace basestring with six.string_types&lt;br /&gt;
* Replace unicode with six.text_type&lt;br /&gt;
&lt;br /&gt;
=== bytes.decode and unicode.encode ===&lt;br /&gt;
&lt;br /&gt;
Python has a notion of &amp;quot;default encoding&amp;quot;: sys.getdefaultencoding(). On Python 2, the default encoding is ASCII, whereas it is UTF-8 on Python 3.&lt;br /&gt;
&lt;br /&gt;
Don't write &amp;lt;code&amp;gt;data.decode()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode()&amp;lt;/code&amp;gt; without parameter, because you will use a different encoding on Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Use an explicit encoding instead. Example: &amp;lt;code&amp;gt;data.decode('utf-8')&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;text.encode('utf-8')&amp;lt;/code&amp;gt;. The right encoding depends on the use case, but UTF-8 is usually a good candidate (it is a superset of ASCII).&lt;br /&gt;
&lt;br /&gt;
=== safe_decode ===&lt;br /&gt;
&lt;br /&gt;
Olso Incubator has a function '''safe_decode()''' which can be used to decode a bytes string and pass text strings unchanged.&lt;br /&gt;
&lt;br /&gt;
The default encoding is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
It's safer to explicit the encoding to not rely on the locale encoding and have the same behaviour even if sys.stdin is &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data, 'utf-8')&amp;lt;/code&amp;gt;: decode bytes from UTF-8 or returns data unchanged if it's already a text string&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_decode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, the decoder is strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: safe_decode(b'[\xff]', 'ascii', 'ignore') returns '[]'.&lt;br /&gt;
&lt;br /&gt;
=== safe_encode ===&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(text)&amp;lt;/code&amp;gt; encodes text to the output encoding&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(bytes)&amp;lt;/code&amp;gt; may decode the string and then reencode to a different encoding if input and output encodings are different&lt;br /&gt;
&lt;br /&gt;
The default input encoding (&amp;lt;code&amp;gt;incomding&amp;lt;/code&amp;gt; parameter) is &amp;lt;code&amp;gt;sys.stdin.encoding or sys.getdefaultencoding()&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Python 3: the locale encoding, or UTF-8 if sys.stdin is &amp;quot;mocked&amp;quot; (io.StringIO instance)&lt;br /&gt;
* Python 2: the locale encoding, or ASCII if stdin is not a TTY or if sys.stdin is &amp;quot;mocked&amp;quot; (StringIO.StringIO instance)&lt;br /&gt;
&lt;br /&gt;
The default output encoding (&amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter) is UTF-8.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;mocked&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Safe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data, incoming='utf-8')&amp;lt;/code&amp;gt;: 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)&lt;br /&gt;
&lt;br /&gt;
Unsafe usage:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(data)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
* &amp;lt;code&amp;gt;safe_encode(b'\xe9', incoming='latin-1')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'\xc3\xa9'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
By default, the encoder and the decoder are strict. You can specify a different error handler using the optional &amp;lt;code&amp;gt;errors&amp;lt;/code&amp;gt; parameter. Example: &amp;lt;code&amp;gt;safe_encode(b'[\xff]', incoming='ascii', errors='ignore')&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;b'[]'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== logging module and format exceptions ===&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;code&amp;gt;b'hello'&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;'hello'&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
There is no clear rule for format exceptions yet. There are different choices depending on the project:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;: native string, so use bytes on Python 2&lt;br /&gt;
* &amp;lt;code&amp;gt;six.text_type(exc)&amp;lt;/code&amp;gt;: always use Unicode. It may raise unicode error depending on the exception, be careful. Example of such error in python 2: &amp;lt;code&amp;gt;unicode(Exception(&amp;quot;nonascii:\xe9&amp;quot;))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;six.u(str(exc))&amp;lt;/code&amp;gt;: unsafe on Python 2 if str(exc) contains non-ASCII bytes, ex: &amp;lt;code&amp;gt;unicode(str(Exception(&amp;quot;\xff&amp;quot;)))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;LOG.exception(_LE(&amp;quot;... %(exc)s ...&amp;quot;), {&amp;quot;exc&amp;quot;: exc, ...})&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since logging functions expect text strings on Python 3, logged exceptions should be formatted using &amp;lt;code&amp;gt;str(exc)&amp;lt;/code&amp;gt;. Example: &amp;lt;code&amp;gt;LOG.debug(str(exc))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
The HTTP protocol is based on '''bytes''':&lt;br /&gt;
&lt;br /&gt;
* HTTP body contains '''bytes'''. For example, use io.BytesIO for a stream storing an HTTP body.&lt;br /&gt;
* HTTPConnection.getresponse().read() returns '''bytes''' (in Python 3, '''str''' which is bytes in Python 2)&lt;br /&gt;
* 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)&lt;br /&gt;
* 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://stackoverflow.com/questions/4400678/http-header-should-use-what-character-encoding  HTTP header should use what character encoding?]&lt;br /&gt;
&lt;br /&gt;
=== References to port Python 2 code to Python 3 ===&lt;br /&gt;
* [http://python3porting.com/ Porting to Python 3 Book] by Lennart Regebro, especially the [http://python3porting.com/differences.html Language differences and workarounds].&lt;br /&gt;
* [http://docs.python.org/dev/howto/pyporting.html HOWTO: Porting Python 2 Code to Python 3] by Brett Cannon&lt;br /&gt;
* [https://wiki.python.org/moin/PortingPythonToPy3k Porting Python Code to 3.x]&lt;br /&gt;
* [http://code.google.com/p/python-incompatibility/  python-incompatibility]: Demonstrates incompatibilities between Python versions.&lt;br /&gt;
&lt;br /&gt;
=== Common pitfalls ===&lt;br /&gt;
&lt;br /&gt;
==== What is a string ? ====&lt;br /&gt;
You should definitely not talk about &amp;quot;strings&amp;quot; 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:&lt;br /&gt;
&lt;br /&gt;
Python 2:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;type 'unicode'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;type 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(u'foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    'f'&lt;br /&gt;
&lt;br /&gt;
Python 3:&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type('foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(u'foo')&lt;br /&gt;
    &amp;lt;class 'str'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; type(b'foo')&lt;br /&gt;
    &amp;lt;class 'bytes'&amp;gt;&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance('foo', six.text_type)&lt;br /&gt;
    True&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; isinstance(b'foo', six.text_type)&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; bytes is str&lt;br /&gt;
    False&lt;br /&gt;
    &amp;gt;&amp;gt;&amp;gt; b'foo'[0]&lt;br /&gt;
    102&lt;br /&gt;
&lt;br /&gt;
==== tox/testr error: db type could not be determined ====&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;db type could not be determined&amp;quot; error comes from .testrepository/times.dbm used by testr.&lt;br /&gt;
&lt;br /&gt;
Workaround: &amp;quot;rm -rf .testrepository/&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Python 3 Status of OpenStack projects ==&lt;br /&gt;
&lt;br /&gt;
=== Oslo Incubator ===&lt;br /&gt;
&lt;br /&gt;
'''BLOCKER BUG:''' Tests using testscenarios fail on Python 3 with nosetests because of this bug:&lt;br /&gt;
https://bugs.launchpad.net/testscenarios/+bug/872887&lt;br /&gt;
&lt;br /&gt;
Recently merged reviews:&lt;br /&gt;
&lt;br /&gt;
* https://review.openstack.org/#/c/79781/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Test (full path) !! Patches !!  Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/config/test_generator.py  || https://review.openstack.org/#/c/88087/ ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/crypto/test_utils.py  || https://review.openstack.org/87413 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migration_common.py  || https://review.openstack.org/#/c/107752/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/db/sqlalchemy/test_migrate.py  || https://review.openstack.org/#/c/107921/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_models.py || https://review.openstack.org/#/c/80307/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_options.py || https://review.openstack.org/#/c/80627/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/db/sqlalchemy/test_migrate_cli.py  || https://review.openstack.org/107988 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_utils.py  || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/db/sqlalchemy/test_sqlalchemy.py  || ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/fixture/test_logging.py  || https://review.openstack.org/#/c/90318/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_request_id.py || https://review.openstack.org/#/c/80336/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/middleware/test_sizelimit.py || https://review.openstack.org/#/c/80450/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: red&amp;quot; | tests/unit/middleware/test_audit.py  || || depends on pycadf ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_guru_meditation_report.py  || https://review.openstack.org/#/c/87404/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_base_report.py  || https://review.openstack.org/#/c/87973/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_openstack_generators.py  || https://review.openstack.org/#/c/88124/ ||  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/reports/test_views.py  || https://review.openstack.org/87376 ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/rpc/test_common.py || https://review.openstack.org/#/c/80533/  || The RPC code in the incubator is deprecated in favor of oslo.messaging. --[[User:Doug-hellmann|doug-hellmann]] ([[User talk:Doug-hellmann|talk]]) 15:40, 14 April 2014 (UTC)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_base_filter.py || https://review.openstack.org/#/c/80321/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/scheduler/test_weights.py  || https://review.openstack.org/#/c/87336/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_cliutils || https://review.openstack.org/#/c/74433/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_fileutils ||  https://review.openstack.org/#/c/74728/   ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_gettext.py || https://review.openstack.org/#/c/80534/ ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_imageutils.py || https://review.openstack.org/#/c/90532/ || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_jsonutils.py || https://review.openstack.org/#/c/80370/  ||&lt;br /&gt;
|- &lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: orange&amp;quot; | tests/unit/test_log.py || https://review.openstack.org/104890 || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightblue&amp;quot; | tests/unit/test_processutils.py || || processutils was moved to the new oslo.concurrency project ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_quota.py || https://review.openstack.org/#/c/80564/  ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;background-color: lightgreen&amp;quot; | tests/unit/test_strutils.py || &lt;br /&gt;
*  https://review.openstack.org/#/c/80571/ (safe_encode)&lt;br /&gt;
*  https://review.openstack.org/#/c/80573/&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common Libraries (Oslo Projects) ===&lt;br /&gt;
&lt;br /&gt;
For the list of Common Libraries, see http://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml#n160&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cliff cliff] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.concurrency oslo.concurrency] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || https://review.openstack.org/141206&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.db oslo.db] || style=&amp;quot;background-color: orange;&amp;quot; | Partial || No unit tests with MySQL because of DB driver&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.i18n oslo.i18n] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.log oslo.log] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || eventlet executor and qpid driver are not supported on Python 3, greenio &lt;br /&gt;
executor may help&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.middleware oslo.middleware] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.serialization oslo.serialization] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || ? || The project only contains two short .py files, it looks to be Python 3 compatible. Is Sphinx Python 3 compatible?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslotest oslotest] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.versionedobjects oslo.versionedobjects] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color: red;&amp;quot; | No || Blocked suds dependency&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.utils oslo.utils] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| oslo.version || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || not released on PyPI yet&lt;br /&gt;
|-&lt;br /&gt;
| pylockfile || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || related to https://pypi.python.org/pypi/lockfile ?&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/stevedore stevedore] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Development tools:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/cookiecutter cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo-cookiecutter oslo-cookiecutter] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/pbr pbr] || ? ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OpenStack clients ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-barbicanclient python-barbicanclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:orange;&amp;quot; | In the git repo, not on PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ceilometerclient python-ceilometerclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-cinderclient python-cinderclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ganttclient python-ganttclient] ||  ? || ? || ? || ? ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-glanceclient python-glanceclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color:lightgreen&amp;quot; | On PyPI || || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-heatclient python-heatclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ironicclient python-ironicclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot;  | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-keystoneclient python-keystoneclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color:lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-marconiclient python-marconiclient]|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-melangeclient python-melangeclient] ||  ? || ? || ? || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-novaclient python-novaclient]  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPII || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-neutronclient python-neutronclient] || style=&amp;quot;background-color: orange;&amp;quot; | Not released yet || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting  || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes ||  || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-openstackclient python-openstackclient]      || style=&amp;quot;background-color: lightgreen&amp;quot; | OK || style=&amp;quot;background-color: lightgreen&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | Yes || || As of 0.9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-saharaclient python-saharaclient]    || style=&amp;quot;background-color: orange;&amp;quot; | In progress || style=&amp;quot;background-color: orange&amp;quot; | Non-voting || ||  || https://review.openstack.org/#/c/73128/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-swiftclient python-swiftclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | [https://pypi.python.org/pypi/python-swiftclient/ On PyPI] || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-tuskarclient python-tuskarclient]   || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-troveclient python-troveclient] || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen&amp;quot; | On PyPI || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Core OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Completely updated on Monday, September the 29th.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Trove classifiers !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ceilometer ceilometer] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  croniter&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  thrift (which is blocking happybase)&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  sphinxcontrib-docbookrestapi&lt;br /&gt;
*  sphinxcontrib-httpdomain&lt;br /&gt;
*  sphinxcontrib-pecanwsme&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/cinder cinder] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-barbicanclient&lt;br /&gt;
*  rtslib-fb&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/glance glance] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  glance_store&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
*  qpid-python&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/heat heat] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  qpid-python&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/horizon horizon] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  django-pyscss&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  python-saharaclient&lt;br /&gt;
*  xstatic&lt;br /&gt;
*  xstatic-angular&lt;br /&gt;
*  xstatic-angular-cookies&lt;br /&gt;
*  xstatic-angular-mock&lt;br /&gt;
*  xstatic-bootstrap-datepicker&lt;br /&gt;
*  xstatic-d3&lt;br /&gt;
*  xstatic-font-awesome&lt;br /&gt;
*  xstatic-hogan&lt;br /&gt;
*  xstatic-jasmine&lt;br /&gt;
*  xstatic-jquery&lt;br /&gt;
*  xstatic-jquery-migrate&lt;br /&gt;
*  xstatic-jquery.quicksearch&lt;br /&gt;
*  xstatic-jquery.tablesorter&lt;br /&gt;
*  xstatic-jsencrypt&lt;br /&gt;
*  xstatic-qunit&lt;br /&gt;
*  xstatic-rickshaw&lt;br /&gt;
*  xstatic-spin&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nodeenv&lt;br /&gt;
*  nose-exclude&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/keystone keystone] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  ldappool&lt;br /&gt;
*  paste (which is blocking pysaml2)&lt;br /&gt;
*  python-ldap&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/neutron neutron] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  jsonrpclib&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nova nova] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  eventlet&lt;br /&gt;
*  oslo.db&lt;br /&gt;
*  oslo.messaging&lt;br /&gt;
*  paste&lt;br /&gt;
*  pycadf&lt;br /&gt;
*  python-neutronclient&lt;br /&gt;
*  sqlalchemy-migrate&lt;br /&gt;
*  suds&lt;br /&gt;
*  websockify&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  libvirt-python&lt;br /&gt;
*  mysql-python&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/swift swift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
Requirements&lt;br /&gt;
*  eventlet&lt;br /&gt;
Requirements for tests&lt;br /&gt;
*  nosehtmloutput&lt;br /&gt;
*  openstack.nose_plugin&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Number of core OpenStack projetcs blocked by each dependency:&lt;br /&gt;
      9 eventlet&lt;br /&gt;
      7 oslo.messaging&lt;br /&gt;
      7 oslo.db&lt;br /&gt;
      6 sqlalchemy-migrate&lt;br /&gt;
      6 paste&lt;br /&gt;
      5 python-neutronclient&lt;br /&gt;
      5 mysql-python&lt;br /&gt;
      2 suds&lt;br /&gt;
      2 qpid-python&lt;br /&gt;
      2 python-saharaclient&lt;br /&gt;
      2 pycadf&lt;br /&gt;
      2 openstack.nose_plugin&lt;br /&gt;
      2 nosehtmloutput&lt;br /&gt;
      1 xstatic-spin&lt;br /&gt;
      1 xstatic-rickshaw&lt;br /&gt;
      1 xstatic-qunit&lt;br /&gt;
      1 xstatic-jsencrypt&lt;br /&gt;
      1 xstatic-jquery.tablesorter&lt;br /&gt;
      1 xstatic-jquery.quicksearch&lt;br /&gt;
      1 xstatic-jquery-migrate&lt;br /&gt;
      1 xstatic-jquery&lt;br /&gt;
      1 xstatic-jasmine&lt;br /&gt;
      1 xstatic-hogan&lt;br /&gt;
      1 xstatic-font-awesome&lt;br /&gt;
      1 xstatic-d3&lt;br /&gt;
      1 xstatic-bootstrap-datepicker&lt;br /&gt;
      1 xstatic-angular-mock&lt;br /&gt;
      1 xstatic-angular-cookies&lt;br /&gt;
      1 xstatic-angular&lt;br /&gt;
      1 xstatic&lt;br /&gt;
      1 websockify&lt;br /&gt;
      1 thrift&lt;br /&gt;
      1 sphinxcontrib-pecanwsme&lt;br /&gt;
      1 sphinxcontrib-httpdomain&lt;br /&gt;
      1 sphinxcontrib-docbookrestapi&lt;br /&gt;
      1 rtslib-fb&lt;br /&gt;
      1 python-ldap&lt;br /&gt;
      1 python-barbicanclient&lt;br /&gt;
      1 nose-exclude&lt;br /&gt;
      1 nodeenv&lt;br /&gt;
      1 libvirt-python&lt;br /&gt;
      1 ldappool&lt;br /&gt;
      1 jsonrpclib&lt;br /&gt;
      1 glance_store&lt;br /&gt;
      1 django-pyscss&lt;br /&gt;
      1 croniter&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
[https://caniusepython3.com/check/4fd5dda2-b1f1-4db4-a636-67cd3276cb6a Porting status] for [https://github.com/openstack/requirements/blob/master/global-requirements.txt global-requirement.txt].&lt;br /&gt;
&lt;br /&gt;
It's now possible to specify different dependencies for Python 2 and Python 3 using:&lt;br /&gt;
* requirements-py2.txt: all dependencies for Python 2 (not only dependencies specific to Python 2)&lt;br /&gt;
* requirements-py3.txt: all dependencies for Python 3 (not only dependencies specific to Python 3)&lt;br /&gt;
* (same for test-requirements.txt)&lt;br /&gt;
&lt;br /&gt;
You have to edit tox.ini to specify the right requirements file. Extract of a tox.ini file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
[testenv:py33]&lt;br /&gt;
deps = -r{toxinidir}/requirements-py3.txt&lt;br /&gt;
       -r{toxinidir}/test-requirements-py3.txt&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also a patch to support markers in requirements (in pip): [https://github.com/pypa/pip/issues/1433 pip issue: Support markers in setup(install_requires)?]; [https://github.com/pypa/pip/pull/1472 Victor Stinner's pull request: &amp;quot;parse requirements in markers&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
OpenStack Dependencies:&lt;br /&gt;
&lt;br /&gt;
* mox: use mox3 or port tests on mock which works on Python 3 (mock has been integrated in Python 3.3 as unittest.mock). Examples:&lt;br /&gt;
** neutronclient: https://review.openstack.org/#/c/95786/&lt;br /&gt;
** Oslo Incubator: https://review.openstack.org/#/c/93729/&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Project !! Python 3 compatibility !! CI tests running? !! Python 3 classifiers ? !! Blocked by !! Comment&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/boto boto] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || See https://github.com/boto/boto3 (experimental) &amp;lt;- This seems dead, and https://github.com/boto/boto works with Python 3.x (since 2.32).&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-compressor django-compressor] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Requirements upgraded: https://review.openstack.org/94357&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/django-openstack-auth django-openstack-auth] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || &lt;br /&gt;
As of 1.1.6&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/dnspython dnspython] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Must use the [https://pypi.python.org/pypi/dnspython3/ Python 3 version], see https://github.com/rthalley/dnspython/issues/60&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/ecdsa ecdsa] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo || ||Py3 support merge before the 0.10 release (see https://github.com/warner/python-ecdsa/commits/master)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/eventlet eventlet] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || eventlet portage to Python 3 in progress: [https://github.com/eventlet/eventlet/issues/6 eventlet issue #6: Support Python 3.3] and [https://github.com/eventlet/eventlet/pull/99 Pull request #99: Fix several issues with python3 thread patching]. Victor Stinner is working on [http://trollius.readthedocs.org/ Trollius] (asyncio for Python 2) which may replace eventlet: [http://techs.enovance.com/6562/asyncio-openstack-python3 Use the new asyncio module and Trollius in OpenStack]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/hacking hacking] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Cyril Roelandt patch: [https://review.openstack.org/#/c/77585/ Make hacking Python 3 compatible]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/jsonrpclib jsonrpclib] || style=&amp;quot;background-color:red;&amp;quot; | No || N/A || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead :(&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/mysql-python mysql-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || 2 pull requests for Python 3 (https://github.com/farcepest/MySQLdb1/pulls). The projects is being renamed to moist (https://github.com/farcepest/moist), Python 3 support might happen there. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/netifaces netifaces] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || N/A|| style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || || Patch sent by Victor Stinner (in private): [https://bitbucket.org/haypo/misc/src/tip/openstack/netifaces_python3.patch netifaces_python3.patch], Debian has patches too. Python 3 support as of 0.10.4. Pushed to requirements: https://review.openstack.org/94358 .&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nose-exclude nose-exclude] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/kgrandis/nose-exclude/issue/10/test-failures-with-python-3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/nosehtmloutput nosehtmloutput] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No ||&lt;br /&gt;
*  nose-exclude (tests only)&lt;br /&gt;
*  openstack.nose-plugin&lt;br /&gt;
||&lt;br /&gt;
*  https://bugs.launchpad.net/ubuntu/+source/python-nosehtmloutput/+bug/1287247&lt;br /&gt;
*  https://review.openstack.org/#/c/80956/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/nosexcover nosexcover] || style=&amp;quot;background-color:lightgreen;&amp;quot; | No || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Python 3 support since 1.0.9&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/openstack.nose-plugin openstack.nose-plugin] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.vmware oslo.vmware] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || suds || &lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.config oslo.config] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Voting || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.messaging oslo.messaging] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Portage in Progress by Victor Stinner ([https://review.openstack.org/#/dashboard/9107 dashboard])&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.rootwrap oslo.rootwrap] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: orange;&amp;quot; | In the Git repo, not on PyPI (1.1.0) || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslosphinx oslosphinx] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || No tests :) || style=&amp;quot;background-color: lightgreen;&amp;quot; | In the git repo, not on PyPI || || https://review.openstack.org/#/c/79311/&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/oslo.sphinx oslo.sphinx] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Must be replaced by oslosphinx (without the dot)&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pam pam] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The fork [https://pypi.python.org/pypi/simplepam simplepam] works on Python 2 and 3&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paramiko paramiko] ||  style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes  || N/A || style=&amp;quot;background-color: lightgreen;&amp;quot; | On PyPI || || Requirements upgraded: https://review.openstack.org/#/c/81132/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/paste paste] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || https://bitbucket.org/ianb/paste/pull-request/9/python-3-support/diff&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/pycadf pycadf] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || Classifiers added https://review.openstack.org/#/c/133088/&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-ldap python-ldap] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || The project seems dead.&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/python-memcached python-memcached] || style=&amp;quot;background-color:green;&amp;quot; | Not released, but last commit on git has it || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || [https://github.com/jbalogh/django-cache-machine/issues/52 Issue #52: Python 3.3 support? ], [https://github.com/linsomniac/python-memcached/pull/26 Pull request #26: Python 3.3 Support] -- Julien Danjou ported [https://pypi.python.org/pypi/pymemcache pymemcache] to Python 3, another memcached client, he suggests to use this one instead&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| [https://pypi.python.org/pypi/qpid-python qpid-python] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/rtslib-fb rtslib-fb] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-docbookrestapi sphinxcontrib-docbookrestapi] || style=&amp;quot;background-color:green;&amp;quot; | Yes || style=&amp;quot;background-color: green;&amp;quot; | Yes || style=&amp;quot;background-color: green;&amp;quot; | Yes || || Support for 3.3, but not for 3.4, PyPI not updated.&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-httpdomain sphinxcontrib-httpdomain] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sphinxcontrib-pecanwsme sphinxcontrib-pecanwsme] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/sqlalchemy-migrate sqlalchemy-migrate] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No|| &lt;br /&gt;
*  hacking&lt;br /&gt;
*  ibm-db-sa&lt;br /&gt;
*  scripttest&lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/suds suds] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || || &amp;quot;Lightweight SOAP client&amp;quot;. Last commit 2 years ago: https://fedorahosted.org/suds/browser See also this fork which is promising: https://bitbucket.org/jurko/suds&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/taskflow taskflow] || style=&amp;quot;background-color:lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || style=&amp;quot;background-color: lightgreen;&amp;quot; | Yes || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/thrift thrift] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
| [https://pypi.python.org/pypi/websockify websockify] || style=&amp;quot;background-color:red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || style=&amp;quot;background-color: red;&amp;quot; | No || ||&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other OpenStack projects ===&lt;br /&gt;
&lt;br /&gt;
Python 3 compatible:&lt;br /&gt;
&lt;br /&gt;
* stackforge/python-jenkins : https://review.openstack.org/#/c/95004/ (py33 gate is voting)&lt;br /&gt;
* openstack-infra/jenkins-job-builder : https://review.openstack.org/87810 (Python 3 support finally merged in, Sept. 2014)&lt;br /&gt;
&lt;br /&gt;
== Reports at OpenStack Summits ==&lt;br /&gt;
&lt;br /&gt;
* Havana summit notes: https://etherpad.openstack.org/p/havana-python3&lt;br /&gt;
* Icehouse summit notes: https://etherpad.openstack.org/p/IcehousePypyPy3&lt;br /&gt;
* 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)&lt;br /&gt;
&lt;br /&gt;
== Pycon Montreal 2014: Sprint Port OpenStack to Python 3 ==&lt;br /&gt;
&lt;br /&gt;
Enovance organizes a sprint to Port OpenStack to Python 3 during 4 days: between April, 14 (Monday) and April, 17 (Thursday). See the page [[Python3/SprintPycon2014]].&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64318</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64318"/>
				<updated>2014-10-06T09:42:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 export USE_IRONIC=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/install.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
Next, you create a plan:&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;name&amp;quot;: &amp;quot;overcloud&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;overcloud&amp;quot;}' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
&lt;br /&gt;
Then you need to check out the role templates:&lt;br /&gt;
&lt;br /&gt;
 # use templates from this patch https://review.openstack.org/#/c/123100/&lt;br /&gt;
 cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-heat-templates&lt;br /&gt;
 cd tripleo-heat-templates&lt;br /&gt;
 git fetch https://review.openstack.org/openstack/tripleo-heat-templates refs/changes/00/123100/4 &amp;amp;&amp;amp; git checkout FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
And load the roles:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/stack/tuskar&lt;br /&gt;
 .tox/py27/bin/tuskar-load-roles --config-file etc/tuskar/tuskar.conf  --master-seed /opt/stack/tuskar_templates/overcloud.yaml --resource-registry /opt/stack/tuskar_templates/overcloud-resource-registry.yaml --role /opt/stack/tuskar_templates/controller.yaml --role /opt/stack/tuskar_templates/compute.yaml&lt;br /&gt;
&lt;br /&gt;
Finally, you need to associate the roles with the plan:&lt;br /&gt;
&lt;br /&gt;
 # list the plan to get the ID&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
 # list roles to get their uuids&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/roles&lt;br /&gt;
 # add each role to the plan (you'll have to run this once for each role)&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;uuid&amp;quot;: &amp;quot;&amp;lt;role_uuid&amp;gt;&amp;quot;}' http://127.0.0.1:8585/v2/plans/&amp;lt;plan_uuid&amp;gt;roles&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64317</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64317"/>
				<updated>2014-10-06T09:39:56Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 export USE_IRONIC=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/install.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
Next, you create a plan:&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;name&amp;quot;: &amp;quot;overcloud&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;overcloud&amp;quot;}' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
&lt;br /&gt;
Then you need to check out the role templates:&lt;br /&gt;
&lt;br /&gt;
 # use templates from this patch https://review.openstack.org/#/c/123100/&lt;br /&gt;
 cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-heat-templates&lt;br /&gt;
 cd tripleo-heat-templates&lt;br /&gt;
 git fetch https://review.openstack.org/openstack/tripleo-heat-templates refs/changes/00/123100/4 &amp;amp;&amp;amp; git checkout FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
And load the roles:&lt;br /&gt;
&lt;br /&gt;
 cd /opt/stack/tuskar&lt;br /&gt;
 .tox/py27/bin/tuskar-load-roles --config-file etc/tuskar/tuskar.conf  --master-seed /opt/stack/tuskar_templates/overcloud.yaml --resource-registry /opt/stack/tuskar_templates/overcloud-resource-registry.yaml --role /opt/stack/tuskar_templates/controller.yaml --role /opt/stack/tuskar_templates/compute.yaml&lt;br /&gt;
&lt;br /&gt;
Finally, you need to associate the roles with the plan:&lt;br /&gt;
&lt;br /&gt;
# list the plan to get the ID&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
 # list roles to get their uuids&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/roles&lt;br /&gt;
 # add each role to the plan (you'll have to run this once for each role)&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;uuid&amp;quot;: &amp;quot;&amp;lt;role_uuid&amp;gt;&amp;quot;}' http://127.0.0.1:8585/v2/plans/&amp;lt;plan_uuid&amp;gt;roles&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64316</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64316"/>
				<updated>2014-10-06T09:36:22Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 export USE_IRONIC=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/install.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
Finally, you'll want to set up an initial plan, some roles, and link the two:&lt;br /&gt;
&lt;br /&gt;
 #create a plan&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;name&amp;quot;: &amp;quot;overcloud&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;overcloud&amp;quot;}' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
 # check out templates&lt;br /&gt;
 # use templates from this patch https://review.openstack.org/#/c/123100/&lt;br /&gt;
 cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-heat-templates&lt;br /&gt;
 cd tripleo-heat-templates&lt;br /&gt;
 git fetch https://review.openstack.org/openstack/tripleo-heat-templates refs/changes/00/123100/4 &amp;amp;&amp;amp; git checkout FETCH_HEAD&lt;br /&gt;
 # load roles&lt;br /&gt;
 cd /opt/stack/tuskar&lt;br /&gt;
 .tox/py27/bin/tuskar-load-roles --config-file etc/tuskar/tuskar.conf  --master-seed /opt/stack/tuskar_templates/overcloud.yaml --resource-registry /opt/stack/tuskar_templates/overcloud-resource-registry.yaml --role /opt/stack/tuskar_templates/controller.yaml --role /opt/stack/tuskar_templates/compute.yaml&lt;br /&gt;
&lt;br /&gt;
 # list roles to get their uuids&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/roles&lt;br /&gt;
 # add each role to the plan (you'll have to run this once for each role)&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;uuid&amp;quot;: &amp;quot;&amp;lt;role_uuid&amp;gt;&amp;quot;}' http://127.0.0.1:8585/v2/plans/&amp;lt;plan_uuid&amp;gt;roles&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64315</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64315"/>
				<updated>2014-10-06T09:35:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 export USE_IRONIC=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/install.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
Finally, you'll want to set up an initial plan, some roles, and link the two:&lt;br /&gt;
&lt;br /&gt;
 # create a plan&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;name&amp;quot;: &amp;quot;overcloud&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;overcloud&amp;quot;}' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
 # load roles&lt;br /&gt;
 # use templates from this patch https://review.openstack.org/#/c/123100/&lt;br /&gt;
 cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-heat-templates&lt;br /&gt;
 cd tripleo-heat-templates&lt;br /&gt;
 git fetch https://review.openstack.org/openstack/tripleo-heat-templates refs/changes/00/123100/4 &amp;amp;&amp;amp; git checkout FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
 cd /opt/stack/tuskar&lt;br /&gt;
 .tox/py27/bin/tuskar-load-roles --config-file etc/tuskar/tuskar.conf  --master-seed /opt/stack/tuskar_templates/overcloud.yaml --resource-registry /opt/stack/tuskar_templates/overcloud-resource-registry.yaml --role /opt/stack/tuskar_templates/controller.yaml --role /opt/stack/tuskar_templates/compute.yaml&lt;br /&gt;
&lt;br /&gt;
 # list roles to get their uuids&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/roles&lt;br /&gt;
 # add each role to the plan (you'll have to run this once for each role)&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;uuid&amp;quot;: &amp;quot;&amp;lt;role_uuid&amp;gt;&amp;quot;}' http://127.0.0.1:8585/v2/plans/&amp;lt;plan_uuid&amp;gt;roles&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64314</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=64314"/>
				<updated>2014-10-06T08:11:35Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 export USE_IRONIC=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/install.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
Finally, you'll want to set up an initial plan, some roles, and link the two:&lt;br /&gt;
&lt;br /&gt;
 # create a plan&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;name&amp;quot;: &amp;quot;overcloud&amp;quot;, &amp;quot;description&amp;quot;: &amp;quot;overcloud&amp;quot;}' http://127.0.0.1:8585/v2/plans&lt;br /&gt;
 # load roles&lt;br /&gt;
 # use templates from this patch https://review.openstack.org/#/c/123100/&lt;br /&gt;
 # this script is creating roles from all templates in the tuskar_roles/ dir, &lt;br /&gt;
 # so copy there only compute.yaml and controller.yaml&lt;br /&gt;
 tuskar-load-roles --config-file etc/tuskar/tuskar.conf /opt/stack/tuskar_roles/ --master-seed /opt/stack/tuskar_templates/overcloud.yaml &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 # list roles to get their uuids&lt;br /&gt;
 curl -i -X GET -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' http://127.0.0.1:8585/v2/roles&lt;br /&gt;
 # add each role to the plan (you'll have to run this once for each role)&lt;br /&gt;
 curl -i -X POST -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-tuskarclient' -d '{&amp;quot;uuid&amp;quot;: &amp;quot;&amp;lt;role_uuid&amp;gt;&amp;quot;}' http://127.0.0.1:8585/v2/plans/&amp;lt;plan_uuid&amp;gt;roles&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=61281</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=61281"/>
				<updated>2014-08-26T14:41:09Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/INSTALL.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalip&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=61280</id>
		<title>Tuskar/Devtest</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Tuskar/Devtest&amp;diff=61280"/>
				<updated>2014-08-26T14:40:54Z</updated>
		
		<summary type="html">&lt;p&gt;Lennart Regebro: /* Install Tuskar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Devtest is a script that creates a development environment for TripleO / Tuskar / TuskarUI development. Below you can find step-by-step instructions for setting up the environment using devtest. If you would like more information about how devtest works as well as the script itself, see the following links&lt;br /&gt;
* http://docs.openstack.org/developer/tripleo-incubator/index.html&lt;br /&gt;
* https://github.com/openstack/tripleo-incubator/blob/master/scripts/devtest.sh&lt;br /&gt;
However, following the steps below should lead to a complete functioning setup.&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Setup devtest ===&lt;br /&gt;
All commands (unless otherwise specified) should be run as root, in a dedicated machine you will use for TripleO development. We will call this machine &amp;quot;the lab machine&amp;quot; or &amp;quot;the lab server&amp;quot;. The setup has been tested with lab machines running Fedora 19.&lt;br /&gt;
&lt;br /&gt;
Note: You might want to move the location of the default libvirt storage pool. The default location is /var/lib/libvirt/images. Depending on your file system / partitions setup, there might not be enough space for images at this default location. To be on the safe side, you can move it to another location which has plenty of space. Below is an example how to move the default storage pool location to /home/images. If you are sure that there is enough space at the default location, you can skip this step.&lt;br /&gt;
&lt;br /&gt;
 mkdir /home/images&lt;br /&gt;
 yum install -y libvirt&lt;br /&gt;
 service libvirtd start&lt;br /&gt;
 virsh pool-destroy default&lt;br /&gt;
 virsh pool-undefine default&lt;br /&gt;
 virsh pool-define-as default dir --target /home/images&lt;br /&gt;
 virsh pool-start default&lt;br /&gt;
 virsh pool-autostart default&lt;br /&gt;
 service libvirtd restart&lt;br /&gt;
&lt;br /&gt;
Install git and kvm. Installing kvm at this point sets the ownership of the /dev/kvm correctly (it should be owned by the root user and kvm group). If you don't do this, devtest will fail due to incorrectly set ownership of /dev/kvm.&lt;br /&gt;
 yum -y install git kvm&lt;br /&gt;
&lt;br /&gt;
Check access rights on /dev/kvm afterwards. If group is not kvm or group doesn't have rw on this file, execute the following commands and reboot:&lt;br /&gt;
 chgrp kvm /dev/kvm&lt;br /&gt;
 chmod g+rw /dev/kvm&lt;br /&gt;
&lt;br /&gt;
Create devtest configuration file:&lt;br /&gt;
 cat &amp;lt;&amp;lt;'EOF' &amp;gt; ~/.devtestrc&lt;br /&gt;
 export NODE_CPU=1 NODE_MEM=4096 NODE_DISK=60 NODE_ARCH=amd64&lt;br /&gt;
 export NODE_DIST=&amp;quot;fedora selinux-permissive&amp;quot;&lt;br /&gt;
 export DIB_RELEASE=20&lt;br /&gt;
 export UNDERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_DIB_EXTRA_ARGS=&amp;quot;&amp;quot;&lt;br /&gt;
 export OVERCLOUD_COMPUTESCALE=1&lt;br /&gt;
 export TRIPLEO_CLEANUP=1&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Clone the tripleo-incubator repo and run the devtest script:&lt;br /&gt;
 export TRIPLEO_ROOT=~/tripleo&lt;br /&gt;
 mkdir -p $TRIPLEO_ROOT&lt;br /&gt;
 cd $TRIPLEO_ROOT&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tripleo-incubator&lt;br /&gt;
 $TRIPLEO_ROOT/tripleo-incubator/scripts/devtest.sh --trash-my-machine&lt;br /&gt;
 # wait around 2+ hours&lt;br /&gt;
 # mawagner: if openvswitch fails to start, see https://bugzilla.redhat.com/show_bug.cgi?id=1006412 (or just mkdir /var/lock/subsys)&lt;br /&gt;
&lt;br /&gt;
If you want to e.g. redeploy Overcloud for testing purposes, you will need to source following &lt;br /&gt;
 source tripleo-incubator/scripts/devtest_variables.sh&lt;br /&gt;
 source ./tripleo-undercloud-passwords&lt;br /&gt;
 source ./tripleo-incubator/undercloudrc&lt;br /&gt;
 source $TRIPLEO_ROOT/tripleo-incubator/cloudprompt&lt;br /&gt;
 source ~/.devtestrc&lt;br /&gt;
&lt;br /&gt;
Build the block storage image&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
       -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-cinder-volume hosts \&lt;br /&gt;
       baremetal cinder-volume neutron-openvswitch-agent os-collect-config heat-cfntools pip-cache \&lt;br /&gt;
       dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
       tee $TRIPLEO_ROOT/dib-overcloud-cinder-volume.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-cinder-volume.qcow2&lt;br /&gt;
&lt;br /&gt;
To be able to deploy object storage node, you need this&lt;br /&gt;
 $TRIPLEO_ROOT/diskimage-builder/bin/disk-image-create $NODE_DIST \&lt;br /&gt;
        -a $NODE_ARCH -o $TRIPLEO_ROOT/overcloud-swift-storage hosts \&lt;br /&gt;
        baremetal swift-storage neutron-openvswitch-agent os-collect-config \&lt;br /&gt;
        dhcp-all-interfaces $DIB_COMMON_ELEMENTS $OVERCLOUD_COMPUTE_DIB_EXTRA_ARGS 2&amp;gt;&amp;amp;1 | \&lt;br /&gt;
        tee $TRIPLEO_ROOT/dib-overcloud-swift-storage.log&lt;br /&gt;
&lt;br /&gt;
  load-image overcloud-swift-storage.qcow2&lt;br /&gt;
&lt;br /&gt;
To list MAC's for virsh listed machines run&lt;br /&gt;
 virsh list --all&lt;br /&gt;
 virsh dumpxml baremetal_0 | grep 'mac address' | cut -d\' -f2&lt;br /&gt;
&lt;br /&gt;
At this point, your devtest environment is configured. To proceed, you need to install Tuskar, Horizon and Tuskar-UI, since they are not installed by devtest.&lt;br /&gt;
&lt;br /&gt;
=== Install Tuskar ===&lt;br /&gt;
&lt;br /&gt;
 mkdir -p /opt/stack &amp;amp;&amp;amp; cd /opt/stack&lt;br /&gt;
 git clone https://git.openstack.org/openstack/tuskar&lt;br /&gt;
&lt;br /&gt;
Follow the instructions here to complete the install: https://github.com/openstack/tuskar/blob/master/doc/source/INSTALL.rst. Make sure that you create the initial data.&lt;br /&gt;
&lt;br /&gt;
To be able to deploy Overcloud via Tuskar, you need to delete the Overcloud created by Devtest first.&lt;br /&gt;
Go to the Undercloud machine and delete the Overcloud:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 source stackrc&lt;br /&gt;
 heat stack-delete overcloud&lt;br /&gt;
&lt;br /&gt;
Devtest will also set up Tuskar endpoints, but pointing to the undercloud machine. You need them point to your machine. This can be done by deleting and readding endpoints, but it's quicker to just modify them in mysql:&lt;br /&gt;
 ssh heat-admin@192.0.2.3&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mysql -u keystone -p keystone&lt;br /&gt;
 Enter password: unset&lt;br /&gt;
 update endpoint, service set endpoint.url=&amp;quot;http://&amp;lt;yourlocalid&amp;gt;:8585/&amp;quot; where service.type=&amp;quot;management&amp;quot; and endpoint.service_id=service.id;&lt;br /&gt;
&lt;br /&gt;
=== Add Horizon and Tuskar-UI ===&lt;br /&gt;
Install and configure Horizon and Tuskar-UI using the instructions at: http://tuskar-ui.readthedocs.org/en/latest/install.html.  Make sure to clone the horizon and tuskar-ui repositories in /opt/stack.&lt;br /&gt;
&lt;br /&gt;
.Afterwards, copy /root/stackrc from the undercloud to the lab machine, change the OS_AUTH_URL to point to the undercloud, and source it:&lt;br /&gt;
 ssh heat-admin@192.0.2.3 &amp;quot;sudo -i cat /root/stackrc&amp;quot; &amp;gt; /root/stackrc&lt;br /&gt;
 sed -i 's/localhost:5000/192.0.2.3:5000/' /root/stackrc&lt;br /&gt;
 source /root/stackrc&lt;br /&gt;
&lt;br /&gt;
Configure OPENSTACK_HOST in horizon settings to point to the undercloud machine:&lt;br /&gt;
 sed -i 's/OPENSTACK_HOST = &amp;quot;127.0.0.1&amp;quot;/OPENSTACK_HOST = &amp;quot;192.0.2.3&amp;quot;/' /opt/stack/horizon/openstack_dashboard/local/local_settings.py&lt;br /&gt;
&lt;br /&gt;
Start the server:&lt;br /&gt;
 tools/with_venv.sh ./manage.py runserver 0.0.0.0:8111&lt;br /&gt;
&lt;br /&gt;
Now you can see the UI from your browser (you can find credentials for dashboard in undercloud machine in /root/stackrc):&lt;br /&gt;
 lab-machine:8111&lt;br /&gt;
&lt;br /&gt;
If you want to develop locally, you need only to mount the remote folder containing the code, in your local file system:&lt;br /&gt;
 yum install -y sshfs &amp;amp;&amp;amp; mkdir -p ~/devtest&lt;br /&gt;
 sshfs root@lab-machine:/opt/stack/ ~/devtest&lt;br /&gt;
&lt;br /&gt;
=== Script for installing Tuskar and Tuskar UI ===&lt;br /&gt;
There is a script to automatically do previous two steps: https://gist.github.com/Divius/9525147. It clones to the current directory, uses sudo to do privileged operations, so it can be used by non-root. The only requirement is that stackrc file is in the current directory. Also note that the script is mostly unsupported and can become outdated.&lt;/div&gt;</summary>
		<author><name>Lennart Regebro</name></author>	</entry>

	</feed>