From: John Snow <jsnow@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Eduardo Habkost <ehabkost@redhat.com>,
qemu-block@nongnu.org, Markus Armbruster <armbru@redhat.com>,
Max Reitz <mreitz@redhat.com>, Cleber Rosa <crosa@redhat.com>
Subject: Re: [PATCH RFC 0/3] python/iotests: Run iotest linters during Python CI
Date: Mon, 7 Jun 2021 11:51:31 -0400 [thread overview]
Message-ID: <388ba3e4-8a09-2ce3-de2f-aa79d0f95b24@redhat.com> (raw)
In-Reply-To: <5a67879f-bcfa-5805-48f2-ce38bf8c3a03@virtuozzo.com>
On 6/5/21 10:08 AM, Vladimir Sementsov-Ogievskiy wrote:
> 04.06.2021 19:39, John Snow wrote:
>> Since iotests are such a heavy and prominent user of the Python qemu.qmp
>> and qemu.machine packages, it would be convenient if the Python linting
>> suite also checked this client for any possible regressions introduced
>> by shifting around signatures, types, or interfaces in these packages.
>
> I think that's a right idea.
>
Yep. It will help me to stabilize the qemu.qmp interface and make sure
there are no breakages.
>>
>> (Of course, we'd eventually find those problems when iotest 297 ran, but
>> with increasing distance between Python development and Block
>> development, the risk of an accidental breakage in this regard
>> increases. I, personally, know to run iotests (and especially 297) after
>> changing Python code, but not everyone in the future might.)
>>
>> Add the ability for the Python CI to run the iotest linters too, which
>> means that iotests would be checked against:
>>
>> - Python 3.6, using a frozen set of packages using 'pipenv'
>> - Python 3.6 through Python 3.10 inclusive, using 'tox' and the latest
>> versions of mypy/pylint that happen to be installed during test
>> time. (This CI test is allowed to fail with a warning, and can serve
>> as a bellwether for when new incompatible changes may disrupt the
>> linters. Testing against old and new Python interpreters alike can
>> help surface incompatibility issues we may need to be aware of.)
>>
>> It also means that you can cd to ./python and:
>>
>> - "make venv-check", if you have Python 3.6 and pipenv installed. (On
>> Fedora: `dnf install python36` or `dnf install python3.6`) This will
>> set up a venv with exactly the same versions of all packages and their
>> dependencies as the CI test does. After this series, it will run the
>> iotest linters, too.
>>
>> - "make check-tox", if you have Python 3.6 through Python 3.10
>> installed. (On Fedora: `dnf install python3-tox python3.10`) This will
>> set up five different venvs, one for each Python version, and run all
>> of the Python linters against each. After this series, it will also
>> include the iotest linters.
>
> So, it doesn't run from "make check"?
>
Well.. it would, but it wouldn't necessarily succeed. It depends on the
environment in which you run it.
"make venv-check" and "make check-tox" both set up their own VENV for
running the linters, handling dependencies for you. "make check" does
not. Both venv-check and check-tox simply run "make check" as their only
command after they set up their venv(s).
It requires some kind of setup. I avoided suggesting it in this cover
letter for that reason.
Cleber said during review that maybe the fact that "make check" isn't a
"handle things for you" command is confusing, and with this review
comment from you, I am starting to agree.
Maybe we want this instead:
make venv-check
[pipenv] make raw-check
make check-tox
[tox] make raw-check
make check
[venv] make raw-check
with "make raw-check" being the setup-less check step that everything
else uses, and "make check" representing the third type of test I
outlined below in this cover letter.
>>
>> "John, that's annoying. None of those invocations are free from some
>> kind of annoying dependency. Not everyone runs Fedora!"
>>
>> Yeah, yeah. This series doesn't *remove* iotest 297 either. It continues
>> to work just fine! There's also a slightly more involved method that
>> will run on "any version you happen to have", but the setup is more
>> laborious, and I haven't made a Makefile invocation to canonize it yet:
>>
>>> cd /python
>>> python3 -m venv ~/.cache/qemu-venv/
>>> source ~/.cache/qemu-venv/bin/activate
>>> make develop
>>> make check
>>> deactivate
>>
>> - This uses whatever version of Python you happen to have, and doesn't
>> require pipenv or tox.
>> - It should work on any distro with any python3 >= 3.6.0
>> - use 'activate.[fish|csh] as desired to enter the venv. (I use FiSH!)
>> - This will run the linters with correct versions against the qemu
>> packages installed into this venv.
>>
>> Example outputs from the three different local execution methods, in
>> order as outlined above:
>>
>> jsnow@scv ~/s/q/python (python-package-iotest)> make venv-check
>> make[1]: Entering directory '/home/jsnow/src/qemu/python'
>> JOB ID : f5f383275da6b9d5eb5fe717e463f47f18980d07
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.28-f5f3832/job.log
>> (1/5) tests/flake8.sh: PASS (0.43 s)
>> (2/5) tests/iotests.sh: PASS (9.93 s)
>> (3/5) tests/isort.sh: PASS (0.24 s)
>> (4/5) tests/mypy.sh: PASS (0.25 s)
>> (5/5) tests/pylint.sh: PASS (3.66 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 14.85 s
>> make[1]: Leaving directory '/home/jsnow/src/qemu/python'
>>
>> jsnow@scv ~/s/q/python (python-package-iotest)> make check-tox
>> GLOB sdist-make: /home/jsnow/src/qemu/python/setup.py
>> py36 inst-nodeps:
>> /home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip
>> py36 installed:
>> appdirs==1.4.4,astroid==2.5.6,avocado-framework==88.1,distlib==0.3.2,filelock==3.0.12,flake8==3.9.2,fusepy==3.0.1,importlib-metadata==4.5.0,importlib-resources==5.1.4,isort==5.8.0,lazy-object-proxy==1.6.0,mccabe==0.6.1,mypy==0.812,mypy-extensions==0.4.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pycodestyle==2.7.0,pyflakes==2.3.1,pylint==2.8.3,pyparsing==2.4.7,qemu
>> @
>> file:///home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip,six==1.16.0,toml==0.10.2,tox==3.23.1,typed-ast==1.4.3,typing-extensions==3.10.0.0,virtualenv==20.4.7,wrapt==1.12.1,zipp==3.4.1
>>
>> py36 run-test-pre: PYTHONHASHSEED='1077404307'
>> py36 run-test: commands[0] | make check
>> JOB ID : 8d6a98b947956794e83943950a66dea2e2ee2f0b
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.29-8d6a98b/job.log
>> (1/5) tests/flake8.sh: PASS (0.36 s)
>> (2/5) tests/iotests.sh: PASS (9.64 s)
>> (3/5) tests/isort.sh: PASS (0.19 s)
>> (4/5) tests/mypy.sh: PASS (0.24 s)
>> (5/5) tests/pylint.sh: PASS (3.64 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 14.38 s
>> py37 inst-nodeps:
>> /home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip
>> py37 installed:
>> appdirs==1.4.4,astroid==2.5.6,avocado-framework==88.1,distlib==0.3.2,filelock==3.0.12,flake8==3.9.2,fusepy==3.0.1,importlib-metadata==4.5.0,isort==5.8.0,lazy-object-proxy==1.6.0,mccabe==0.6.1,mypy==0.812,mypy-extensions==0.4.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pycodestyle==2.7.0,pyflakes==2.3.1,pylint==2.8.3,pyparsing==2.4.7,qemu
>> @
>> file:///home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip,six==1.16.0,toml==0.10.2,tox==3.23.1,typed-ast==1.4.3,typing-extensions==3.10.0.0,virtualenv==20.4.7,wrapt==1.12.1,zipp==3.4.1
>>
>> py37 run-test-pre: PYTHONHASHSEED='1077404307'
>> py37 run-test: commands[0] | make check
>> JOB ID : 97419c5769a56797e1a9b4d91586d6face9be5a2
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.29-97419c5/job.log
>> (1/5) tests/flake8.sh: PASS (0.34 s)
>> (2/5) tests/iotests.sh: PASS (10.42 s)
>> (3/5) tests/isort.sh: PASS (0.16 s)
>> (4/5) tests/mypy.sh: PASS (0.20 s)
>> (5/5) tests/pylint.sh: PASS (3.52 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 15.01 s
>> py38 inst-nodeps:
>> /home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip
>> py38 installed:
>> appdirs==1.4.4,astroid==2.5.6,avocado-framework==88.1,distlib==0.3.2,filelock==3.0.12,flake8==3.9.2,fusepy==3.0.1,isort==5.8.0,lazy-object-proxy==1.6.0,mccabe==0.6.1,mypy==0.812,mypy-extensions==0.4.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pycodestyle==2.7.0,pyflakes==2.3.1,pylint==2.8.3,pyparsing==2.4.7,qemu
>> @
>> file:///home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip,six==1.16.0,toml==0.10.2,tox==3.23.1,typed-ast==1.4.3,typing-extensions==3.10.0.0,virtualenv==20.4.7,wrapt==1.12.1
>>
>> py38 run-test-pre: PYTHONHASHSEED='1077404307'
>> py38 run-test: commands[0] | make check
>> JOB ID : 1be3a502bea18cdf537426778719dce1d0c9c3a0
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.30-1be3a50/job.log
>> (1/5) tests/flake8.sh: PASS (0.29 s)
>> (2/5) tests/iotests.sh: PASS (9.17 s)
>> (3/5) tests/isort.sh: PASS (0.14 s)
>> (4/5) tests/mypy.sh: PASS (0.20 s)
>> (5/5) tests/pylint.sh: PASS (3.21 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 13.32 s
>> py39 inst-nodeps:
>> /home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip
>> py39 installed:
>> appdirs==1.4.4,astroid==2.5.6,avocado-framework==88.1,distlib==0.3.2,filelock==3.0.12,flake8==3.9.2,fusepy==3.0.1,isort==5.8.0,lazy-object-proxy==1.6.0,mccabe==0.6.1,mypy==0.812,mypy-extensions==0.4.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pycodestyle==2.7.0,pyflakes==2.3.1,pylint==2.8.3,pyparsing==2.4.7,qemu
>> @
>> file:///home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip,six==1.16.0,toml==0.10.2,tox==3.23.1,typed-ast==1.4.3,typing-extensions==3.10.0.0,virtualenv==20.4.7,wrapt==1.12.1
>>
>> py39 run-test-pre: PYTHONHASHSEED='1077404307'
>> py39 run-test: commands[0] | make check
>> JOB ID : 0323fcaf5137caab9fbca3e91bc0338ae6cb81dc
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.30-0323fca/job.log
>> (1/5) tests/flake8.sh: PASS (0.26 s)
>> (2/5) tests/iotests.sh: PASS (10.03 s)
>> (3/5) tests/isort.sh: PASS (0.14 s)
>> (4/5) tests/mypy.sh: PASS (0.19 s)
>> (5/5) tests/pylint.sh: PASS (3.39 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 14.37 s
>> py310 inst-nodeps:
>> /home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip
>> py310 installed:
>> appdirs==1.4.4,astroid==2.5.6,avocado-framework==88.1,distlib==0.3.2,filelock==3.0.12,flake8==3.9.2,fusepy==3.0.1,isort==5.8.0,lazy-object-proxy==1.6.0,mccabe==0.6.1,mypy==0.812,mypy-extensions==0.4.3,packaging==20.9,pluggy==0.13.1,py==1.10.0,pycodestyle==2.7.0,pyflakes==2.3.1,pylint==2.8.3,pyparsing==2.4.7,qemu
>> @
>> file:///home/jsnow/src/qemu/python/.tox/.tmp/package/1/qemu-0.6.1.0a1.zip,six==1.16.0,toml==0.10.2,tox==3.23.1,typed-ast==1.4.3,typing-extensions==3.10.0.0,virtualenv==20.4.7,wrapt==1.12.1
>>
>> py310 run-test-pre: PYTHONHASHSEED='1077404307'
>> py310 run-test: commands[0] | make check
>> JOB ID : 88f99ef4b76af4e48e9b1cd845d276d1c29d32dd
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.30-88f99ef/job.log
>> (1/5) tests/flake8.sh: PASS (0.26 s)
>> (2/5) tests/iotests.sh: PASS (13.34 s)
>> (3/5) tests/isort.sh: PASS (0.15 s)
>> (4/5) tests/mypy.sh: PASS (0.33 s)
>> (5/5) tests/pylint.sh: PASS (3.40 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 17.76 s
>> _______________________________________________________________
>> summary ________________________________________________________________
>> py36: commands succeeded
>> py37: commands succeeded
>> py38: commands succeeded
>> py39: commands succeeded
>> py310: commands succeeded
>> congratulations :)
>>
>> (qemu-venv) jsnow@scv ~/s/q/python (python-package-iotest)> make check
>> JOB ID : d4d3abff53bef6f41b5e2d10d889040d3a698208
>> JOB LOG :
>> /home/jsnow/avocado/job-results/job-2021-06-04T12.22-d4d3abf/job.log
>> (1/5) tests/flake8.sh: PASS (0.27 s)
>> (2/5) tests/iotests.sh: PASS (10.30 s)
>> (3/5) tests/isort.sh: PASS (0.15 s)
>> (4/5) tests/mypy.sh: PASS (0.19 s)
>> (5/5) tests/pylint.sh: PASS (3.40 s)
>> RESULTS : PASS 5 | ERROR 0 | FAIL 0 | SKIP 0 | WARN 0 | INTERRUPT 0
>> | CANCEL 0
>> JOB TIME : 14.65 s
>>
>> John Snow (3):
>> python: expose typing information via PEP 561
>> iotests: split 'linters.py' off from 297
>> python: Add iotest linters to test suite
>>
>> python/qemu/machine/py.typed | 0
>> python/qemu/qmp/py.typed | 0
>> python/qemu/utils/py.typed | 0
>> python/setup.cfg | 3 +
>> python/tests/iotests.sh | 2 +
>> tests/qemu-iotests/297 | 88 ++++-------------------
>> tests/qemu-iotests/linters.py | 130 ++++++++++++++++++++++++++++++++++
>> 7 files changed, 148 insertions(+), 75 deletions(-)
>> create mode 100644 python/qemu/machine/py.typed
>> create mode 100644 python/qemu/qmp/py.typed
>> create mode 100644 python/qemu/utils/py.typed
>> create mode 100755 python/tests/iotests.sh
>> create mode 100644 tests/qemu-iotests/linters.py
>>
>
>
prev parent reply other threads:[~2021-06-07 15:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-04 16:39 [PATCH RFC 0/3] python/iotests: Run iotest linters during Python CI John Snow
2021-06-04 16:39 ` [PATCH RFC 1/3] python: expose typing information via PEP 561 John Snow
2021-06-04 16:39 ` [PATCH RFC 2/3] iotests: split 'linters.py' off from 297 John Snow
2021-06-05 14:27 ` Vladimir Sementsov-Ogievskiy
2021-06-07 15:40 ` John Snow
2021-06-04 16:39 ` [PATCH RFC 3/3] python: Add iotest linters to test suite John Snow
2021-06-05 14:08 ` [PATCH RFC 0/3] python/iotests: Run iotest linters during Python CI Vladimir Sementsov-Ogievskiy
2021-06-07 15:51 ` John Snow [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=388ba3e4-8a09-2ce3-de2f-aa79d0f95b24@redhat.com \
--to=jsnow@redhat.com \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).