[tox]
envlist = pep8,py39,bashate,pip-check-reqs
minversion = 3.18.0

[tempestenv]
sitepackages = False
setenv =
    VIRTUAL_ENV={envdir}
    OS_TEST_PATH=./tempest/test_discover
    OS_TEST_TIMEOUT={env:OS_TEST_TIMEOUT:1200}
deps =
    -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/requirements.txt

[testenv]
setenv =
    VIRTUAL_ENV={envdir}
    OS_LOG_CAPTURE=1
    OS_STDOUT_CAPTURE=1
    OS_STDERR_CAPTURE=1
    OS_TEST_TIMEOUT=160
    PYTHONWARNINGS=default::DeprecationWarning,ignore::DeprecationWarning:distutils,ignore::DeprecationWarning:site
passenv =
    OS_STDOUT_CAPTURE
    OS_STDERR_CAPTURE
    OS_TEST_TIMEOUT
    OS_TEST_LOCK_PATH
    TEMPEST_CONFIG
    TEMPEST_CONFIG_DIR
    http_proxy
    HTTP_PROXY
    https_proxy
    HTTPS_PROXY
    no_proxy
    NO_PROXY
    ZUUL_CACHE_DIR
    REQUIREMENTS_PIP_LOCATION
    GENERATE_TEMPEST_PLUGIN_LIST
usedevelop = True
allowlist_externals =
    find
deps =
    -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
    -r{toxinidir}/requirements.txt
    -r{toxinidir}/test-requirements.txt
commands =
    find . -type f -name "*.pyc" -delete
    stestr --test-path ./tempest/tests run {posargs}

[testenv:genconfig]
commands = oslo-config-generator --config-file tempest/cmd/config-generator.tempest.conf

[testenv:cover]
setenv =
  {[testenv]setenv}
  PYTHON=coverage run --source tempest --parallel-mode
commands =
  coverage erase
  find . -type f -name "*.pyc" -delete
  stestr --test-path ./tempest/tests run {posargs}
  coverage combine
  coverage html -d cover
  coverage xml -o cover/coverage.xml
  coverage report -m --fail-under=76

[testenv:debug]
commands = oslo_debug_helper -t tempest/tests {posargs}

[testenv:all]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
# 'all' includes slow tests
setenv =
    {[tempestenv]setenv}
deps = {[tempestenv]deps}
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {posargs:''}

[testenv:all-plugin]
# DEPRECATED
# NOTE(andreaf) The all-plugin tox env uses sitepackages
# so that plugins installed outsite of Tempest virtual environment
# can be discovered. After the implementation during the Queens
# release cycle of the goal of moving Tempest plugins in dedicated
# git repos, this environment should not be used anymore. "all"
# should be used instead with the appropriate regex filtering.
sitepackages = True
# 'all' includes slow tests
setenv =
    {[tempestenv]setenv}
deps = {[tempestenv]deps}
commands =
    echo "WARNING: The all-plugin env is deprecated and will be removed"
    echo "WARNING  Please use the 'all' environment for Tempest plugins."
    find . -type f -name "*.pyc" -delete
    tempest run --regex {posargs:''}

[testenv:all-site-packages]
sitepackages = True
# 'all' includes slow tests
setenv =
    {[tempestenv]setenv}
deps = {[tempestenv]deps}
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {posargs:''}

[testenv:full]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# The regex below is used to select which tests to run and exclude the slow tag:
# See the testrepository bug: https://bugs.launchpad.net/testrepository/+bug/1208610
# FIXME: We can replace it with the `--exclude-regex` option to exclude tests now.
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex '(?!.*\[.*\bslow\b.*\])(^tempest\.api)' {posargs}
    tempest run --combine --serial --regex '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)' {posargs}

