qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Hanna Reitz <hreitz@redhat.com>
To: John Snow <jsnow@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	qemu-block@nongnu.org, qemu-devel <qemu-devel@nongnu.org>,
	Markus Armbruster <armbru@redhat.com>,
	Cleber Rosa <crosa@redhat.com>
Subject: Re: [PATCH v3 11/16] iotests/297: return error code from run_linters()
Date: Mon, 4 Oct 2021 09:45:10 +0200	[thread overview]
Message-ID: <f5004230-4295-61eb-6a0a-25719a545db3@redhat.com> (raw)
In-Reply-To: <CAFn=p-ZXxKDQUxUtupC+arC7_faMFvoJm9XxwxSPDxGRC2Ku=Q@mail.gmail.com>

On 22.09.21 22:18, John Snow wrote:
>
>
> On Fri, Sep 17, 2021 at 7:00 AM Hanna Reitz <hreitz@redhat.com 
> <mailto:hreitz@redhat.com>> wrote:

[...]

>
>     As you say, run_linters() to me seems very iotests-specific still: It
>     emits a specific output that is compared against a reference output.
>     Fine for 297, but not fine for a function provided by a
>     linters.py, I’d say.
>
>     I’d prefer run_linters() to return something like a Map[str,
>     Optional[str]], that would map a tool to its output in case of error,
>     i.e. ideally:
>
>     `{'pylint': None, 'mypy': None}`
>
>
> Splitting the test apart into two sub-tests is completely reasonable. 
> Python CI right now has individual tests for pylint, mypy, etc.
>
>     297 could format it something like
>
>     ```
>     for tool, output in run_linters().items():
>          print(f'=== {tool} ===')
>          if output is not None:
>              print(output)
>     ```
>
>     Or something.
>
>     To check for error, you could put a Python script in python/tests
>     that
>     checks `any(output is not None for output in
>     run_linters().values())` or
>     something (and on error print the output).
>
>
>     Pulling out run_linters() into an external file and having it print
>     something to stdout just seems too iotests-centric to me.  I
>     suppose as
>     long as the return code is right (which this patch is for) it should
>     work for Avocado’s simple tests, too (which I don’t like very much
>     either, by the way, because they too seem archaic to me), but,
>     well.  It
>     almost seems like the Avocado test should just run ./check then.
>
>
> Yeh. Ideally, we'd just have a mypy.ini and a pylintrc that configures 
> the tests adequately, and then 297 (or whomever else) would just call 
> the linters which would in turn read the same configuration. This 
> series is somewhat of a stop-gap to measure the temperature of the 
> room to see how important it was to leave 297 inside of iotests. So, I 
> did the conservative thing that's faster to review even if it now 
> looks *slightly* fishy.
>
> As for things being archaic or not ... possibly, but why involve extra 
> complexity if it isn't warranted?

My opinion is that I find an interface of “prints something to stdout 
and returns an integer status code” to be non-intuitive and thus rather 
complex actually.  That’s why I’d prefer different complexity, namely 
one which has a more intuitive interface.

I’m also not sure where the extra complexity would be for a 
`run_linters() -> Map[str, Optional[str]]`, because 297 just needs the 
loop suggested above over `run_linters().items()`, and as for the 
Avocado test...

> a simple pass/fail works perfectly well.

I don’t find `any(error_msg for error_msg in run_linters().values())` 
much more complex than pass/fail.

(Note: Above, I called it `output`.  Probably should have called it 
`error_msg` like I did now to clarify that it’s `None` in case of 
success and a string otherwise.)

> (And the human can read the output to understand WHY it failed.) If 
> you want more rigorous analytics for some reason, we can discuss the 
> use cases and figure out how to represent that information, but that's 
> definitely a bit beyond scope here.

[...]

>     Like, can’t we have a Python script in python/tests that imports
>     linters.py, invokes run_linters() and sensibly checks the output? Or,
>     you know, at the very least not have run_linters() print anything to
>     stdout and not have it return an integer code. linters.py:main()
>     can do
>     that conversion.
>
>
> Well, I certainly don't want to bother parsing output from python 
> tools and trying to make sure that it works sensibly cross-version and 
> cross-distro. The return code being 0/non-zero is vastly simpler. Let 
> the human read the output log on failure cases to get a sense of what 
> exactly went wrong. Is there some reason why parsing the output would 
> be beneficial to anyone?

Perhaps there was a misunderstanding here, because there’s no need to 
parse the output in my suggestion.  `run_linters() -> Map[str, 
Optional[str]]` would map a tool name to its potential error output; if 
the tool exited successfully (exit code 0), then that `Optional[str]` 
error output would be `None`.  It would only be something if there was 
an error.

