[openstack-dev] [api] [Nova] [Ironic] [Magnum] Microversion guideline in API-WG
Dmitry Tantsur
dtantsur at redhat.com
Fri Jun 26 15:07:33 UTC 2015
On 06/26/2015 04:58 PM, Devananda van der Veen wrote:
> Dmitry,
>
> Feature strings won't work. It only makes things more complex, without
> addressing the underlying issue.
>
> What happens when we change, even in a small way, the API surface
> exposed by an existing feature? How is that change exposed -- unless we
> include a version number along with your feature string? And now we're
> right back where we started.
Ok, maybe this idea is just as broken. Still, the current proposal
brings more problems than it solves.
>
> -Deva
>
>
> On Fri, Jun 26, 2015, 07:41 Dmitry Tantsur <dtantsur at redhat.com
> <mailto:dtantsur at redhat.com>> wrote:
>
> On 06/26/2015 04:08 PM, Sean Dague wrote:
> > On 06/26/2015 07:43 AM, Dmitry Tantsur wrote:
> >> On 06/26/2015 01:14 PM, Sean Dague wrote:
> >>> On 06/16/2015 09:51 AM, Dmitry Tantsur wrote:
> >>>> On 06/16/2015 08:56 AM, Dmitry Tantsur wrote:
> >>>>> To sum this long post up, I'm seeing that hiding new features
> based on
> >>>>> microversions brings much more problems, than it solves (I'm
> not aware
> >>>>> of the latter at all). I'm very opposed to continuing doing it in
> >>>>> Ironic, and I'm going to propose patch stopping gating Kilo
> changes
> >>>>> (non-breaking obviously).
> >>>>
> >>>> I'm talking about this patch:
> https://review.openstack.org/#/c/192196/
> >>>> We have to do it right now, as otherwise we can't test
> inspection in
> >>>> tempest (it does not seem to be microversion-aware).
> >>>
> >>> Dmitry,
> >>>
> >>> How do you solve for the following situation?
> >>>
> >>> 2 Clouds (A and B), both being Continuously Deployed.
> >>>
> >>> Assume both clouds start at same revision of code. At point in
> time T a
> >>> new "compatable change" is added to the API. For instance,
> another field
> >>> returned by some resource.
> >>>
> >>> Cloud B upgrades to that change.
> >>>
> >>> Brand new developer shows up. Starts writing application
> against Cloud
> >>> B. Sees that change is available at version 1.4. Hard codes her
> >>> application to use this parameter.
> >>>
> >>> Then she points her application at Cloud A. And it explodes.
> >>
> >> I clearly agree that my solutions do not solve this situation.
> Neither
> >> does yours. Now let us see:
> >>
> >> A compatible change is getting added and is guarded behind
> version 1.5.
> >> A new developer starts requiring this new version, because she needs
> >> this new feature (that's your assumption).
> >>
> >> Then she points her application at cloud A. And it explodes. But
> with
> >> different error message and probably a bit earlier. But explodes.
> >>
> >> Which, by the way, means we still must know precisely which API
> version
> >> is served by all clouds we might apply our utility to.
> >
> > But it fails with "Your application is attempting to use API 1.5
> which
> > is not supported in this cloud". Because if you don't specify a
> version,
> > you get the base 1.0, and never had new features.
> >
> > That's an error which is extremely clear to understand what went
> wrong.
> > Has docs to figure out if the application could work at an earlier
> > release version, and provides the ability for the client to do some
> > selection logic based on supported versions.
>
> I agree that error is clear. I'm not sure it's worth doing despite all
> the problems that I mentioned in the beginning of this thread. In
> particular, situation around official CLI and testing.
>
> E.g. do you agree with Jim that we should make API version a required
> argument for both CLI and Python library?
>
> >
> > -Sean
> >
> >>
> >> So I agree, hitting API version error could make a person
> realize that a
> >> change to the utility is no longer compatible with the current
> version
> >> of API. So if this change wasn't intended - fine. If it was
> (which is
> >> the most likely situation), it won't help you.
> >>
> >> By the way, I've heard some people wanting to deprecate API
> version with
> >> time. If we do so, it will open some new horizons for breakages.
> >> If we don't, we'll soon end put with dozens of version to
> support and
> >> test. How to solve it? (in Ironic IIRC we just only gate test one
> >> version, namely Kilo aka 1.6, which is very, very bad IMO).
> >>
> >>>
> >>>
> >>> I feel like in your concerns there has been an assumption that the
> >>> operation across all clouds effectively always goes forwards. But
> >>> because we're trying to encourage and create a multicloud
> ecosystem a
> >>> user application might experience the world the following way.
> >>>
> >>> Cloud A -> Cloud A' -> Cloud A'' -> Cloud D -> Cloud B' ->
> Cloud C ->
> >>> Cloud C'.
> >>
> >> I think that versioning actually encourages this (wrong) assumption.
> >> Because versions grow with time naturally, and we, the
> developers, like
> >> new and shiny stuff so much :) see below for my alternative idea.
> >>
> >>>
> >>> While no individual cloud is likely to downgrade code (though
> we can't
> >>> fully rule that out), the fact that we'd like applications to work
> >>> against a wide range of deployments means effectively
> applications are
> >>> going to experience the world as if the code bases both upgrade and
> >>> downgrade over time.
> >>>
> >>> Which means that a change is only "compatable" if the inverse
> of the
> >>> change is also "compatable". So a field add is only compatable
> if the
> >>> field delete is also considered compatible, because people are
> going to
> >>> experience that when they hop to another cloud.
> >>>
> >>> Which is also why feature hiding is a thing. Because we don't
> control
> >>> when every cloud is going to upgrade, and what they'll upgrade
> to. So
> >>> the best idea so far about getting this right is that API 1.4 is
> >>> *exactly* a specific surface. Features added in 1.5 are not
> visibile if
> >>> you ask for 1.4. Because if they were, and you now wrote
> applications
> >>> that used that bleed through, when you jump to a cloud without
> 1.5 yet
> >>> deployed, all your application code breaks.
> >>
> >> Note that if you rely on version 1.4 with feature hiding, your
> >> application will also break. I.e. I agree it's a valid situation
> to fix,
> >> I just don't see feature hiding fixing *all* cases of this problem.
> >> While an API exposing feature explicitly might be more handy,
> imagine e.g.
> >>
> >> $ curl http://ironic.host/v1/features
> >> ['inspection', 'raid', ...]
> >>
> >> Exposing interface like that would encourage people to think
> about their
> >> application in terms of mandatory and optional features, not
> some numbers.
> >
> > Yes, version number is being used as a proxy for a feature
> description.
> > Which is what version numbers are used for in software. It's a way to
> > let people think about bundles of things, instead of having to
> mentally
> > map out every single feature in their head.
>
> Why do you think it's good? People are using features, not numbers. They
> don't need to map out features - on the contrary they do need to map
> versions to features. We've reached 1.8 with Ironic - and I (the core)
> don't remember what were these version about, except for 1.6.
>
> >
> > Maybe we can some day to a place where we can have an API that's
> fully
> > feature describing, and doesn't need numbers. But after 2.5 years of
> > trying to do a major rewrite of the Nova API, it was pretty clear
> that
> > APIs of any reasonable size just can't do that. And can't rely on
> > software to keep up with your changes. This provides a mechanism for
> > evolution with a stability contract that API 1.4 is going to keep
> > looking exactly the same over time. So you can upgrade client code on
> > your schedule, not on the schedule of the server upgrades.
>
> I don't see any problem with creating an API serving list of strings,
> and then making contributors update this list every time they change
> API. It's the same as making contributors bump version number.
>
> >
> > -Sean
> >
>
>
> __________________________________________________________________________
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe:
> OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
> <http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>
>
> __________________________________________________________________________
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe: OpenStack-dev-request at lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
More information about the OpenStack-dev
mailing list