[testenv:integrated-full]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# The regex below is used to select which tests to run. It exclude the extra
# tests mentioned in tools/tempest-extra-tests-list.txt and slow tag:
# See the testrepository bug: https://bugs.launchpad.net/testrepository/+bug/1208610
# FIXME: We can replace it with the `--exclude-regex` option to exclude tests now.
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:integrated-full]regex1} --exclude-list ./tools/tempest-extra-tests-list.txt {posargs}
    tempest run --combine --serial --regex {[testenv:integrated-full]regex2} {posargs}

[testenv:extra-tests]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# The regex below is used to select extra tests mentioned in
# tools/tempest-extra-tests-list.txt and exclude slow tag tests:
# See the testrepository bug: https://bugs.launchpad.net/testrepository/+bug/1208610
# FIXME: We can replace it with the `--exclude-regex` option to exclude tests now.
exclude-regex = '\[.*\bslow\b.*\]'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --exclude-regex {[testenv:extra-tests]exclude-regex} --include-list ./tools/tempest-extra-tests-list.txt {posargs}

[testenv:full-parallel]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# But exclude the extra tests mentioned in tools/tempest-extra-tests-list.txt
regex = '(^tempest\.scenario.*)|(^tempest\.serial_tests)|(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:full-parallel]regex} --exclude-list ./tools/tempest-extra-tests-list.txt {posargs}

[testenv:api-microversion-tests]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '(^tempest\.api\.compute)|(^tempest\.api\.volume)'
# The regex below is used to select all tempest api tests for services having API
# microversion concept.
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:api-microversion-tests]regex} {posargs}

[testenv:integrated-network]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
# The regex below is used to select which tests to run and exclude the slow tag and
# tests listed in exclude-list file:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:integrated-network]regex1} --exclude-list ./tools/tempest-integrated-gate-networking-exclude-list.txt {posargs}
    tempest run --combine --serial --regex {[testenv:integrated-network]regex2} --exclude-list ./tools/tempest-integrated-gate-networking-exclude-list.txt {posargs}

[testenv:integrated-compute]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
# The regex below is used to select which tests to run and exclude the slow tag and
# tests listed in exclude-list file:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --slowest --regex {[testenv:integrated-compute]regex1} --exclude-list ./tools/tempest-integrated-gate-compute-exclude-list.txt {posargs}
    tempest run --combine --serial --slowest --regex {[testenv:integrated-compute]regex2} --exclude-list ./tools/tempest-integrated-gate-compute-exclude-list.txt {posargs}

[testenv:integrated-placement]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
# The regex below is used to select which tests to run and exclude the slow tag and
# tests listed in exclude-list file:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:integrated-placement]regex1} --exclude-list ./tools/tempest-integrated-gate-placement-exclude-list.txt {posargs}
    tempest run --combine --serial --regex {[testenv:integrated-placement]regex2} --exclude-list ./tools/tempest-integrated-gate-placement-exclude-list.txt {posargs}

[testenv:integrated-storage]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
# The regex below is used to select which tests to run and exclude the slow tag and
# tests listed in exclude-list file:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:integrated-storage]regex1} --exclude-list ./tools/tempest-integrated-gate-storage-exclude-list.txt {posargs}
    tempest run --combine --serial --regex {[testenv:integrated-storage]regex2} --exclude-list ./tools/tempest-integrated-gate-storage-exclude-list.txt {posargs}

[testenv:integrated-object-storage]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex1 = '(?!.*\[.*\bslow\b.*\])(^tempest\.api)'
regex2 = '(?!.*\[.*\bslow\b.*\])(^tempest\.scenario)|(^tempest\.serial_tests)'
# The regex below is used to select which tests to run and exclude the slow tag and
# tests listed in exclude-list file:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:integrated-object-storage]regex1} --exclude-list ./tools/tempest-integrated-gate-object-storage-exclude-list.txt {posargs}
    tempest run --combine --serial --regex {[testenv:integrated-object-storage]regex2} --exclude-list ./tools/tempest-integrated-gate-object-storage-exclude-list.txt {posargs}

