qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>,
	"Andrea Bolognani" <abologna@redhat.com>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Ben Widawsky" <ben@bwidawsk.net>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@virtuozzo.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	qemu-block@nongnu.org,
	"Philippe Mathieu-Daudé" <philmd@redhat.com>,
	qemu-devel@nongnu.org,
	"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Rohit Shinde" <rohit.shinde12194@gmail.com>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Cleber Rosa" <crosa@redhat.com>, "Fam Zheng" <fam@euphon.net>,
	"Max Reitz" <mreitz@redhat.com>,
	"Alex Bennée" <alex.bennee@linaro.org>
Subject: Re: [PATCH v2 03/15] python: add VERSION file
Date: Mon, 19 Oct 2020 12:13:33 -0400	[thread overview]
Message-ID: <355ca901-2586-b0d0-5973-ad4c8aa2e696@redhat.com> (raw)
In-Reply-To: <20201019100207.GD236912@redhat.com>

On 10/19/20 6:02 AM, Daniel P. Berrangé wrote:
> On Mon, Oct 19, 2020 at 11:45:09AM +0200, Andrea Bolognani wrote:
>> On Wed, 2020-10-14 at 10:29 -0400, John Snow wrote:
>>> Python infrastructure as it exists today is not capable reliably of
>>> single-sourcing a package version from a parent directory. The authors
>>> of pip are working to correct this, but as of today this is not possible
>>> to my knowledge.
>>>
>>> The problem is that when using pip to build and install a python
>>> package, it copies files over to a temporary directory and performs its
>>> build there. This loses access to any information in the parent
>>> directory, including git itself.
>>>
>>> Further, Python versions have a standard (PEP 440) that may or may not
>>> follow QEMU's versioning. In general, it does; but naturally QEMU does
>>> not follow PEP 440. To avoid any automatically-generated conflict, a
>>> manual version file is preferred.
>>>
>>>
>>> I am proposing:
>>>
>>> - Python core tooling synchronizes with the QEMU version directly
>>>    (5.2.0, 5.1.1, 5.3.0, etc.)
>>>
>>> - In the event that a Python package needs to be updated independently
>>>    of the QEMU version, a pre-release alpha version should be preferred,
>>>    but *only* after inclusion to the qemu development or stable branches.
>>>
>>>    e.g. 5.2.0a1, 5.2.0a2, and so on should be preferred prior to 5.2.0's
>>>    release.
>>>
>>> - The Python core tooling makes absolutely no version compatibility
>>>    checks or constraints. It *may* work with releases of QEMU from the
>>>    past or future, but it is not required to.
>>>
>>>    i.e., "qemu.core" will always remain in lock-step with QEMU.
>>>
>>> - We reserve the right to split out e.g. qemu.core.qmp to qemu.qmp
>>>    and begin indepedently versioning such a package separately from the
>>>    QEMU version it accompanies.
>>
>> I think this need to be considered very carefully.
>>
>> I'm not overly familiar with the Python ecosystem but it would appear
>> that, despite PEP 440 not mandating this, many (most?) of the
>> packages uploaded to PyPi are using semantic versioning.
> 
>    https://packaging.python.org/guides/distributing-packages-using-setuptools/#choosing-a-versioning-scheme
> 
> Semver is the recommended approach, but they explicitly list date
> based versioning as a valid alternative
> 
>    "Semantic versioning is not a suitable choice for all projects,
>     such as those with a regular time based release cadence and a
>     deprecation process that provides warnings for a number of
>     releases prior to removal of a feature."
> 
> That paragraph describes QEMU's scenario.
> 
> NB, historically we've made arbitrary changes to the python code
> since it was not considered public API. If we make it official
> public API, then we would actually need to start following our
> deprecation process for the python code too.
> 

I think our deprecation process is not tightly compatible with how 
Python programmers at-large expect packages to work. Semver is more or 
less the norm, despite the fact that it isn't explicitly required.

setting requirements in requirements.txt, setup.[cfg|py], Pipfile, etc 
often hinge on a major version, e.g.

qemu >= 5.0
qemu >= 3.0, < 6.0

would both be common forms of describing a requirement.

Pinning specific versions is considered bad form, but in the context of 
releasing a package, I often see maintainers hedging their bets and 
preventing upgrades across a major version line.

For that reason I am a little weary of adopting the deprecation policy 
as it exists in QEMU directly, and would propose a modification for my 
purposes here:

- Features must be marked as deprecated
- They must remain in a deprecated state for [at least] 2 releases
- Deprecated features may not be removed until a major version change.

In practice, this modification is a change from "2 releases" to "at 
least 2".

However, I didn't intend to pay any mind to the deprecation policy 
"yet", as I have the package metadata listing the package status as 
"Alpha", see below:

