[tox] minversion = 2.0 skipsdist = True envlist = docs,linters,releasenotes [testenv] usedevelop = True basepython = python2.7 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 passenv = HOME http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY whitelist_externals = bash rm sudo setenv = VIRTUAL_ENV={envdir} [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 ignore = D000 [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] # 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] commands = # Run hacking/flake8 check for all python files bash -c "grep --recursive --binary-files=without-match \ --files-with-match '^.!.*python$' \ --exclude-dir .eggs \ --exclude-dir .git \ --exclude-dir .tox \ --exclude-dir *.egg-info \ --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; # unable to detect undefined names # H303 No wildcard (*) import. ignore=F403,H303 [testenv:bashate] commands = # Run bashate check for all bash scripts # Ignores the following rules: # E003: Indent not multiple of 4 (we prefer to use multiples of 2) # E006: Line longer than 79 columns (as many scripts use jinja # templating, this is very difficult) # E040: Syntax error determined using `bash -n` (as many scripts # use jinja templating, this will often fail and the syntax # error will be discovered in execution anyway) bash -c "grep --recursive --binary-files=without-match \ --files-with-match '^.!.*\(ba\)\?sh$' \ --exclude-dir .tox \ --exclude-dir .git \ {toxinidir} | xargs bashate --error . --verbose --ignore=E003,E006,E040" [testenv:ansible] deps = {[testenv]deps} ansible==2.1.0 ansible-lint>=2.7.0,<3.0.0 setenv = {[testenv]setenv} ANSIBLE_HOST_KEY_CHECKING = False ANSIBLE_SSH_CONTROL_PATH = /tmp/%%h-%%r ANSIBLE_ACTION_PLUGINS = {homedir}/.ansible/roles/plugins/action ANSIBLE_CALLBACK_PLUGINS = {homedir}/.ansible/roles/plugins/callback ANSIBLE_FILTER_PLUGINS = {homedir}/.ansible/roles/plugins/filter ANSIBLE_LOOKUP_PLUGINS = {homedir}/.ansible/roles/plugins/lookup ANSIBLE_LIBRARY = {homedir}/.ansible/roles/plugins/library ANSIBLE_ROLES_PATH = {homedir}/.ansible/roles commands = rm -rf {homedir}/.ansible/roles ansible-galaxy install \ --role-file={toxinidir}/ansible-role-requirements.yml \ --force [testenv:ansible-lint] deps = {[testenv:ansible]deps} setenv = {[testenv:ansible]setenv} commands = {[testenv:ansible]commands} # Perform an Ansible lint check ansible-lint --exclude {homedir}/.ansible/roles/sshd \ {toxinidir}/tests/bootstrap-aio.yml ansible-lint {toxinidir}/playbooks/setup-everything.yml [testenv:ansible-syntax] deps = {[testenv:ansible]deps} setenv = {[testenv:ansible]setenv} commands = {[testenv:ansible]commands} # Perform an Ansible syntax check ansible-playbook -i 'localhost ansible-connection=local,' \ --syntax-check \ --list-tasks \ {toxinidir}/tests/bootstrap-aio.yml ansible-playbook -i 'localhost ansible-connection=local,' \ --syntax-check \ --list-tasks \ -e 'force_containers_destroy=yes' \ {toxinidir}/playbooks/setup-everything.yml [testenv:inventory] # Use a fixed seed since some inventory tests rely on specific ordering setenv = {[testenv]setenv} PYTHONHASHSEED = 100 commands = coverage erase coverage run {toxinidir}/tests/test_inventory.py coverage report --show-missing --include={toxinidir}/playbooks/inventory/* [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:inventory]commands} [testenv:functional] # NOTE(odyssey4me): this target fails with the default install_command # due to the lack of an upper-constraints.txt file in the repo. We # do not want or need the file in-repo, nor do we want anything # installed into the tox venv for this target, so we override both # the install_command and the deps. install_command = pip install -U --force-reinstall {opts} {packages} deps = commands = sudo {toxinidir}/scripts/gate-check-commit.sh