[testenv:full-serial]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '(?!.*\[.*\bslow\b.*\])(^tempest\.(api|scenario|serial_tests))'
# The regex below is used to select which tests to run and exclude the slow tag:
# See the testrepository bug: https://bugs.launchpad.net/testrepository/+bug/1208610
# FIXME: We can replace it with the `--exclude-regex` option to exclude tests now.
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --serial --regex {[testenv:full-serial]regex} {posargs}

[testenv:scenario]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '(^tempest\.scenario)'
# The regex below is used to select all scenario tests
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --serial --regex {[testenv:scenario]regex} {posargs}

[testenv:smoke]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '\[.*\bsmoke\b.*\]'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:smoke]regex} {posargs}

[testenv:smoke-serial]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '\[.*\bsmoke\b.*\]'
# This is still serial because neutron doesn't work with parallel. See:
# https://bugs.launchpad.net/tempest/+bug/1216076 so the neutron smoke
# job would fail if we moved it to parallel.
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --serial --regex {[testenv:smoke-serial]regex} {posargs}

[testenv:slow-serial]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '\[.*\bslow\b.*\]'
# The regex below is used to select the slow tagged tests to run serially:
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --serial --regex {[testenv:slow-serial]regex} {posargs}

[testenv:slow]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# The regex below is used to select the slow tagged tests:
regex = '\[.*\bslow\b.*\]'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:slow]regex} {posargs}

[testenv:multinode]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
# The regex below is used to select the multinode and smoke tagged tests
regex = '\[.*\bsmoke|multinode\b.*\]'
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:multinode]regex} {posargs}

[testenv:ipv6-only]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '\[.*\bsmoke|ipv6|test_network_v6\b.*\]'
# Run only smoke and ipv6 tests. This env is used to tests
# the ipv6 deployments and basic tests run fine so that we can
# verify that services listen on IPv6 address.
commands =
    find . -type f -name "*.pyc" -delete
    tempest run --regex {[testenv:ipv6-only]regex} {posargs}

[testenv:venv]
deps =
  -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
  -r{toxinidir}/requirements.txt
  -r{toxinidir}/doc/requirements.txt
commands = {posargs}

[testenv:venv-tempest]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
commands = {posargs}

[testenv:docs]
deps =
  -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
  -r{toxinidir}/doc/requirements.txt
commands =
  sphinx-apidoc -f -o doc/source/tests/compute tempest/api/compute
  sphinx-apidoc -f -o doc/source/tests/identity tempest/api/identity
  sphinx-apidoc -f -o doc/source/tests/image tempest/api/image
  sphinx-apidoc -f -o doc/source/tests/network tempest/api/network
  sphinx-apidoc -f -o doc/source/tests/object_storage tempest/api/object_storage
  sphinx-apidoc -f -o doc/source/tests/volume tempest/api/volume
  sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
  sphinx-apidoc -f -o doc/source/tests/serial_tests tempest/serial_tests
  rm -rf doc/build
  sphinx-build -W -b html doc/source doc/build/html
allowlist_externals =
    rm

[testenv:pdf-docs]
deps = {[testenv:docs]deps}
allowlist_externals =
   rm
   make
commands =
   sphinx-apidoc -f -o doc/source/tests/compute tempest/api/compute
   sphinx-apidoc -f -o doc/source/tests/identity tempest/api/identity
   sphinx-apidoc -f -o doc/source/tests/image tempest/api/image
   sphinx-apidoc -f -o doc/source/tests/network tempest/api/network
   sphinx-apidoc -f -o doc/source/tests/object_storage tempest/api/object_storage
   sphinx-apidoc -f -o doc/source/tests/volume tempest/api/volume
   sphinx-apidoc -f -o doc/source/tests/scenario tempest/scenario
   sphinx-apidoc -f -o doc/source/tests/serial_tests tempest/serial_tests
   sphinx-build -W -b latex doc/source doc/build/pdf
   make -C doc/build/pdf

[testenv:pep8]
deps =
    {[testenv]deps}
    autopep8
commands =
    autopep8 --exit-code --max-line-length=79 --experimental --diff -r tempest setup.py
    flake8 {posargs}
    check-uuid

