cookiecutter commit for kuryr-kubernetes
Change-Id: Ie6bb10929397918420481a1063cc1187c0951981
This commit is contained in:
parent
18eba308bf
commit
04a95048a4
60
.gitignore
vendored
Normal file
60
.gitignore
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
*.py[cod]
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Packages
|
||||||
|
*.egg
|
||||||
|
*.egg-info
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
eggs
|
||||||
|
parts
|
||||||
|
bin
|
||||||
|
var
|
||||||
|
sdist
|
||||||
|
develop-eggs
|
||||||
|
lib
|
||||||
|
lib64
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
nosetests.xml
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
# Complexity
|
||||||
|
output/*.html
|
||||||
|
output/*/index.html
|
||||||
|
|
||||||
|
# Sphinx
|
||||||
|
doc/build
|
||||||
|
|
||||||
|
# pbr generates these
|
||||||
|
AUTHORS
|
||||||
|
ChangeLog
|
||||||
|
|
||||||
|
# Editors
|
||||||
|
*~
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
# Hidden directories
|
||||||
|
/.*
|
||||||
|
!/.coveragerc
|
||||||
|
!/.gitignore
|
||||||
|
!/.gitreview
|
||||||
|
!/.mailmap
|
||||||
|
!/.pylintrc
|
||||||
|
!/.testr.conf
|
||||||
|
|
||||||
|
contrib/vagrant/.vagrant
|
||||||
|
|
||||||
|
# Configuration files
|
||||||
|
etc/kuryr.conf
|
||||||
|
etc/kuryr.conf.sample
|
||||||
|
|
||||||
|
# Ignore user specific local.conf settings for vagrant
|
||||||
|
contrib/vagrant/user_local.conf
|
4
.testr.conf
Normal file
4
.testr.conf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[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:-./kuryr_kubernetes/tests/} $LISTOPT $IDOPTION | cat
|
||||||
|
test_id_option=--load-list $IDFILE
|
||||||
|
test_list_option=--list
|
17
CONTRIBUTING.rst
Normal file
17
CONTRIBUTING.rst
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
If you would like to contribute to the development of OpenStack, you must
|
||||||
|
follow the steps in this page:
|
||||||
|
|
||||||
|
http://docs.openstack.org/infra/manual/developers.html
|
||||||
|
|
||||||
|
If you already have a good understanding of how the system works and your
|
||||||
|
OpenStack accounts are set up, you can skip to the development workflow
|
||||||
|
section of this documentation to learn how changes to OpenStack should be
|
||||||
|
submitted for review via the Gerrit tool:
|
||||||
|
|
||||||
|
http://docs.openstack.org/infra/manual/developers.html#development-workflow
|
||||||
|
|
||||||
|
Pull requests submitted through GitHub will be ignored.
|
||||||
|
|
||||||
|
Bugs should be filed on Launchpad, not GitHub:
|
||||||
|
|
||||||
|
https://bugs.launchpad.net/kuryr-kubernetes
|
4
HACKING.rst
Normal file
4
HACKING.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
kuryr-kubernetes Style Commandments
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
Read the OpenStack Style Commandments http://docs.openstack.org/developer/hacking/
|
176
LICENSE
Normal file
176
LICENSE
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
6
MANIFEST.in
Normal file
6
MANIFEST.in
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
include AUTHORS
|
||||||
|
include ChangeLog
|
||||||
|
exclude .gitignore
|
||||||
|
exclude .gitreview
|
||||||
|
|
||||||
|
global-exclude *.pyc
|
19
README.rst
Normal file
19
README.rst
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
===============================
|
||||||
|
kuryr-kubernetes
|
||||||
|
===============================
|
||||||
|
|
||||||
|
Kubernetes integration with OpenStack networking
|
||||||
|
|
||||||
|
Please fill here a long description which must be at least 3 lines wrapped on
|
||||||
|
80 cols, so that distribution package maintainers can use it in their packages.
|
||||||
|
Note that this is a hard requirement.
|
||||||
|
|
||||||
|
* Free software: Apache license
|
||||||
|
* Documentation: http://docs.openstack.org/developer/kuryr-kubernetes
|
||||||
|
* Source: http://git.openstack.org/cgit/openstack/kuryr-kubernetes
|
||||||
|
* Bugs: http://bugs.launchpad.net/kuryr-kubernetes
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
* TODO
|
75
doc/source/conf.py
Executable file
75
doc/source/conf.py
Executable 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'kuryr-kubernetes'
|
||||||
|
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}
|
4
doc/source/contributing.rst
Normal file
4
doc/source/contributing.rst
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
============
|
||||||
|
Contributing
|
||||||
|
============
|
||||||
|
.. include:: ../../CONTRIBUTING.rst
|
25
doc/source/index.rst
Normal file
25
doc/source/index.rst
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
.. kuryr-kubernetes 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 kuryr-kubernetes's documentation!
|
||||||
|
========================================================
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
readme
|
||||||
|
installation
|
||||||
|
usage
|
||||||
|
contributing
|
||||||
|
|
||||||
|
Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
* :ref:`search`
|
||||||
|
|
12
doc/source/installation.rst
Normal file
12
doc/source/installation.rst
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
============
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
At the command line::
|
||||||
|
|
||||||
|
$ pip install kuryr-kubernetes
|
||||||
|
|
||||||
|
Or, if you have virtualenvwrapper installed::
|
||||||
|
|
||||||
|
$ mkvirtualenv kuryr-kubernetes
|
||||||
|
$ pip install kuryr-kubernetes
|
1
doc/source/readme.rst
Normal file
1
doc/source/readme.rst
Normal file
@ -0,0 +1 @@
|
|||||||
|
.. include:: ../../README.rst
|
7
doc/source/usage.rst
Normal file
7
doc/source/usage.rst
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
========
|
||||||
|
Usage
|
||||||
|
========
|
||||||
|
|
||||||
|
To use kuryr-kubernetes in a project::
|
||||||
|
|
||||||
|
import kuryr-kubernetes
|
17
kuryr_kubernetes/__init__.py
Normal file
17
kuryr_kubernetes/__init__.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# 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 pbr.version
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = pbr.version.VersionInfo(
|
||||||
|
'kuryr_kubernetes').version_string()
|
0
kuryr_kubernetes/tests/__init__.py
Normal file
0
kuryr_kubernetes/tests/__init__.py
Normal file
18
kuryr_kubernetes/tests/base.py
Normal file
18
kuryr_kubernetes/tests/base.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
from oslotest import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestCase(base.BaseTestCase):
|
||||||
|
|
||||||
|
"""Test case base class for all unit tests."""
|
26
kuryr_kubernetes/tests/test_kuryr_kubernetes.py
Normal file
26
kuryr_kubernetes/tests/test_kuryr_kubernetes.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
"""
|
||||||
|
test_kuryr-kubernetes
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Tests for `kuryr_kubernetes` module.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from kuryr_kubernetes.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
class TestKuryrKubernetes(base.TestCase):
|
||||||
|
|
||||||
|
def test_something(self):
|
||||||
|
pass
|
17
requirements.txt
Normal file
17
requirements.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# 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>=1.6 # Apache-2.0
|
||||||
|
Babel>=2.3.4 # BSD
|
||||||
|
Flask<1.0,>=0.10 # BSD
|
||||||
|
jsonschema!=2.5.0,<3.0.0,>=2.0.0 # MIT
|
||||||
|
netaddr!=0.7.16,>=0.7.12 # BSD
|
||||||
|
oslo.concurrency>=3.8.0 # Apache-2.0
|
||||||
|
oslo.log>=1.14.0 # Apache-2.0
|
||||||
|
oslo.serialization>=1.10.0 # Apache-2.0
|
||||||
|
oslo.utils>=3.5.0 # Apache-2.0
|
||||||
|
python-neutronclient>=4.2.0 # Apache-2.0
|
||||||
|
pyroute2>=0.3.10 # Apache-2.0 (+ dual licensed GPL2)
|
||||||
|
os-client-config>=1.13.1 # Apache-2.0
|
||||||
|
neutron-lib>=0.1.0 # Apache-2.0
|
46
setup.cfg
Normal file
46
setup.cfg
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
[metadata]
|
||||||
|
name = kuryr-kubernetes
|
||||||
|
summary = Kubernetes integration with OpenStack networking
|
||||||
|
description-file =
|
||||||
|
README.rst
|
||||||
|
author = OpenStack
|
||||||
|
author-email = openstack-dev@lists.openstack.org
|
||||||
|
home-page = http://www.openstack.org/
|
||||||
|
classifier =
|
||||||
|
Environment :: OpenStack
|
||||||
|
Intended Audience :: Information Technology
|
||||||
|
Intended Audience :: System Administrators
|
||||||
|
License :: OSI Approved :: Apache Software License
|
||||||
|
Operating System :: POSIX :: Linux
|
||||||
|
Programming Language :: Python
|
||||||
|
Programming Language :: Python :: 2
|
||||||
|
Programming Language :: Python :: 2.7
|
||||||
|
Programming Language :: Python :: 3
|
||||||
|
Programming Language :: Python :: 3.3
|
||||||
|
Programming Language :: Python :: 3.4
|
||||||
|
|
||||||
|
[files]
|
||||||
|
packages =
|
||||||
|
kuryr-kubernetes
|
||||||
|
|
||||||
|
[build_sphinx]
|
||||||
|
source-dir = doc/source
|
||||||
|
build-dir = doc/build
|
||||||
|
all_files = 1
|
||||||
|
|
||||||
|
[upload_sphinx]
|
||||||
|
upload-dir = doc/build/html
|
||||||
|
|
||||||
|
[compile_catalog]
|
||||||
|
directory = kuryr-kubernetes/locale
|
||||||
|
domain = kuryr-kubernetes
|
||||||
|
|
||||||
|
[update_catalog]
|
||||||
|
domain = kuryr-kubernetes
|
||||||
|
output_dir = kuryr-kubernetes/locale
|
||||||
|
input_file = kuryr-kubernetes/locale/kuryr-kubernetes.pot
|
||||||
|
|
||||||
|
[extract_messages]
|
||||||
|
keywords = _ gettext ngettext l_ lazy_gettext
|
||||||
|
mapping_file = babel.cfg
|
||||||
|
output_file = kuryr-kubernetes/locale/kuryr-kubernetes.pot
|
27
setup.py
Normal file
27
setup.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
|
||||||
|
import setuptools
|
||||||
|
|
||||||
|
# In python < 2.7.4, a lazy loading of package `pbr` will break
|
||||||
|
# setuptools if some other modules registered functions in `atexit`.
|
||||||
|
# solution from: http://bugs.python.org/issue15881#msg170215
|
||||||
|
try:
|
||||||
|
import multiprocessing # noqa
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
setuptools.setup(
|
||||||
|
setup_requires=['pbr'],
|
||||||
|
pbr=True)
|
17
test-requirements.txt
Normal file
17
test-requirements.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# 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.12,>=0.10.2 # Apache-2.0
|
||||||
|
|
||||||
|
coverage>=3.6 # Apache-2.0
|
||||||
|
ddt>=1.0.1 # MIT
|
||||||
|
python-subunit>=0.0.18 # Apache-2.0/BSD
|
||||||
|
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD
|
||||||
|
oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0
|
||||||
|
oslotest>=1.10.0 # Apache-2.0
|
||||||
|
testrepository>=0.0.18 # Apache-2.0/BSD
|
||||||
|
testscenarios>=0.4 # Apache-2.0/BSD
|
||||||
|
testtools>=1.4.0 # MIT
|
||||||
|
docker-py<1.8.0,>=1.6.0 # Apache-2.0
|
||||||
|
reno>=1.6.2 # Apache2
|
6
tools/pretty_tox.sh
Executable file
6
tools/pretty_tox.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
TESTRARGS=$1
|
||||||
|
|
||||||
|
exec 3>&1
|
||||||
|
status=$(exec 4>&1 >&3; ( python setup.py testr --slowest --testr-args="--subunit $TESTRARGS"; echo $? >&4 ) | $(dirname $0)/subunit-trace.py -f) && exit $status
|
306
tools/subunit-trace.py
Executable file
306
tools/subunit-trace.py
Executable file
@ -0,0 +1,306 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||||
|
# Copyright 2014 Samsung Electronics
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
"""Trace a subunit stream in reasonable detail and high accuracy."""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import functools
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import mimeparse
|
||||||
|
import subunit
|
||||||
|
import testtools
|
||||||
|
|
||||||
|
DAY_SECONDS = 60 * 60 * 24
|
||||||
|
FAILS = []
|
||||||
|
RESULTS = {}
|
||||||
|
|
||||||
|
|
||||||
|
class Starts(testtools.StreamResult):
|
||||||
|
|
||||||
|
def __init__(self, output):
|
||||||
|
super(Starts, self).__init__()
|
||||||
|
self._output = output
|
||||||
|
|
||||||
|
def startTestRun(self):
|
||||||
|
self._neednewline = False
|
||||||
|
self._emitted = set()
|
||||||
|
|
||||||
|
def status(self, test_id=None, test_status=None, test_tags=None,
|
||||||
|
runnable=True, file_name=None, file_bytes=None, eof=False,
|
||||||
|
mime_type=None, route_code=None, timestamp=None):
|
||||||
|
super(Starts, self).status(
|
||||||
|
test_id, test_status,
|
||||||
|
test_tags=test_tags, runnable=runnable, file_name=file_name,
|
||||||
|
file_bytes=file_bytes, eof=eof, mime_type=mime_type,
|
||||||
|
route_code=route_code, timestamp=timestamp)
|
||||||
|
if not test_id:
|
||||||
|
if not file_bytes:
|
||||||
|
return
|
||||||
|
if not mime_type or mime_type == 'test/plain;charset=utf8':
|
||||||
|
mime_type = 'text/plain; charset=utf-8'
|
||||||
|
primary, sub, parameters = mimeparse.parse_mime_type(mime_type)
|
||||||
|
content_type = testtools.content_type.ContentType(
|
||||||
|
primary, sub, parameters)
|
||||||
|
content = testtools.content.Content(
|
||||||
|
content_type, lambda: [file_bytes])
|
||||||
|
text = content.as_text()
|
||||||
|
if text and text[-1] not in '\r\n':
|
||||||
|
self._neednewline = True
|
||||||
|
self._output.write(text)
|
||||||
|
elif test_status == 'inprogress' and test_id not in self._emitted:
|
||||||
|
if self._neednewline:
|
||||||
|
self._neednewline = False
|
||||||
|
self._output.write('\n')
|
||||||
|
worker = ''
|
||||||
|
for tag in test_tags or ():
|
||||||
|
if tag.startswith('worker-'):
|
||||||
|
worker = '(' + tag[7:] + ') '
|
||||||
|
if timestamp:
|
||||||
|
timestr = timestamp.isoformat()
|
||||||
|
else:
|
||||||
|
timestr = ''
|
||||||
|
self._output.write('%s: %s%s [start]\n' %
|
||||||
|
(timestr, worker, test_id))
|
||||||
|
self._emitted.add(test_id)
|
||||||
|
|
||||||
|
|
||||||
|
def cleanup_test_name(name, strip_tags=True, strip_scenarios=False):
|
||||||
|
"""Clean up the test name for display.
|
||||||
|
|
||||||
|
By default we strip out the tags in the test because they don't help us
|
||||||
|
in identifying the test that is run to it's result.
|
||||||
|
|
||||||
|
Make it possible to strip out the testscenarios information (not to
|
||||||
|
be confused with tempest scenarios) however that's often needed to
|
||||||
|
indentify generated negative tests.
|
||||||
|
"""
|
||||||
|
if strip_tags:
|
||||||
|
tags_start = name.find('[')
|
||||||
|
tags_end = name.find(']')
|
||||||
|
if tags_start > 0 and tags_end > tags_start:
|
||||||
|
newname = name[:tags_start]
|
||||||
|
newname += name[tags_end + 1:]
|
||||||
|
name = newname
|
||||||
|
|
||||||
|
if strip_scenarios:
|
||||||
|
tags_start = name.find('(')
|
||||||
|
tags_end = name.find(')')
|
||||||
|
if tags_start > 0 and tags_end > tags_start:
|
||||||
|
newname = name[:tags_start]
|
||||||
|
newname += name[tags_end + 1:]
|
||||||
|
name = newname
|
||||||
|
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def get_duration(timestamps):
|
||||||
|
start, end = timestamps
|
||||||
|
if not start or not end:
|
||||||
|
duration = ''
|
||||||
|
else:
|
||||||
|
delta = end - start
|
||||||
|
duration = '%d.%06ds' % (
|
||||||
|
delta.days * DAY_SECONDS + delta.seconds, delta.microseconds)
|
||||||
|
return duration
|
||||||
|
|
||||||
|
|
||||||
|
def find_worker(test):
|
||||||
|
for tag in test['tags']:
|
||||||
|
if tag.startswith('worker-'):
|
||||||
|
return int(tag[7:])
|
||||||
|
return 'NaN'
|
||||||
|
|
||||||
|
|
||||||
|
# Print out stdout/stderr if it exists, always
|
||||||
|
def print_attachments(stream, test, all_channels=False):
|
||||||
|
"""Print out subunit attachments.
|
||||||
|
|
||||||
|
Print out subunit attachments that contain content. This
|
||||||
|
runs in 2 modes, one for successes where we print out just stdout
|
||||||
|
and stderr, and an override that dumps all the attachments.
|
||||||
|
"""
|
||||||
|
channels = ('stdout', 'stderr')
|
||||||
|
for name, detail in test['details'].items():
|
||||||
|
# NOTE(sdague): the subunit names are a little crazy, and actually
|
||||||
|
# are in the form pythonlogging:'' (with the colon and quotes)
|
||||||
|
name = name.split(':')[0]
|
||||||
|
if detail.content_type.type == 'test':
|
||||||
|
detail.content_type.type = 'text'
|
||||||
|
if (all_channels or name in channels) and detail.as_text():
|
||||||
|
title = "Captured %s:" % name
|
||||||
|
stream.write("\n%s\n%s\n" % (title, ('~' * len(title))))
|
||||||
|
# indent attachment lines 4 spaces to make them visually
|
||||||
|
# offset
|
||||||
|
for line in detail.as_text().split('\n'):
|
||||||
|
stream.write(" %s\n" % line)
|
||||||
|
|
||||||
|
|
||||||
|
def show_outcome(stream, test, print_failures=False, failonly=False):
|
||||||
|
global RESULTS
|
||||||
|
status = test['status']
|
||||||
|
# TODO(sdague): ask lifeless why on this?
|
||||||
|
if status == 'exists':
|
||||||
|
return
|
||||||
|
|
||||||
|
worker = find_worker(test)
|
||||||
|
name = cleanup_test_name(test['id'])
|
||||||
|
duration = get_duration(test['timestamps'])
|
||||||
|
|
||||||
|
if worker not in RESULTS:
|
||||||
|
RESULTS[worker] = []
|
||||||
|
RESULTS[worker].append(test)
|
||||||
|
|
||||||
|
# don't count the end of the return code as a fail
|
||||||
|
if name == 'process-returncode':
|
||||||
|
return
|
||||||
|
|
||||||
|
if status == 'fail':
|
||||||
|
FAILS.append(test)
|
||||||
|
stream.write('{%s} %s [%s] ... FAILED\n' % (
|
||||||
|
worker, name, duration))
|
||||||
|
if not print_failures:
|
||||||
|
print_attachments(stream, test, all_channels=True)
|
||||||
|
elif not failonly:
|
||||||
|
if status == 'success':
|
||||||
|
stream.write('{%s} %s [%s] ... ok\n' % (
|
||||||
|
worker, name, duration))
|
||||||
|
print_attachments(stream, test)
|
||||||
|
elif status == 'skip':
|
||||||
|
stream.write('{%s} %s ... SKIPPED: %s\n' % (
|
||||||
|
worker, name, test['details']['reason'].as_text()))
|
||||||
|
else:
|
||||||
|
stream.write('{%s} %s [%s] ... %s\n' % (
|
||||||
|
worker, name, duration, test['status']))
|
||||||
|
if not print_failures:
|
||||||
|
print_attachments(stream, test, all_channels=True)
|
||||||
|
|
||||||
|
stream.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def print_fails(stream):
|
||||||
|
"""Print summary failure report.
|
||||||
|
|
||||||
|
Currently unused, however there remains debate on inline vs. at end
|
||||||
|
reporting, so leave the utility function for later use.
|
||||||
|
"""
|
||||||
|
if not FAILS:
|
||||||
|
return
|
||||||
|
stream.write("\n==============================\n")
|
||||||
|
stream.write("Failed %s tests - output below:" % len(FAILS))
|
||||||
|
stream.write("\n==============================\n")
|
||||||
|
for f in FAILS:
|
||||||
|
stream.write("\n%s\n" % f['id'])
|
||||||
|
stream.write("%s\n" % ('-' * len(f['id'])))
|
||||||
|
print_attachments(stream, f, all_channels=True)
|
||||||
|
stream.write('\n')
|
||||||
|
|
||||||
|
|
||||||
|
def count_tests(key, value):
|
||||||
|
count = 0
|
||||||
|
for k, v in RESULTS.items():
|
||||||
|
for item in v:
|
||||||
|
if key in item:
|
||||||
|
if re.search(value, item[key]):
|
||||||
|
count += 1
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
def run_time():
|
||||||
|
runtime = 0.0
|
||||||
|
for k, v in RESULTS.items():
|
||||||
|
for test in v:
|
||||||
|
runtime += float(get_duration(test['timestamps']).strip('s'))
|
||||||
|
return runtime
|
||||||
|
|
||||||
|
|
||||||
|
def worker_stats(worker):
|
||||||
|
tests = RESULTS[worker]
|
||||||
|
num_tests = len(tests)
|
||||||
|
delta = tests[-1]['timestamps'][1] - tests[0]['timestamps'][0]
|
||||||
|
return num_tests, delta
|
||||||
|
|
||||||
|
|
||||||
|
def print_summary(stream):
|
||||||
|
stream.write("\n======\nTotals\n======\n")
|
||||||
|
stream.write("Run: %s in %s sec.\n" % (count_tests('status', '.*'),
|
||||||
|
run_time()))
|
||||||
|
stream.write(" - Passed: %s\n" % count_tests('status', 'success'))
|
||||||
|
stream.write(" - Skipped: %s\n" % count_tests('status', 'skip'))
|
||||||
|
stream.write(" - Failed: %s\n" % count_tests('status', 'fail'))
|
||||||
|
|
||||||
|
# we could have no results, especially as we filter out the process-codes
|
||||||
|
if RESULTS:
|
||||||
|
stream.write("\n==============\nWorker Balance\n==============\n")
|
||||||
|
|
||||||
|
for w in range(max(RESULTS.keys()) + 1):
|
||||||
|
if w not in RESULTS:
|
||||||
|
stream.write(
|
||||||
|
" - WARNING: missing Worker %s! "
|
||||||
|
"Race in testr accounting.\n" % w)
|
||||||
|
else:
|
||||||
|
num, time = worker_stats(w)
|
||||||
|
stream.write(" - Worker %s (%s tests) => %ss\n" %
|
||||||
|
(w, num, time))
|
||||||
|
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--no-failure-debug', '-n', action='store_true',
|
||||||
|
dest='print_failures', help='Disable printing failure '
|
||||||
|
'debug information in realtime')
|
||||||
|
parser.add_argument('--fails', '-f', action='store_true',
|
||||||
|
dest='post_fails', help='Print failure debug '
|
||||||
|
'information after the stream is proccesed')
|
||||||
|
parser.add_argument('--failonly', action='store_true',
|
||||||
|
dest='failonly', help="Don't print success items",
|
||||||
|
default=(
|
||||||
|
os.environ.get('TRACE_FAILONLY', False)
|
||||||
|
is not False))
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parse_args()
|
||||||
|
stream = subunit.ByteStreamToStreamResult(
|
||||||
|
sys.stdin, non_subunit_name='stdout')
|
||||||
|
starts = Starts(sys.stdout)
|
||||||
|
outcomes = testtools.StreamToDict(
|
||||||
|
functools.partial(show_outcome, sys.stdout,
|
||||||
|
print_failures=args.print_failures,
|
||||||
|
failonly=args.failonly))
|
||||||
|
summary = testtools.StreamSummary()
|
||||||
|
result = testtools.CopyStreamResult([starts, outcomes, summary])
|
||||||
|
result.startTestRun()
|
||||||
|
try:
|
||||||
|
stream.run(result)
|
||||||
|
finally:
|
||||||
|
result.stopTestRun()
|
||||||
|
if count_tests('status', '.*') == 0:
|
||||||
|
print("The test run didn't actually run any tests")
|
||||||
|
return 1
|
||||||
|
if args.post_fails:
|
||||||
|
print_fails(sys.stdout)
|
||||||
|
print_summary(sys.stdout)
|
||||||
|
return (0 if summary.wasSuccessful() else 1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
43
tools/tox_install.sh
Executable file
43
tools/tox_install.sh
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Many of neutron's repos suffer from the problem of depending on neutron,
|
||||||
|
# but it not existing on pypi.
|
||||||
|
|
||||||
|
# This wrapper for tox's package installer will use the existing package
|
||||||
|
# if it exists, else use zuul-cloner if that program exists, else grab it
|
||||||
|
# from neutron master via a hard-coded URL. That last case should only
|
||||||
|
# happen with devs running unit tests locally.
|
||||||
|
|
||||||
|
# From the tox.ini config page:
|
||||||
|
# install_command=ARGV
|
||||||
|
# default:
|
||||||
|
# pip install {opts} {packages}
|
||||||
|
|
||||||
|
ZUUL_CLONER=/usr/zuul-env/bin/zuul-cloner
|
||||||
|
neutron_installed=$(echo "import neutron" | python 2>/dev/null ; echo $?)
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
cwd=$(/bin/pwd)
|
||||||
|
|
||||||
|
if [ $neutron_installed -eq 0 ]; then
|
||||||
|
echo "ALREADY INSTALLED" > /tmp/tox_install.txt
|
||||||
|
echo "Neutron already installed; using existing package"
|
||||||
|
elif [ -x "$ZUUL_CLONER" ]; then
|
||||||
|
echo "ZUUL CLONER" > /tmp/tox_install.txt
|
||||||
|
cd /tmp
|
||||||
|
export ZUUL_BRANCH=${ZUUL_BRANCH-$BRANCH}
|
||||||
|
$ZUUL_CLONER --cache-dir \
|
||||||
|
/opt/git \
|
||||||
|
git://git.openstack.org \
|
||||||
|
openstack/neutron
|
||||||
|
cd openstack/neutron
|
||||||
|
pip install -e .
|
||||||
|
cd "$cwd"
|
||||||
|
else
|
||||||
|
echo "PIP HARDCODE" > /tmp/tox_install.txt
|
||||||
|
pip install -U -egit+https://git.openstack.org/openstack/neutron#egg=neutron
|
||||||
|
fi
|
||||||
|
|
||||||
|
pip install -U $*
|
||||||
|
exit $?
|
76
tox.ini
Normal file
76
tox.ini
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
[tox]
|
||||||
|
minversion = 1.6
|
||||||
|
envlist = py27,pep8
|
||||||
|
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 = {toxinidir}/tools/tox_install.sh {opts} {packages}
|
||||||
|
deps = -r{toxinidir}/requirements.txt
|
||||||
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
whitelist_externals = sh
|
||||||
|
find
|
||||||
|
commands = find . -type f -name "*.py[c|o]" -delete
|
||||||
|
sh tools/pretty_tox.sh '{posargs}'
|
||||||
|
|
||||||
|
[testenv:fullstack]
|
||||||
|
basepython = python2.7
|
||||||
|
setenv = OS_TEST_PATH=./kuryr/tests/fullstack
|
||||||
|
|
||||||
|
[testenv:debug]
|
||||||
|
commands = oslo_debug_helper {posargs}
|
||||||
|
|
||||||
|
[testenv:debug-py27]
|
||||||
|
basepython = python2.7
|
||||||
|
commands = oslo_debug_helper {posargs}
|
||||||
|
|
||||||
|
[testenv:debug-py34]
|
||||||
|
basepython = python3.4
|
||||||
|
commands = oslo_debug_helper {posargs}
|
||||||
|
|
||||||
|
[testenv:pep8]
|
||||||
|
commands = flake8
|
||||||
|
|
||||||
|
[testenv:venv]
|
||||||
|
commands = {posargs}
|
||||||
|
|
||||||
|
[testenv:cover]
|
||||||
|
commands =
|
||||||
|
python setup.py testr --coverage --testr-args='{posargs}'
|
||||||
|
coverage report
|
||||||
|
|
||||||
|
[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 '# '
|
||||||
|
# H402 one line docstring needs punctuation
|
||||||
|
# TODO(dougwig) -- uncomment this to test for remaining linkages
|
||||||
|
# N530 direct neutron imports not allowed
|
||||||
|
ignore = E125,E126,E128,E129,E265,H301,H402,N530
|
||||||
|
show-source = true
|
||||||
|
|
||||||
|
# TODO(dougw) neutron/tests/unit/vmware exclusion is a temporary services split hack
|
||||||
|
exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,.ropeproject,rally-scenarios,neutron/tests/unit/vmware*
|
||||||
|
|
||||||
|
[testenv:pylint]
|
||||||
|
deps =
|
||||||
|
{[testenv]deps}
|
||||||
|
pylint
|
||||||
|
commands =
|
||||||
|
pylint --rcfile=.pylintrc --output-format=colorized {posargs:neutron}
|
||||||
|
|
||||||
|
[hacking]
|
||||||
|
import_exceptions = neutron.i18n
|
||||||
|
local-check-factory = neutron_lib.hacking.checks.factory
|
||||||
|
|
||||||
|
[testenv:genconfig]
|
||||||
|
commands = oslo-config-generator --config-file=etc/kuryr-config-generator.conf
|
Loading…
Reference in New Issue
Block a user