Update tox configuration
In order to prepare for implementing requirements management by the OpenStack requirements management process, and to improve the reliability and effectiveness of test execution, this patch implements some changes to the tox configuration: - The minimum tox version is increased in order to be able to use constraints for the python packages. - The OpenStack upper-constraints are used when preparing the test venv for the linters checks. - Any proxy environment variables set on the test host are passed into the venv to enable testing from behind a proxy. - The environment variables used by Ansible tests are moved into a new venv called 'ansible' and this environment is inherited by all Ansible-related tests. - The docs test will clean-up an existing build directory before executing the docs build. - The releasenotes build cannot use upper-constraints at this point, so it doesn't. - The Ansible role download will no longer ignore errors so that any problems discovered will result in a failed test. - The human readable logging callback plugin is implemented for functional testing. - The ansible test requirements are moved into tox.ini to ensure compliance for requirements.txt/test-requirements.txt for the global-requirements management contract. - The ~/.ansible directory as a whole is not deleted. Instead only the plugins and roles folders are deleted to ensure that zuul's Ansible artifacts are left in-place. - The ansible-lint version is updated to support execution against a folder, and the test now executes against the entire role to ensure that it captures all applicable files for lint testing. This is a combined port of the following: - https://review.openstack.org/323507 - https://review.openstack.org/338193 - https://review.openstack.org/332443 - https://review.openstack.org/338193 - https://review.openstack.org/339493 Change-Id: Ie08d1c8c82220e496bfa6d8b6743b5b3318c72ed
This commit is contained in:
parent
cfb253db09
commit
eb495e4d80
@ -1,5 +1,3 @@
|
|||||||
ansible-lint<=2.3.9
|
|
||||||
ansible>=1.9.1,<2.0.0,!=1.9.6
|
|
||||||
bashate>=0.2 # Apache-2.0
|
bashate>=0.2 # Apache-2.0
|
||||||
flake8>=2.5.4,<2.6.0 # MIT
|
flake8>=2.5.4,<2.6.0 # MIT
|
||||||
|
|
||||||
|
127
tox.ini
127
tox.ini
@ -1,16 +1,25 @@
|
|||||||
[tox]
|
[tox]
|
||||||
minversion = 1.6
|
minversion = 2.0
|
||||||
skipsdist = True
|
skipsdist = True
|
||||||
envlist = docs,linters,functional
|
envlist = docs,linters,functional
|
||||||
|
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
usedevelop = True
|
usedevelop = True
|
||||||
install_command = pip install -U {opts} {packages}
|
install_command =
|
||||||
deps = -r{toxinidir}/test-requirements.txt
|
pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}
|
||||||
commands = /usr/bin/find . -type f -name "*.pyc" -delete
|
deps =
|
||||||
|
-r{toxinidir}/test-requirements.txt
|
||||||
|
commands =
|
||||||
|
/usr/bin/find . -type f -name "*.pyc" -delete
|
||||||
passenv =
|
passenv =
|
||||||
HOME
|
HOME
|
||||||
|
http_proxy
|
||||||
|
HTTP_PROXY
|
||||||
|
https_proxy
|
||||||
|
HTTPS_PROXY
|
||||||
|
no_proxy
|
||||||
|
NO_PROXY
|
||||||
whitelist_externals =
|
whitelist_externals =
|
||||||
bash
|
bash
|
||||||
git
|
git
|
||||||
@ -18,32 +27,33 @@ whitelist_externals =
|
|||||||
wget
|
wget
|
||||||
setenv =
|
setenv =
|
||||||
VIRTUAL_ENV={envdir}
|
VIRTUAL_ENV={envdir}
|
||||||
ANSIBLE_HOST_KEY_CHECKING = False
|
|
||||||
ANSIBLE_SSH_CONTROL_PATH = /tmp/%%h-%%r
|
|
||||||
# TODO (odyssey4me) These are only here as they are non-standard folder
|
|
||||||
# names for Ansible 1.9.x. We are using the standard folder names for
|
|
||||||
# Ansible v2.x. We can remove this when we move to Ansible 2.x.
|
|
||||||
ANSIBLE_ACTION_PLUGINS = {homedir}/.ansible/plugins/action
|
|
||||||
ANSIBLE_CALLBACK_PLUGINS = {homedir}/.ansible/plugins/callback
|
|
||||||
ANSIBLE_FILTER_PLUGINS = {homedir}/.ansible/plugins/filter
|
|
||||||
ANSIBLE_LOOKUP_PLUGINS = {homedir}/.ansible/plugins/lookup
|
|
||||||
# This is required as the default is the current path or a path specified
|
|
||||||
# in ansible.cfg
|
|
||||||
ANSIBLE_LIBRARY = {homedir}/.ansible/plugins/library
|
|
||||||
# This is required as the default is '/etc/ansible/roles' or a path
|
|
||||||
# specified in ansible.cfg
|
|
||||||
ANSIBLE_ROLES_PATH = {homedir}/.ansible/roles:{toxinidir}/..
|
|
||||||
|
|
||||||
|
|
||||||
[testenv:docs]
|
[testenv:docs]
|
||||||
commands=
|
commands=
|
||||||
|
bash -c "rm -rf doc/build"
|
||||||
python setup.py build_sphinx
|
python setup.py build_sphinx
|
||||||
|
|
||||||
|
|
||||||
|
[testenv:releasenotes]
|
||||||
|
# NOTE(sdague): this target does not use constraints because
|
||||||
|
# upstream infra does not yet support it. Once that's fixed, we can
|
||||||
|
# drop the install_command.
|
||||||
|
install_command =
|
||||||
|
pip install -U --force-reinstall {opts} {packages}
|
||||||
|
commands =
|
||||||
|
sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
|
||||||
|
|
||||||
|
|
||||||
# environment used by the -infra templated docs job
|
# environment used by the -infra templated docs job
|
||||||
[testenv:venv]
|
[testenv:venv]
|
||||||
deps = -r{toxinidir}/test-requirements.txt
|
# NOTE(jaegerandi): this target does not use constraints because
|
||||||
commands = {posargs}
|
# upstream infra does not yet support it. Once that's fixed, we can
|
||||||
|
# drop the install_command.
|
||||||
|
install_command =
|
||||||
|
pip install -U --force-reinstall {opts} {packages}
|
||||||
|
commands =
|
||||||
|
{posargs}
|
||||||
|
|
||||||
|
|
||||||
[testenv:pep8]
|
[testenv:pep8]
|
||||||
@ -58,6 +68,7 @@ commands =
|
|||||||
--exclude-dir doc \
|
--exclude-dir doc \
|
||||||
{toxinidir} | xargs flake8 --verbose"
|
{toxinidir} | xargs flake8 --verbose"
|
||||||
|
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
# Ignores the following rules due to how ansible modules work in general
|
# Ignores the following rules due to how ansible modules work in general
|
||||||
# F403 'from ansible.module_utils.basic import *' used;
|
# F403 'from ansible.module_utils.basic import *' used;
|
||||||
@ -83,15 +94,48 @@ commands =
|
|||||||
{toxinidir} | xargs bashate --error . --verbose --ignore=E003,E006,E040"
|
{toxinidir} | xargs bashate --error . --verbose --ignore=E003,E006,E040"
|
||||||
|
|
||||||
|
|
||||||
[testenv:ansible-syntax]
|
[testenv:ansible]
|
||||||
|
deps =
|
||||||
|
{[testenv]deps}
|
||||||
|
ansible==1.9.4
|
||||||
|
ansible-lint>=2.7.0,<3.0.0
|
||||||
|
setenv =
|
||||||
|
{[testenv]setenv}
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING = False
|
||||||
|
ANSIBLE_SSH_CONTROL_PATH = /tmp/%%h-%%r
|
||||||
|
# TODO (odyssey4me) These are only here as they are non-standard folder
|
||||||
|
# names for Ansible 1.9.x. We are using the standard folder names for
|
||||||
|
# Ansible v2.x. We can remove this when we move to Ansible 2.x.
|
||||||
|
ANSIBLE_ACTION_PLUGINS = {homedir}/.ansible/plugins/action
|
||||||
|
ANSIBLE_CALLBACK_PLUGINS = {homedir}/.ansible/plugins/callback
|
||||||
|
ANSIBLE_FILTER_PLUGINS = {homedir}/.ansible/plugins/filter
|
||||||
|
ANSIBLE_LOOKUP_PLUGINS = {homedir}/.ansible/plugins/lookup
|
||||||
|
# This is required as the default is the current path or a path specified
|
||||||
|
# in ansible.cfg
|
||||||
|
ANSIBLE_LIBRARY = {homedir}/.ansible/plugins/library
|
||||||
|
# This is required as the default is '/etc/ansible/roles' or a path
|
||||||
|
# specified in ansible.cfg
|
||||||
|
ANSIBLE_ROLES_PATH = {homedir}/.ansible/roles:{toxinidir}/..
|
||||||
commands =
|
commands =
|
||||||
rm -rf {homedir}/.ansible
|
rm -rf {homedir}/.ansible/plugins
|
||||||
git clone https://git.openstack.org/openstack/openstack-ansible-plugins \
|
git clone https://git.openstack.org/openstack/openstack-ansible-plugins \
|
||||||
{homedir}/.ansible/plugins
|
{homedir}/.ansible/plugins
|
||||||
|
# This plugin makes the ansible-playbook output easier to read
|
||||||
|
wget -O {homedir}/.ansible/plugins/callback/human_log.py \
|
||||||
|
https://gist.githubusercontent.com/cliffano/9868180/raw/f360f306b3c6d689734a6aa8773a00edf16a0054/human_log.py
|
||||||
|
rm -rf {homedir}/.ansible/roles
|
||||||
ansible-galaxy install \
|
ansible-galaxy install \
|
||||||
--role-file={toxinidir}/tests/ansible-role-requirements.yml \
|
--role-file={toxinidir}/tests/ansible-role-requirements.yml \
|
||||||
--ignore-errors \
|
|
||||||
--force
|
--force
|
||||||
|
|
||||||
|
|
||||||
|
[testenv:ansible-syntax]
|
||||||
|
deps =
|
||||||
|
{[testenv:ansible]deps}
|
||||||
|
setenv =
|
||||||
|
{[testenv:ansible]setenv}
|
||||||
|
commands =
|
||||||
|
{[testenv:ansible]commands}
|
||||||
ansible-playbook -i {toxinidir}/tests/inventory \
|
ansible-playbook -i {toxinidir}/tests/inventory \
|
||||||
--syntax-check \
|
--syntax-check \
|
||||||
--list-tasks \
|
--list-tasks \
|
||||||
@ -100,34 +144,37 @@ commands =
|
|||||||
|
|
||||||
|
|
||||||
[testenv:ansible-lint]
|
[testenv:ansible-lint]
|
||||||
|
deps =
|
||||||
|
{[testenv:ansible]deps}
|
||||||
commands =
|
commands =
|
||||||
ansible-lint {toxinidir}/tests/test.yml
|
ansible-lint {toxinidir}
|
||||||
|
|
||||||
|
|
||||||
[testenv:functional]
|
[testenv:functional]
|
||||||
|
# NOTE(odyssey4me): this target does not use constraints because
|
||||||
|
# it doesn't work in OpenStack-CI yet. Once that's fixed, we can
|
||||||
|
# drop the install_command.
|
||||||
|
install_command =
|
||||||
|
pip install -U --force-reinstall {opts} {packages}
|
||||||
|
deps =
|
||||||
|
{[testenv:ansible]deps}
|
||||||
|
setenv =
|
||||||
|
{[testenv:ansible]setenv}
|
||||||
commands =
|
commands =
|
||||||
rm -rf {homedir}/.ansible
|
{[testenv:ansible]commands}
|
||||||
git clone https://git.openstack.org/openstack/openstack-ansible-plugins \
|
|
||||||
{homedir}/.ansible/plugins
|
|
||||||
# This plugin makes the ansible-playbook output easier to read
|
|
||||||
wget -O {homedir}/.ansible/plugins/callback/human_log.py \
|
|
||||||
https://gist.githubusercontent.com/cliffano/9868180/raw/f360f306b3c6d689734a6aa8773a00edf16a0054/human_log.py
|
|
||||||
ansible-galaxy install \
|
|
||||||
--role-file={toxinidir}/tests/ansible-role-requirements.yml \
|
|
||||||
--ignore-errors \
|
|
||||||
--force
|
|
||||||
ansible-playbook -i {toxinidir}/tests/inventory \
|
ansible-playbook -i {toxinidir}/tests/inventory \
|
||||||
-e "rolename={toxinidir}" \
|
-e "rolename={toxinidir}" \
|
||||||
-vv \
|
-e "install_test_packages=True" \
|
||||||
{toxinidir}/tests/test.yml
|
{toxinidir}/tests/test.yml -vvvv
|
||||||
|
|
||||||
|
|
||||||
[testenv:linters]
|
[testenv:linters]
|
||||||
|
deps =
|
||||||
|
{[testenv:ansible]deps}
|
||||||
|
setenv =
|
||||||
|
{[testenv:ansible]setenv}
|
||||||
commands =
|
commands =
|
||||||
{[testenv:pep8]commands}
|
{[testenv:pep8]commands}
|
||||||
{[testenv:bashate]commands}
|
{[testenv:bashate]commands}
|
||||||
{[testenv:ansible-lint]commands}
|
{[testenv:ansible-lint]commands}
|
||||||
{[testenv:ansible-syntax]commands}
|
{[testenv:ansible-syntax]commands}
|
||||||
|
|
||||||
[testenv:releasenotes]
|
|
||||||
commands = sphinx-build -a -E -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
|
|
||||||
|
Loading…
Reference in New Issue
Block a user