[testenv:autopep8]
deps = autopep8
commands =
    {toxinidir}/tools/format.sh

[testenv:uuidgen]
commands =
    check-uuid --fix

[hacking]
import_exceptions = tempest.services

[flake8]
# E125 is a won't fix until https://github.com/jcrocholl/pep8/issues/126 is resolved.  For further detail see https://review.opendev.org/#/c/36788/
# E123 skipped because it is ignored by default in the default pep8
# E129 skipped because it is too limiting when combined with other rules
# W504 skipped because it is overeager and unnecessary
# H405 skipped because it arbitrarily forces doctring "title" lines
ignore = E125,E123,E129,W504,H405
show-source = True
exclude = .git,.venv,.tox,dist,doc,*egg,build
enable-extensions = H106,H203,H904
import-order-style = pep8

[flake8:local-plugins]
extension =
  T102 = checks:import_no_clients_in_api_and_scenario_tests
  T104 = checks:scenario_tests_need_service_tags
  T105 = checks:no_setup_teardown_class_for_tests
  T107 = checks:service_tags_not_in_module_path
  T108 = checks:no_hyphen_at_end_of_rand_name
  N322 = checks:no_mutable_default_args
  T109 = checks:no_testtools_skip_decorator
  T110 = checks:get_resources_on_service_clients
  T111 = checks:delete_resources_on_service_clients
  T112 = checks:dont_import_local_tempest_into_lib
  T113 = checks:use_rand_uuid_instead_of_uuid4
  T114 = checks:dont_use_config_in_tempest_lib
  T115 = checks:dont_put_admin_tests_on_nonadmin_path
  T116 = checks:unsupported_exception_attribute_PY3
  T117 = checks:negative_test_attribute_always_applied_to_negative_tests
  T118 = checks:no_log_warn
paths =
  ./tempest/hacking

[testenv:releasenotes]
deps =
  -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
  -r{toxinidir}/doc/requirements.txt
commands =
  rm -rf releasenotes/build
  sphinx-build -a -E -W -d releasenotes/build/doctrees \
         -b html releasenotes/source releasenotes/build/html
allowlist_externals = rm

[testenv:bashate]
# if you want to test out some changes you have made to bashate
# against tempest, just set BASHATE_INSTALL_PATH=/path/... to your
# modified bashate tree
deps =
   {env:BASHATE_INSTALL_PATH:bashate}
allowlist_externals = bash
commands = bash -c "find {toxinidir}/tools    \
         -not \( -type d -name .?\* -prune \) \
         -type f                              \
         -name \*.sh                          \
         -print0 | xargs -0 bashate -v -eE005,E042 -i E006"

[testenv:pip-check-reqs]
# Do not install test-requirements as that will pollute the virtualenv for
# determining missing packages.
# This also means that pip-check-reqs must be installed separately, outside
# of the requirements.txt files
deps = pip_check_reqs
       -r{toxinidir}/requirements.txt
commands=
    pip-extra-reqs -d --ignore-file=tempest/tests/* tempest
    pip-missing-reqs -d --ignore-file=tempest/tests/* tempest


[testenv:bindep]
# Do not install any requirements. We want this to be fast and work even if
# system dependencies are missing, since it's used to tell you what system
# dependencies are missing! This also means that bindep must be installed
# separately, outside of the requirements files.
deps = bindep
commands = bindep test

[testenv:plugin-sanity-check]
# perform tempest plugin sanity
allowlist_externals = bash
commands =
  bash tools/tempest-plugin-sanity.sh

[testenv:stestr-master]
envdir = .tox/tempest
sitepackages = {[tempestenv]sitepackages}
setenv = {[tempestenv]setenv}
deps = {[tempestenv]deps}
regex = '\[.*\bsmoke\b.*\]'
# The below command install stestr master version and run smoke tests
commands =
    find . -type f -name "*.pyc" -delete
    pip install -U git+https://github.com/mtreinish/stestr
    tempest run --regex {[testenv:stestr-master]regex} {posargs}