Establish a successful baseline for CI jobs

Tweaks involved renaming the odl module to avoid dashes. Also, a copy of
the policy.json file was needed to get existing tests to pass. Something
smarter will have to be devised to avoid holding a copy of a file that
ultimately belongs to Neutron core. Missing doc files were also added.

Lastly, prune the requirements to use only the ones that are stricly
required.

Change-Id: I8addb54d519ce1ab4398d32eee1bebf87c5e37b6
This commit is contained in:
armando-migliaccio
2015-01-12 14:33:40 -08:00
parent e8c2cd8f10
commit dc99cadcee
49 changed files with 334 additions and 144 deletions

4
.gitignore vendored
View File

@@ -9,8 +9,8 @@ doc/build
*.DS_Store
*.pyc
networking_odl.egg-info/
networking-odl/vcsversion.py
networking-odl/versioninfo
networking_odl/vcsversion.py
networking_odl/versioninfo
pbr*.egg/
quantum.egg-info/
quantum/vcsversion.py

View File

@@ -1,4 +1,7 @@
[DEFAULT]
test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_LOG_CAPTURE=1 ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./networking-odl/tests/unit} $LISTOPT $IDOPTION
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list

View File

@@ -13,4 +13,4 @@ Pull requests submitted through GitHub will be ignored.
Bugs should be filed on Launchpad, not GitHub:
https://bugs.launchpad.net/neutron
https://bugs.launchpad.net/neutron-odl

75
doc/source/conf.py Executable file
View File