> (The Python GitLab CI hooks don't even bother printing output to the 
> console unless it returns non-zero, and then it will just print 
> whatever it saw. Seems to work well in practice.)
>
>
>     Or, something completely different, perhaps my problem is that you
>     put
>     linters.py as a fully standalone test into the iotests directory,
>     without it being an iotest.  So, I think I could also agree on
>     putting
>     linters.py into python/tests, and then having 297 execute that. 
>     Or you
>     know, we just drop 297 altogether, as you suggest in patch 13 – if
>     that’s what it takes, then so be it.
>
>
> I can definitely drop 297 if you'd like, and work on making the linter 
> configuration more declarative. I erred on the side of less movement 
> instead of more so that disruption would be minimal. It might take me 
> some extra time to work out how to un-scriptify the test, though. I'd 
> like to get a quick temperature check from kwolf on this before I put 
> the work in.

So since we seem to want to keep 297, would it be possible to have 297 
run a linters.py that’s in python/tests?

>     Hanna
>
>
>     PS: Also, summing up processes’ return codes makes me feel not good.
>
>
> That's the part Vladimir didn't like. There was no real reason for it, 
> other than it was "easy".

I very much don’t find it easy, because it’s semantically wrong and thus 
comparatively hard to understand.

> I can make it a binary 0/1 return instead, if that'd grease the wheels.

Well, while I consider it necessary, it doesn’t really make the patch 
more palatable to me.

Hanna



  reply	other threads:[~2021-10-04  8:13 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-16  4:09 [PATCH v3 00/16] python/iotests: Run iotest linters during Python CI John Snow
2021-09-16  4:09 ` [PATCH v3 01/16] python: Update for pylint 2.10 John Snow
2021-09-16 13:28   ` Alex Bennée
2021-09-16 14:34     ` John Snow
2021-09-16  4:09 ` [PATCH v3 02/16] iotests/mirror-top-perms: Adjust imports John Snow
2021-09-16  4:27   ` Philippe Mathieu-Daudé
2021-09-16 14:27     ` John Snow
2021-09-16 15:05       ` Philippe Mathieu-Daudé
2021-09-17  8:35   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 03/16] iotests/migrate-bitmaps-postcopy-test: declare instance variables John Snow
2021-09-17  8:37   ` Hanna Reitz
2021-09-22 19:15     ` John Snow
2021-09-16  4:09 ` [PATCH v3 04/16] iotests/migrate-bitmaps-test: delint John Snow
2021-09-16  4:28   ` Philippe Mathieu-Daudé
2021-09-17  8:59   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 05/16] iotests/297: modify is_python_file to work from any CWD John Snow
2021-09-17  9:08   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 06/16] iotests/297: Add get_files() function John Snow
2021-09-17  9:24   ` Hanna Reitz
2021-09-22 19:25     ` John Snow
2021-09-16  4:09 ` [PATCH v3 07/16] iotests/297: Don't rely on distro-specific linter binaries John Snow
2021-09-17  9:43   ` Hanna Reitz
2021-09-22 19:53     ` John Snow
2021-10-04  8:16       ` Hanna Reitz
2021-10-04 18:59         ` John Snow
2021-09-16  4:09 ` [PATCH v3 08/16] iotests/297: Create main() function John Snow
2021-09-16  4:31   ` Philippe Mathieu-Daudé
2021-09-17  9:58   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 09/16] iotests/297: Separate environment setup from test execution John Snow
2021-09-17 10:05   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 10/16] iotests/297: Add 'directory' argument to run_linters John Snow
2021-09-17 10:10   ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 11/16] iotests/297: return error code from run_linters() John Snow
2021-09-17 11:00   ` Hanna Reitz
2021-09-22 20:18     ` John Snow
2021-10-04  7:45       ` Hanna Reitz [this message]
2021-10-04 19:26         ` John Snow
2021-09-16  4:09 ` [PATCH v3 12/16] iotests/297: split linters.py off from 297 John Snow
2021-09-16  4:09 ` [PATCH v3 13/16] iotests/linters: Add entry point for Python CI linters John Snow
2021-09-16  4:52   ` Philippe Mathieu-Daudé
2021-09-16  4:09 ` [PATCH v3 14/16] iotests/linters: Add workaround for mypy bug #9852 John Snow
2021-09-17 11:16   ` Hanna Reitz
2021-09-22 20:37     ` John Snow
2021-09-22 20:38       ` John Snow
2021-10-04  8:35         ` Hanna Reitz
2021-10-04  8:31       ` Hanna Reitz
2021-09-16  4:09 ` [PATCH v3 15/16] python: Add iotest linters to test suite John Snow
2021-09-16  4:09 ` [PATCH v3 16/16] iotests/linters: check mypy files all at once John Snow
2021-09-17 11:23   ` Hanna Reitz
2021-09-22 20:41     ` John Snow
2021-09-17  5:46 ` [PATCH v3 00/16] python/iotests: Run iotest linters during Python CI John Snow

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=f5004230-4295-61eb-6a0a-25719a545db3@redhat.com \
    --to=hreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=crosa@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@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).