From dc472f3bc91e4fc6c67f2f347e2290f501727fc9 Mon Sep 17 00:00:00 2001 From: Jesse Pretorius Date: Fri, 8 Jul 2016 13:36:09 +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: I8e1881e9d33f188eae3aa34498d42a773f541e52 --- test-requirements.txt | 2 - tests/ansible-role-requirements.yml | 16 ++-- tox.ini | 127 +++++++++++++++++++--------- 3 files changed, 95 insertions(+), 50 deletions(-) diff --git a/test-requirements.txt b/test-requirements.txt index af4d44a5..c1b238ac 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.2 # Apache-2.0 flake8>=2.5.4,<2.6.0 # MIT diff --git a/tests/ansible-role-requirements.yml b/tests/ansible-role-requirements.yml index 98912199..f31bdefb 100644 --- a/tests/ansible-role-requirements.yml +++ b/tests/ansible-role-requirements.yml @@ -6,6 +6,10 @@ src: https://git.openstack.org/openstack/openstack-ansible-pip_install scm: git version: master +- name: galera_client + src: https://git.openstack.org/openstack/openstack-ansible-galera_client + scm: git + version: master - name: memcached_server src: https://git.openstack.org/openstack/openstack-ansible-memcached_server scm: git @@ -22,10 +26,6 @@ src: https://git.openstack.org/openstack/openstack-ansible-openstack_hosts scm: git version: master -- name: galera_client - src: https://git.openstack.org/openstack/openstack-ansible-galera_client - scm: git - version: master - name: galera_server src: https://git.openstack.org/openstack/openstack-ansible-galera_server scm: git @@ -34,6 +34,10 @@ src: https://git.openstack.org/openstack/openstack-ansible-rabbitmq_server scm: git version: master +- name: openstack_openrc + src: https://git.openstack.org/openstack/openstack-ansible-openstack_openrc + scm: git + version: master - name: os_keystone src: https://git.openstack.org/openstack/openstack-ansible-os_keystone scm: git @@ -50,7 +54,3 @@ src: https://git.openstack.org/openstack/openstack-ansible-os_tempest scm: git version: master -- name: openstack_openrc - src: https://git.openstack.org/openstack/openstack-ansible-openstack_openrc - scm: git - version: master diff --git a/tox.ini b/tox.ini index 96cb0f1f..76a77222 100644 --- a/tox.ini +++ b/tox.ini @@ -1,16 +1,25 @@ [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 @@ -18,32 +27,33 @@ whitelist_externals = 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" 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 [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] @@ -58,6 +68,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; @@ -83,15 +94,48 @@ 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 + # 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 \ --role-file={toxinidir}/tests/ansible-role-requirements.yml \ - --ignore-errors \ --force + + +[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 \ @@ -100,34 +144,37 @@ commands = [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} commands = - rm -rf {homedir}/.ansible - 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 + {[testenv:ansible]commands} ansible-playbook -i {toxinidir}/tests/inventory \ -e "rolename={toxinidir}" \ - -vvvv \ - {toxinidir}/tests/test.yml + -e "install_test_packages=True" \ + {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