@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
sys.path.insert(0, os.path.abspath('../..'))
# -- General configuration ----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
#'sphinx.ext.intersphinx',
'oslosphinx'
]
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'networking-odl'
copyright = u'2013, OpenStack Foundation'
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."]
# html_theme = '_theme'
# html_static_path = ['static']
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto/manual]).
latex_documents = [
('index',
'%s.tex' % project,
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]
# Example configuration for intersphinx: refer to the Python standard library.
#intersphinx_mapping = {'http://docs.python.org/': None}

View File

@@ -0,0 +1,4 @@
============
Contributing
============
.. include:: ../../CONTRIBUTING.rst

25
doc/source/index.rst Normal file
View File

@@ -0,0 +1,25 @@
.. networking-odl documentation master file, created by
sphinx-quickstart on Tue Jul 9 22:26:36 2013.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to networking-odl's documentation!
========================================================
Contents:
.. toctree::
:maxdepth: 2
readme
installation
usage
contributing
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@@ -0,0 +1,12 @@
============
Installation
============
At the command line::
$ pip install networking-odl
Or, if you have virtualenvwrapper installed::
$ mkvirtualenv networking-odl
$ pip install networking-odl

1
doc/source/readme.rst Normal file
View File

@@ -0,0 +1 @@
.. include:: ../../README.rst

7
doc/source/usage.rst Normal file
View File

@@ -0,0 +1,7 @@
========
Usage
========
To use networking-odl in a project::
import networking_odl

143
etc/policy.json Normal file
View File

@@ -0,0 +1,143 @@
{
"context_is_admin": "role:admin",
"admin_or_owner": "rule:context_is_admin or tenant_id:%(tenant_id)s",
"context_is_advsvc": "role:advsvc",
"admin_or_network_owner": "rule:context_is_admin or tenant_id:%(network:tenant_id)s",
"admin_only": "rule:context_is_admin",
"regular_user": "",
"shared": "field:networks:shared=True",
"shared_firewalls": "field:firewalls:shared=True",
"external": "field:networks:router:external=True",
"default": "rule:admin_or_owner",
"create_subnet": "rule:admin_or_network_owner",
"get_subnet": "rule:admin_or_owner or rule:shared",
"update_subnet": "rule:admin_or_network_owner",
"delete_subnet": "rule:admin_or_network_owner",
"create_network": "",
"get_network": "rule:admin_or_owner or rule:shared or rule:external or rule:context_is_advsvc",
"get_network:router:external": "rule:regular_user",
"get_network:segments": "rule:admin_only",
"get_network:provider:network_type": "rule:admin_only",
"get_network:provider:physical_network": "rule:admin_only",
"get_network:provider:segmentation_id": "rule:admin_only",
"get_network:queue_id": "rule:admin_only",
"create_network:shared": "rule:admin_only",
"create_network:router:external": "rule:admin_only",
"create_network:segments": "rule:admin_only",
"create_network:provider:network_type": "rule:admin_only",
"create_network:provider:physical_network": "rule:admin_only",
"create_network:provider:segmentation_id": "rule:admin_only",
"update_network": "rule:admin_or_owner",
"update_network:segments": "rule:admin_only",
"update_network:shared": "rule:admin_only",
"update_network:provider:network_type": "rule:admin_only",
"update_network:provider:physical_network": "rule:admin_only",
"update_network:provider:segmentation_id": "rule:admin_only",
"update_network:router:external": "rule:admin_only",
"delete_network": "rule:admin_or_owner",
"create_port": "",
"create_port:mac_address": "rule:admin_or_network_owner or rule:context_is_advsvc",
"create_port:fixed_ips": "rule:admin_or_network_owner or rule:context_is_advsvc",
"create_port:port_security_enabled": "rule:admin_or_network_owner or rule:context_is_advsvc",
"create_port:binding:host_id": "rule:admin_only",
"create_port:binding:profile": "rule:admin_only",
"create_port:mac_learning_enabled": "rule:admin_or_network_owner or rule:context_is_advsvc",
"get_port": "rule:admin_or_owner or rule:context_is_advsvc",
"get_port:queue_id": "rule:admin_only",
"get_port:binding:vif_type": "rule:admin_only",
"get_port:binding:vif_details": "rule:admin_only",
"get_port:binding:host_id": "rule:admin_only",
"get_port:binding:profile": "rule:admin_only",
"update_port": "rule:admin_or_owner or rule:context_is_advsvc",
"update_port:fixed_ips": "rule:admin_or_network_owner or rule:context_is_advsvc",
"update_port:port_security_enabled": "rule:admin_or_network_owner or rule:context_is_advsvc",
"update_port:binding:host_id": "rule:admin_only",
"update_port:binding:profile": "rule:admin_only",
"update_port:mac_learning_enabled": "rule:admin_or_network_owner or rule:context_is_advsvc",
"delete_port": "rule:admin_or_owner or rule:context_is_advsvc",
"get_router:ha": "rule:admin_only",
"create_router": "rule:regular_user",
"create_router:external_gateway_info:enable_snat": "rule:admin_only",
"create_router:distributed": "rule:admin_only",
"create_router:ha": "rule:admin_only",
"get_router": "rule:admin_or_owner",
"get_router:distributed": "rule:admin_only",
"update_router:external_gateway_info:enable_snat": "rule:admin_only",
"update_router:distributed": "rule:admin_only",
"update_router:ha": "rule:admin_only",
"delete_router": "rule:admin_or_owner",
"add_router_interface": "rule:admin_or_owner",
"remove_router_interface": "rule:admin_or_owner",
"create_router:external_gateway_info:external_fixed_ips": "rule:admin_only",
"update_router:external_gateway_info:external_fixed_ips": "rule:admin_only",
"create_firewall": "",
"get_firewall": "rule:admin_or_owner",
"create_firewall:shared": "rule:admin_only",
"get_firewall:shared": "rule:admin_only",
"update_firewall": "rule:admin_or_owner",
"update_firewall:shared": "rule:admin_only",
"delete_firewall": "rule:admin_or_owner",
"create_firewall_policy": "",
"get_firewall_policy": "rule:admin_or_owner or rule:shared_firewalls",
"create_firewall_policy:shared": "rule:admin_or_owner",
"update_firewall_policy": "rule:admin_or_owner",
"delete_firewall_policy": "rule:admin_or_owner",
"create_firewall_rule": "",
"get_firewall_rule": "rule:admin_or_owner or rule:shared_firewalls",
"update_firewall_rule": "rule:admin_or_owner",
"delete_firewall_rule": "rule:admin_or_owner",
"create_qos_queue": "rule:admin_only",
"get_qos_queue": "rule:admin_only",
"update_agent": "rule:admin_only",
"delete_agent": "rule:admin_only",
"get_agent": "rule:admin_only",
"create_dhcp-network": "rule:admin_only",
"delete_dhcp-network": "rule:admin_only",
"get_dhcp-networks": "rule:admin_only",
"create_l3-router": "rule:admin_only",
"delete_l3-router": "rule:admin_only",
"get_l3-routers": "rule:admin_only",
"get_dhcp-agents": "rule:admin_only",
"get_l3-agents": "rule:admin_only",
"get_loadbalancer-agent": "rule:admin_only",
"get_loadbalancer-pools": "rule:admin_only",
"create_floatingip": "rule:regular_user",
"create_floatingip:floating_ip_address": "rule:admin_only",
"update_floatingip": "rule:admin_or_owner",
"delete_floatingip": "rule:admin_or_owner",
"get_floatingip": "rule:admin_or_owner",
"create_network_profile": "rule:admin_only",
"update_network_profile": "rule:admin_only",
"delete_network_profile": "rule:admin_only",
"get_network_profiles": "",
"get_network_profile": "",
"update_policy_profiles": "rule:admin_only",
"get_policy_profiles": "",
"get_policy_profile": "",
"create_metering_label": "rule:admin_only",
"delete_metering_label": "rule:admin_only",
"get_metering_label": "rule:admin_only",
"create_metering_label_rule": "rule:admin_only",
"delete_metering_label_rule": "rule:admin_only",
"get_metering_label_rule": "rule:admin_only",
"get_service_provider": "rule:regular_user",
"get_lsn": "rule:admin_only",
"create_lsn": "rule:admin_only"
}

View File

@@ -16,4 +16,4 @@
import gettext
gettext.install('networking-odl', unicode=1)
gettext.install('networking_odl', unicode=1)

View File

@@ -24,7 +24,7 @@ try:
# repository. It is OK to have more than one translation function
# using the same domain, since there will still only be one message
# catalog.
_translators = oslo.i18n.TranslatorFactory(domain='networking-odl')
_translators = oslo.i18n.TranslatorFactory(domain='networking_odl')
# The primary translation function using the well-known name "_"
_ = _translators.primary
@@ -40,6 +40,6 @@ try:
_LC = _translators.log_critical
except ImportError:
# NOTE(dims): Support for cases where a project wants to use
# code from networking-odl-incubator, but is not ready to be internationalized
# code from networking_odl-incubator, but is not ready to be internationalized
# (like tempest)
_ = _LI = _LW = _LE = _LC = lambda x: x

View File

@@ -25,10 +25,10 @@ Supported configuration options:
# THIS MODULE IS DEPRECATED
#
# Please refer to
# https://etherpad.openstack.org/p/kilo-networking-odl-library-proposals for
# https://etherpad.openstack.org/p/kilo-networking_odl-library-proposals for
# the discussion leading to this deprecation.
#
# We recommend helping with the new networking-odl.cache library being created
# We recommend helping with the new networking_odl.cache library being created
# as a wrapper for dogpile.
#
########################################################################
@@ -85,7 +85,7 @@ def get_cache(url='memory://'):
parameters = parse.parse_qsl(query)
kwargs = {'options': dict(parameters)}
mgr = driver.DriverManager('networking-odl.openstack.common.cache.backends', backend,
mgr = driver.DriverManager('networking_odl.openstack.common.cache.backends', backend,
invoke_on_load=True,
invoke_args=[parsed],
invoke_kwds=kwargs)

View File

@@ -30,8 +30,8 @@ import eventlet.backdoor
import greenlet
from oslo.config import cfg
from networking-odl.openstack.common._i18n import _LI
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common._i18n import _LI
from networking_odl.openstack.common import log as logging
help_for_backdoor_port = (
"Acceptable values are 0, <port>, and <start>:<end>, where 0 results "

View File

@@ -46,8 +46,8 @@ from six import moves
_PY26 = sys.version_info[0:2] == (2, 6)
from networking-odl.openstack.common._i18n import _
from networking-odl.openstack.common import local
from networking_odl.openstack.common._i18n import _
from networking_odl.openstack.common import local
_DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S"

View File

@@ -21,8 +21,8 @@ import time
from eventlet import event
from eventlet import greenthread
from networking-odl.openstack.common._i18n import _LE, _LW
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common._i18n import _LE, _LW
from networking_odl.openstack.common import log as logging
LOG = logging.getLogger(__name__)

View File

@@ -14,7 +14,7 @@
from oslo.middleware import catch_errors
from networking-odl.openstack.common import versionutils
from networking_odl.openstack.common import versionutils
@versionutils.deprecated(as_of=versionutils.deprecated.KILO,

View File

@@ -14,7 +14,7 @@
from oslo.middleware import request_id
from networking-odl.openstack.common import versionutils
from networking_odl.openstack.common import versionutils
ENV_REQUEST_ID = 'openstack.request_id'

View File

@@ -18,8 +18,8 @@ import time
from oslo.config import cfg
import six
from networking-odl.openstack.common._i18n import _, _LE, _LI
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common._i18n import _, _LE, _LI
from networking_odl.openstack.common import log as logging
periodic_opts = [

View File

@@ -100,9 +100,9 @@ import six
import six.moves.urllib.parse as urlparse
import six.moves.urllib.request as urlrequest
from networking-odl.openstack.common import fileutils
from networking-odl.openstack.common._i18n import _, _LE, _LI
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common import fileutils
from networking_odl.openstack.common._i18n import _, _LE, _LI
from networking_odl.openstack.common import log as logging
policy_opts = [

View File

@@ -37,11 +37,11 @@ import eventlet
from eventlet import event
from oslo.config import cfg
from networking-odl.openstack.common import eventlet_backdoor
from networking-odl.openstack.common._i18n import _LE, _LI, _LW
from networking-odl.openstack.common import log as logging
from networking-odl.openstack.common import systemd
from networking-odl.openstack.common import threadgroup
from networking_odl.openstack.common import eventlet_backdoor
from networking_odl.openstack.common._i18n import _LE, _LI, _LW
from networking_odl.openstack.common import log as logging
from networking_odl.openstack.common import systemd
from networking_odl.openstack.common import threadgroup
CONF = cfg.CONF

View File

@@ -20,7 +20,7 @@ import os
import socket
import sys
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common import log as logging
LOG = logging.getLogger(__name__)

View File

@@ -16,8 +16,8 @@ import threading
import eventlet
from eventlet import greenpool
from networking-odl.openstack.common import log as logging
from networking-odl.openstack.common import loopingcall
from networking_odl.openstack.common import log as logging
from networking_odl.openstack.common import loopingcall
LOG = logging.getLogger(__name__)

View File

@@ -23,8 +23,8 @@ import inspect
import pkg_resources
import six
from networking-odl.openstack.common._i18n import _
from networking-odl.openstack.common import log as logging
from networking_odl.openstack.common._i18n import _
from networking_odl.openstack.common import log as logging
LOG = logging.getLogger(__name__)
@@ -136,7 +136,7 @@ class deprecated(object):
# TODO(tsufiev): change `functools` module to `six` as
# soon as six 1.7.4 (with fix for passing `assigned`
# argument to underlying `functools.wraps`) is released
# and added to the networking-odl-incubator requrements
# and added to the networking_odl-incubator requrements
@functools.wraps(orig_init, assigned=('__name__', '__doc__'))
def new_init(self, *args, **kwargs):
LOG.deprecated(msg, details)

View File

@@ -20,4 +20,4 @@ module=threadgroup
module=uuidutils
# The base module to hold the copy of openstack.common
base=networking-odl
base=networking_odl

View File

@@ -1,37 +1,7 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr>=0.6,!=0.7,<1.0
Paste
PasteDeploy>=1.5.0
Routes>=1.12.3,!=2.0
anyjson>=0.3.3
argparse
eventlet>=0.15.2
greenlet>=0.3.2
httplib2>=0.7.5
requests>=2.2.0,!=2.4.0
iso8601>=0.1.9
jsonrpclib
Jinja2>=2.6 # BSD License (3 clause)
keystonemiddleware>=1.0.0
netaddr>=0.7.12
python-neutronclient>=2.3.6,<3
SQLAlchemy>=0.9.7,<=0.9.99
WebOb>=1.2.3
python-keystoneclient>=0.11.1
alembic>=0.6.4
six>=1.7.0
stevedore>=1.1.0 # Apache-2.0
oslo.config>=1.4.0 # Apache-2.0
oslo.db>=1.1.0 # Apache-2.0
oslo.i18n>=1.0.0 # Apache-2.0
oslo.messaging>=1.4.0,!=1.5.0
oslo.middleware>=0.1.0 # Apache-2.0
oslo.rootwrap>=1.3.0
oslo.serialization>=1.0.0 # Apache-2.0
oslo.utils>=1.1.0 # Apache-2.0
python-novaclient>=2.18.0
Babel>=1.3
-e git://git.openstack.org/openstack/neutron.git#egg=neutron

View File

@@ -19,7 +19,7 @@ classifier =
[files]
packages =
networking-odl
networking_odl
data_files =
etc/neutron =
etc/neutron/plugins/ml2/ml2_conf_odl.ini
@@ -40,16 +40,16 @@ source-dir = doc/source
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = networking-odl/locale/networking-odl.pot
output_file = networking_odl/locale/networking-odl.pot
[compile_catalog]
directory = networking-odl/locale
directory = networking_odl/locale
domain = networking-odl
[update_catalog]
domain = networking-odl
output_dir = networking-odl/locale
input_file = networking-odl/locale/networking-odl.pot
output_dir = networking_odl/locale
input_file = networking_odl/locale/networking-odl.pot
[wheel]
universal = 1

View File

@@ -1,21 +1,16 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
hacking>=0.9.2,<0.10
cliff>=1.7.0 # Apache-2.0
coverage>=3.6
discover
fixtures>=0.3.14
mock>=1.0
python-subunit>=0.0.18
requests-mock>=0.5.1 # Apache-2.0
sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3
oslosphinx>=2.2.0 # Apache-2.0
python-subunit
sphinx>=1.1.2
oslosphinx
oslotest>=1.1.0.0a1
testrepository>=0.0.18
testtools>=0.9.36,!=1.2.0
testscenarios>=0.4
WebTest>=2.0
oslotest>=1.2.0 # Apache-2.0
psycopg2
MySQL-python
testtools>=0.9.34

77
tox.ini
View File

@@ -1,86 +1,41 @@
[tox]
envlist = py27,py33,py34,pep8
envlist = py27,pep8
minversion = 1.6
skipsdist = True
[testenv]
# Note the hash seed is set to 0 until neutron can be tested with a
# random hash seed successfully.
setenv = VIRTUAL_ENV={envdir}
PYTHONHASHSEED=0
usedevelop = True
install_command = pip install -r requirements.txt -U {opts} {packages}
deps = -r{toxinidir}/test-requirements.txt
whitelist_externals = sh
commands =
sh tools/pretty_tox.sh '{posargs}'
# there is also secret magic in pretty_tox.sh which lets you run in a fail only
# mode. To do this define the TRACE_FAILONLY environmental variable.
[testenv:hashtest]
# This is the same as default environment, but with a random PYTHONHASHSEED.
# You can also specify a specific hashseed (for test repeatability) as follows:
# tox --hashseed 1235130571 -e hashtest
setenv = VIRTUAL_ENV={envdir}
[testenv:functional]
setenv = OS_TEST_PATH=./networking-odl/tests/functional
[testenv:dsvm-functional]
setenv = OS_TEST_PATH=./networking-odl/tests/functional
OS_SUDO_TESTING=1
OS_ROOTWRAP_CMD=sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
OS_FAIL_ON_MISSING_DEPS=1
sitepackages=True
[tox:jenkins]
sitepackages = True
downloadcache = ~/cache/pip
commands = python setup.py testr --slowest --testr-args='{posargs}'
[testenv:pep8]
commands =
sh ./tools/check_bash.sh
flake8
neutron-db-manage check_migration
whitelist_externals = sh
commands = flake8
[testenv:i18n]
commands = python ./tools/check_i18n.py ./networking-odl ./tools/i18n_cfg.py
[testenv:cover]
commands =
python -m neutron.openstack.common.lockutils python setup.py testr --coverage --testr-args='{posargs}'
[testenv:venv]
commands = {posargs}
[testenv:cover]
commands = python setup.py testr --coverage --testr-args='{posargs}'
[testenv:docs]
commands = python setup.py build_sphinx
[flake8]
# E125 continuation line does not distinguish itself from next logical line
# E126 continuation line over-indented for hanging indent
# E128 continuation line under-indented for visual indent
# E129 visually indented line with same indent as next logical line
# E265 block comment should start with #
# H305 imports not grouped correctly
# H307 like imports should be grouped together
# H402 one line docstring needs punctuation
# H404 multi line docstring should start with a summary
# H405 multi line docstring summary not separated with an empty line
# H904 Wrap long lines in parentheses instead of a backslash
ignore = E125,E126,E128,E129,E265,H305,H307,H402,H404,H405,H904
show-source = true
builtins = _
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios
[testenv:pylint]
deps =
{[testenv]deps}
pylint
commands =
pylint --rcfile=.pylintrc --output-format=colorized {posargs:networking-odl}
[hacking]
import_exceptions = neutron.i18n
local-check-factory = neutron.hacking.checks.factory
show-source = True
ignore = E123,E124,E125,H803
[flake8]
# H803 skipped on purpose per list discussion.
# E123, E125 skipped as they are invalid PEP-8.
show-source = True
ignore = E123,E125,H803
builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools