summaryrefslogtreecommitdiff
path: root/tox.ini
blob: 25e262c091ad38d5b78e70fa79b934eca9e2657b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
[tox]
minversion = 4.0.0
# specify virtualenv here to keep local runs consistent with the
# gate (it sets the versions of pip, setuptools, and wheel)
requires = virtualenv>=20.17.1
# this allows tox to infer the base python from the environment name
# and override any basepython configured in this file
ignore_basepython_conflict=true
envlist = py3,compliance,pep8

[testenv]
usedevelop = true
setenv =
  VIRTUAL_ENV={envdir}
  OS_STDOUT_CAPTURE=1
  OS_STDERR_CAPTURE=1
  OS_TEST_TIMEOUT=60
  OS_TEST_PATH=./cinder/tests/unit
   PYTHONDONTWRITEBYTECODE=1
# TODO(stephenfin): Remove once we bump our upper-constraint to SQLAlchemy 2.0
   SQLALCHEMY_WARN_20=1

# this environment's install command is used if the 'minversion' or 'requires'
# values declared above in the [tox] section require tox to update itself, so
# we don't define a non-default install_command here

deps =
  -r{toxinidir}/test-requirements.txt
  -r{toxinidir}/requirements.txt

# By default stestr will set concurrency
# to ncpu, to specify something else use
# the concurrency=<n> option.
# call ie: 'tox -epy27 -- --concurrency=4'
commands =
  stestr run --random {posargs}
  stestr slowest

allowlist_externals =
  find
passenv =
  *_proxy
  *_PROXY

[testenv:py{3,38,39,310,311}]
# NOTE: Do not move the constraints from the install_command into deps, as that
#       may result in tox using unconstrained/untested dependencies.
#       We use "usedevelop = True" for tox jobs (except bindep), so tox does 2
#       install calls, one for the deps and another for the cinder source code
#       as editable (pip -e).
#       Without the constraints in the install_command only the first
#       installation will honor the upper constraints, and the second install
#       for cinder itself will not know about the constraints which can result
#       in installing versions we don't want.
#       With constraints in the install_command tox will always honor our
#       constraints.
install_command =
  python -m pip install -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} {opts} {packages}

[testenv:functional]
install_command = {[testenv:py3]install_command}
setenv =
  OS_TEST_PATH = ./cinder/tests/functional

[testenv:functional-py{3,38,39,310,311}]
install_command = {[testenv:functional]install_command}
setenv =
  {[testenv:functional]setenv}

[testenv:api-samples]
install_command = {[testenv:functional]install_command}
envdir = {toxworkdir}/shared
setenv =
  GENERATE_SAMPLES=True
  PYTHONHASHSEED=0
commands =
  find . -ignore_readdir_race -type f -name "*.pyc" -delete
  stestr --test-path=./cinder/tests/functional/api_sample_tests run {posargs}
  stestr slowest

[testenv:compliance]
install_command = {[testenv:py3]install_command}
setenv =
  OS_TEST_PATH = ./cinder/tests/compliance

[testenv:pep8]
allowlist_externals =
  {toxinidir}/tools/config/check_uptodate.sh
  {toxinidir}/tools/check_exec.py
commands =
  flake8 {posargs} .
  doc8
  {toxinidir}/tools/config/check_uptodate.sh
  {toxinidir}/tools/check_exec.py {toxinidir}/cinder {toxinidir}/doc/source/ {toxinidir}/releasenotes/notes

[testenv:fast8]
# Use same environment directory as pep8 env to save space and install time
envdir = {toxworkdir}/pep8
install_command = {[testenv:py3]install_command}
allowlist_externals =
  {toxinidir}/tools/fast8.sh
commands =
  {toxinidir}/tools/fast8.sh
passenv = FAST8_NUM_COMMITS

[testenv:pylint]
allowlist_externals =
  {toxinidir}/tools/coding-checks.sh
install_command = {[testenv:py3]install_command}
deps = -r{toxinidir}/requirements.txt
       -r{toxinidir}/test-requirements.txt
       pylint==2.17.0
commands =
  {toxinidir}/tools/coding-checks.sh --pylint {posargs:all}

[testenv:cover]
# Also do not run test_coverage_ext tests while gathering coverage as those
# tests conflict with coverage.
install_command = {[testenv:py3]install_command}
setenv =
    {[testenv]setenv}
    PYTHON=coverage run --source cinder --parallel-mode
commands =
    stestr run {posargs}
    coverage combine
    coverage html -d cover
    coverage xml -o cover/coverage.xml

[testenv:genconfig]
install_command = {[testenv:py3]install_command}
sitepackages = False
envdir = {toxworkdir}/pep8
commands = oslo-config-generator --config-file=tools/config/cinder-config-generator.conf

[testenv:genpolicy]
install_command = {[testenv:py3]install_command}
commands = oslopolicy-sample-generator --config-file=tools/config/cinder-policy-generator.conf

[testenv:genopts]
install_command = {[testenv:py3]install_command}
sitepackages = False
envdir = {toxworkdir}/pep8
commands = python tools/config/generate_cinder_opts.py

[testenv:venv]
install_command = {[testenv:py3]install_command}
deps =
  {[testenv]deps}
  reno
commands = {posargs}

[testenv:docs]
# we intentionally put the constraints in the install_command, not the
# deps ... see comment near the top of this file
install_command =
  python -m pip install -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} {opts} {packages}
allowlist_externals = rm
deps =
  doc8
  -r{toxinidir}/doc/requirements.txt
commands =
  doc8
  rm -rf doc/source/contributor/api doc/build/html doc/build/doctrees
  sphinx-build -W -j auto -b html -d doc/build/doctrees doc/source doc/build/html
  # Test the redirects. This must run after the main docs build
  whereto doc/build/html/.htaccess doc/test/redirect-tests.txt

[testenv:pdf-docs]
install_command = {[testenv:docs]install_command}
deps = {[testenv:docs]deps}
commands =
  rm -fr doc/source/contributor/api/
  rm -fr doc/build/pdf
  sphinx-build -W -b latex doc/source doc/build/pdf
  make -C doc/build/pdf
allowlist_externals =
  make
  rm

[testenv:api-ref]
install_command = {[testenv:docs]install_command}
allowlist_externals = rm
deps = {[testenv:docs]deps}
commands =
  rm -rf api-ref/build
  sphinx-build -W -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html/

[testenv:releasenotes]
install_command = {[testenv:docs]install_command}
deps = {[testenv:docs]deps}
commands = sphinx-build -a -E -W -j auto -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html

[testenv:gendriverlist]
install_command = {[testenv:py3]install_command}
sitepackages = False
envdir = {toxworkdir}/venv
commands = python {toxinidir}/tools/generate_driver_list.py

[testenv:bandit]
install_command = {[testenv:py3]install_command}
deps = -r{toxinidir}/test-requirements.txt
       bandit==1.6.0
commands = bandit -r cinder -n5 -x cinder/tests/* -ll

[testenv:bandit-baseline]
install_command = {[testenv:bandit]install_command}
deps = bandit==1.6.0
envdir = {toxworkdir}/bandit
commands = bandit-baseline -r cinder -n5 -x cinder/tests/* -ii -ll

[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, and develop mode disabled
# explicitly to avoid unnecessarily installing the checked-out repo too
skip_install = True
deps = bindep
commands = bindep {posargs}
usedevelop = False

[testenv:mypy]
description =
  Run type checks.
setenv =
  OS_MYPY_OPTS=--install-types --non-interactive
install_command = {[testenv:py3]install_command}
allowlist_externals =
  {toxinidir}/tools/mypywrap.sh
commands =
  {toxinidir}/tools/mypywrap.sh {posargs}

[flake8]
# Following checks are ignored on purpose.
#
# E251 unexpected spaces around keyword / parameter equals
# reason: no improvement in readability
#
# E402 module level import not at top of file
# reason: there are numerous places where we import modules
#  later for legitimate reasons
#
# W503 line break before binary operator
# reason: pep8 itself is not sure about this one and
#  reversed this rule in 2016
# W504 line break after binary operator
# reason: no agreement on this being universally
#  preferable for our code.  Disabled to keep checking
#  tools from getting in our way with regards to this.
# H101 include name with TODO
#  reason: no real benefit
# G200 Logging statements should not include the exception
#  reason: Many existing cases of this that may be legitimate
ignore = E251,E402,W503,W504,H101,G200
# H904 Delay string interpolations at logging calls.
enable-extensions = H106,H203,H904
exclude = .git,.venv,.tox,dist,tools,doc/ext,*egg,build
max-complexity = 30
application-import-names = cinder
import-order-style = pep8

[flake8:local-plugins]
extension =
  N322 = checks:no_mutable_default_args
  N323 = checks:check_explicit_underscore_import
  C301 = checks:check_datetime_now
  C303 = checks:check_no_print_statements
  C306 = checks:check_timeutils_strtime
  C308 = checks:check_timeutils_isotime
  C309 = checks:no_test_log
  C310 = checks:CheckLoggingFormatArgs
  C311 = checks:CheckOptRegistrationArgs
  C312 = checks:no_translate_logs
  C313 = checks:validate_assertTrue
  C336 = checks:dict_constructor_with_list_copy
  C337 = checks:no_third_party_mock
  C338 = checks:no_log_warn
paths = ./cinder/tests/hacking

[doc8]
ignore-path=.tox,*.egg-info,doc/src/api,doc/source/drivers.rst,doc/build,.eggs,doc/source/configuration/tables,./*.txt,releasenotes,doc/source/contributor/api,doc/test
extension=.txt,.rst,.inc