Update tox configuration

In order to prepare for implementing requirements management by the
OpenStack requirements management process 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.

This is a combined backport of the following:
- https://review.openstack.org/338193
- https://review.openstack.org/332443
- https://review.openstack.org/338193
- https://review.openstack.org/323507

Change-Id: I2ef319e48a4106d911e2ceaddce2c17094ac1aa7
This commit is contained in:
Jesse Pretorius 2016-06-17 17:34:57 +01:00
parent 2242e4e7e9
commit 681b84f856
2 changed files with 84 additions and 36 deletions

View File

@ -1,5 +1,3 @@
ansible-lint<=2.3.9
ansible>=1.9.1,<2.0.0,!=1.9.6
bashate==0.4.0 bashate==0.4.0
flake8>2.4.1,<2.6.0 flake8>2.4.1,<2.6.0

118
tox.ini
View File

@ -1,48 +1,59 @@
[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
rm rm
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]
@ -57,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;
@ -82,15 +94,47 @@ 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
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
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 \
@ -99,30 +143,36 @@ 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
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}" \
{toxinidir}/tests/test.yml {toxinidir}/tests/test.yml
[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