From 4f9dac468003134033bca06e4cc89f05879ce438 Mon Sep 17 00:00:00 2001 From: Jesse Pretorius Date: Fri, 8 Jul 2016 13:38:02 +0100 Subject: [PATCH] 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: If42e739002e36669044a9396e233dbd382add4c8 (cherry picked from commit 65293e8002b794d75bc7fbe82c192711da1eb08d) --- test-requirements.txt | 2 - tox.ini | 144 +++++++++++++++++++++++++++++------------- 2 files changed, 100 insertions(+), 46 deletions(-) diff --git a/test-requirements.txt b/test-requirements.txt index a45faa54..22c7bbe7 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,5 +1,3 @@ -ansible-lint<=2.3.9 -ansible>=1.9.1,<2.0.0,!=1.9.6 bashate==0.4.0 flake8>2.4.1,<2.6.0 diff --git a/tox.ini b/tox.ini index 369f9960..fd6d97dd 100644 --- a/tox.ini +++ b/tox.ini @@ -1,48 +1,70 @@ [tox] -minversion = 1.6 +minversion = 2.0 skipsdist = True envlist = docs,linters,functional [testenv] usedevelop = True -install_command = pip install -U {opts} {packages} -deps = -r{toxinidir}/test-requirements.txt -commands = /usr/bin/find . -type f -name "*.pyc" -delete +install_command = + pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages} +deps = + -r{toxinidir}/test-requirements.txt +commands = + /usr/bin/find . -type f -name "*.pyc" -delete passenv = HOME + http_proxy + HTTP_PROXY + https_proxy + HTTPS_PROXY + no_proxy + NO_PROXY whitelist_externals = bash git rm + wget setenv = 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] commands= + bash -c "rm -rf doc/build" + doc8 doc python setup.py build_sphinx +[doc8] +# Settings for doc8: +extensions = .rst +# Disable some doc8 checks: +# D000: Check RST validity +# D001 Line too long +# D002 Trailing whitespace +ignore = D000,D001,D002 + + +[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 [testenv:venv] -deps = -r{toxinidir}/test-requirements.txt -commands = {posargs} +# NOTE(jaegerandi): 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 = + {posargs} [testenv:pep8] @@ -57,6 +79,7 @@ commands = --exclude-dir doc \ {toxinidir} | xargs flake8 --verbose" + [flake8] # Ignores the following rules due to how ansible modules work in general # F403 'from ansible.module_utils.basic import *' used; @@ -82,55 +105,88 @@ commands = {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 = - rm -rf {homedir}/.ansible + rm -rf {homedir}/.ansible/plugins git clone https://git.openstack.org/openstack/openstack-ansible-plugins \ {homedir}/.ansible/plugins - ansible-playbook --check \ - -i {toxinidir}/tests/inventory \ + # 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 + + +[testenv:ansible-syntax] +deps = + {[testenv:ansible]deps} +setenv = + {[testenv:ansible]setenv} +commands = + {[testenv:ansible]commands} + ansible-playbook -i {toxinidir}/tests/inventory \ --syntax-check \ --list-tasks \ -e "rolename={toxinidir}" \ -t ssh \ - {toxinidir}/tests/test_check.yml - ansible-playbook -i {toxinidir}/tests/inventory \ - --syntax-check \ - --list-tasks \ - -e "rolename={toxinidir}" \ {toxinidir}/tests/test.yml [testenv:ansible-lint] +deps = + {[testenv:ansible]deps} commands = - ansible-lint {toxinidir}/tests/test.yml + ansible-lint {toxinidir} [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} # NOTE(odyssey4me): We have to skip V-38462 as openstack-infra are now building # images with apt config Apt::Get::AllowUnauthenticated set # to true. commands = - rm -rf {homedir}/.ansible - git clone https://git.openstack.org/openstack/openstack-ansible-plugins \ - {homedir}/.ansible/plugins - ansible-playbook --check \ - -i {toxinidir}/tests/inventory \ - -e "rolename={toxinidir}" \ - --skip-tag V-38462,V-38574,V-38674 \ - {toxinidir}/tests/test_check.yml + {[testenv:ansible]commands} ansible-playbook -i {toxinidir}/tests/inventory \ -e "rolename={toxinidir}" \ - {toxinidir}/tests/test.yml \ - --skip-tag V-38462 + -e "install_test_packages=True" \ + --skip-tag V-38462 \ + {toxinidir}/tests/test.yml -vvvv [testenv:linters] +deps = + {[testenv:ansible]deps} +setenv = + {[testenv:ansible]setenv} commands = {[testenv:pep8]commands} {[testenv:bashate]commands} {[testenv:ansible-lint]commands} {[testenv:ansible-syntax]commands} - -[testenv:releasenotes] -commands = sphinx-build -a -E -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html