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: I6ae5a5e1beab62992dc7cf35fa85057a2c648851
This commit is contained in:
Jesse Pretorius 2016-07-08 13:35:37 +01:00
parent 8b3f346921
commit ff280f7957
2 changed files with 88 additions and 42 deletions

View File

@ -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

128
tox.ini
View File

@ -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,33 +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