qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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
>>
> 
> 



      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).