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: I46f916bfe0078a43ec6537e4e3e71be44acd4891
This commit is contained in:
Jesse Pretorius 2016-07-08 13:36:01 +01:00
parent e062cf9d09
commit c357ce1f13
3 changed files with 93 additions and 48 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

View File

@ -2,6 +2,10 @@
src: https://git.openstack.org/openstack/openstack-ansible-apt_package_pinning src: https://git.openstack.org/openstack/openstack-ansible-apt_package_pinning
scm: git scm: git
version: master version: master
- name: pip_install
src: https://git.openstack.org/openstack/openstack-ansible-pip_install
scm: git
version: master
- name: galera_client - name: galera_client
src: https://git.openstack.org/openstack/openstack-ansible-galera_client src: https://git.openstack.org/openstack/openstack-ansible-galera_client
scm: git scm: git
@ -34,10 +38,6 @@
src: https://git.openstack.org/openstack/openstack-ansible-os_keystone src: https://git.openstack.org/openstack/openstack-ansible-os_keystone
scm: git scm: git
version: master version: master
- name: pip_install
src: https://git.openstack.org/openstack/openstack-ansible-pip_install
scm: git
version: master
- name: rabbitmq_server - name: rabbitmq_server
src: https://git.openstack.org/openstack/openstack-ansible-rabbitmq_server src: https://git.openstack.org/openstack/openstack-ansible-rabbitmq_server
scm: git scm: git

131
tox.ini
View File

@ -1,50 +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
echo wget
curl
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]
@ -59,15 +68,14 @@ 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;
# unable to detect undefined names # unable to detect undefined names
# H303 No wildcard (*) import. # H303 No wildcard (*) import.
ignore=F403,H303 ignore=F403,H303
# The max-line-length is being set at a greater width in order to accommodate
# jinja templating in python files, especially in the shebang.
max-line-length = 120
[testenv:bashate] [testenv:bashate]
commands = commands =
@ -86,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 \
@ -103,31 +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
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