>> With that in mind, I think it would be unwise for qemu.* not to do
>> the same; in particular, using a version number that's not <1.0.0 for
>> a package that is very much in flux will almost certainly break
>> people's expectations, and is also not something that you can easily
>> take back at a later time.
> 
> I don't think it is that big a deal, and there is clear benefit to
> having the python code version match the QEMU version that it is
> the companioon to.
> 

Do you think it's fine if I start versioning at, say, "0.5.2", I could 
ignore a deprecation policy for now? I have a lot of changes I want to 
make and expect a lot of breaking changes very quickly.

I just wanted to try -- somehow -- to conjure up a relationship to the 
QEMU package it's designed to work with.

> Ultimately the versioning scheme just impacts on the version string
> conditionals people list for their dependancies. Apps consuming QEMU
> can handle any of the version schemes without much difference.
> 
> Regards,
> Daniel
> 

Thanks for your input. This is the trickiest part of the process for me.

I believe there is value in distributing these tools for other 
developers to help them prototype and experiment with new features, but 
realize it's a tightrope walk because we're flying dangerously close to 
providing a management utility that needs to care about cross-version 
compatibility and so on.

I have no interest in providing stringent cross-version compatibility, 
but at the same time, libraries like QMP are not really at risk of 
changing all that much, actually. It will *probably* work for most QEMU 
versions.

I have some further patches where I clean up the scripts in 
./scripts/qmp and move them to ./python/qemu/qmp -- and that work is 
making me consider a rework to this series. I think that rework matches 
the spirit of an earlier suggestion of yours:

- move ./python/qemu/core/qmp.py to ./python/qemu/qmp/qmp.py
- (in a follow-up series) move ./scripts/qmp/* to ./python/qemu/qmp/*
- rename ./python/qemu/core/ to ./python/qemu/machine
     (move accel.py, machine.py and qtest.py to a 'machine' pkg.)


In effect, we'd then have:

qemu.machine -- primarily a test interface for QEMU instances
qemu.qmp -- fairly ageless QMP tools/lib for talking to QEMU

and the different levels of support and "use at your own risk" become 
slightly more clear between the two packages.

--js



  reply	other threads:[~2020-10-19 16:16 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-14 14:29 [PATCH v2 00/15] python: create installable package John Snow
2020-10-14 14:29 ` [PATCH v2 01/15] python: create qemu.core package John Snow
2020-10-14 18:03   ` Philippe Mathieu-Daudé
2020-10-14 14:29 ` [PATCH v2 02/15] python: add qemu package installer John Snow
2020-10-14 14:29 ` [PATCH v2 03/15] python: add VERSION file John Snow
2020-10-14 16:03   ` John Snow
2020-10-19  9:45   ` Andrea Bolognani
2020-10-19 10:02     ` Daniel P. Berrangé
2020-10-19 16:13       ` John Snow [this message]
2020-10-20  8:52       ` Andrea Bolognani
2020-10-20  9:06         ` Daniel P. Berrangé
2020-10-20  9:14           ` Andrea Bolognani
2020-10-14 14:29 ` [PATCH v2 04/15] python: add directory structure README.rst files John Snow
2020-10-14 18:05   ` Philippe Mathieu-Daudé
2020-10-14 20:51     ` John Snow
2020-10-14 14:29 ` [PATCH v2 05/15] python: Add pipenv support John Snow
2020-10-14 14:29 ` [PATCH v2 06/15] python: add pylint exceptions to __init__.py John Snow
2020-10-14 14:29 ` [PATCH v2 07/15] python: move pylintrc into setup.cfg John Snow
2020-10-14 14:29 ` [PATCH v2 08/15] python: add pylint to pipenv John Snow
2020-10-14 14:29 ` [PATCH v2 09/15] python: move flake8 config to setup.cfg John Snow
2020-10-14 14:29 ` [PATCH v2 10/15] python: Add flake8 to pipenv John Snow
2020-10-14 14:29 ` [PATCH v2 11/15] python: move mypy.ini into setup.cfg John Snow
2020-10-14 14:29 ` [PATCH v2 12/15] python: add mypy to pipenv John Snow
2020-10-14 14:29 ` [PATCH v2 13/15] python: move .isort.cfg into setup.cfg John Snow
2020-10-14 18:08   ` Philippe Mathieu-Daudé
2020-10-14 14:29 ` [PATCH v2 14/15] python/qemu: add isort to pipenv John Snow
2020-10-14 14:29 ` [PATCH v2 15/15] python/qemu: add qemu package itself " 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=355ca901-2586-b0d0-5973-ad4c8aa2e696@redhat.com \
    --to=jsnow@redhat.com \
    --cc=abologna@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=armbru@redhat.com \
    --cc=ben@bwidawsk.net \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=fam@euphon.net \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rohit.shinde12194@gmail.com \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    --cc=wainersm@redhat.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).