All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.