openstack team mailing list archive
-
openstack team
-
Mailing list archive
-
Message #06287
Re: Compute API Versioning
> On Tue, 2011-12-20 at 10:35 -0500, Brian Waldon wrote:
>
>> So there obviously isn't one clear way to version a RESTful API. Not
>> every API is created equal, and therefore doesn't need the same
>> capabilities in its versioning mechanism. At this point, it is
>> important to determine what specifically the Compute API needs:
>>
>> - Our versioning mechanism should not hinder progress within the underlying implementation
>> - We need to be able to iterate on the design of our API without being tied down
>> - It needs to be simple to use from the point of view of API developers AND language bindings authors
>>
>> With those goals in mind, I would like to propose we adopt the
>> following mechanism:
>>
>> - Use only major versions
>> - Allow backwards incompatibility between major versions
>> - Expose version of response in Content-Type header (application/vnd.openstack.compute.v3+json)
>> - Form request with version in Accept/Content-Type headers
>> - If no version is provided in request, default to stable
>> - If an unsupported version is requested, provide a 300 Multiple Choices response w/ list of available versioned mimetypes
>> - Provide a mechanism that can communicate all supported mimetypes (versions)
>
> There are clearly lots of different approaches that could be taken and
> this looks as reasonable as any other.
>
> Just a couple of points I'd make:
>
> - Versioning is important, but I'd prefer us to place more emphasis
> on how to design the API such that we can continue to expand the
> API in compatible ways for a decent period without introducing a
> new major version e.g.
Absolutely agree.
> - capability discovery - clients should not assume the API
> supports a given feature, but should query for its availability
> at runtime
Do you see the current extensions mechanism as a complete solution to this problem?
> - opaque URI structure - by requiring clients to navigate links
> in the hypertext documents returned by the server, you can
> change things around without breaking well-written clients.
> Basically, a good rule is that a client should never need to
> construct a URI
I think the missing link here is a root resource that provides links to get clients into top-level resources (servers, images, etc). Right now, the only client I've worked on doesn't follow links (python-novaclient).
> - versioning of resources - if we versioned individual resources,
> we could introduce a new incompatible version of a single
> resource without affecting users of other resources.
So I'm not completely sold here, but the mechanism I have proposed is open-ended enough that we could do this if we have enough reason to do so. I think this adds a lot of complexity from the client's point of view once they have to track multiple versions of multiple resources.
> - The whole question of media types is worthy of a long discussion,
> e.g.
>
> https://fedorahosted.org/pipermail/rhevm-api/2010-April/thread.html#94
> https://www.redhat.com/archives/rest-practices/2010-April/thread.html#00004
>
> Those discussions run the whole gamut of the topic, from whether
> media types should be fine or coarse grained, how to make
> compatible changes in XML, schema implications, URI based
> versioning schemes, etc.
>
> If we go with media type based versioning, it would definitely make
> more sense as a parameter e.g.
>
> Accept: application/vnd.openstack.compute+json;version=3
>
> Also, I'd support versionless application/xml and application/json
> to make things dirt simple for trivial one-off clients.
Yep, I'm for a default (unversioned media type). However, I'm against using version as a param. I will admit I've only looked at webob, but it seems like it is uncommon for libraries to parse accept params other than 'q' and 'level'.
> - The big argument for URI based versioning is that not all clients
> (e.g. browsers) can participate in content type negotiation. I'm
> not convinced that's a huge issue, though.
Yeah, I don't want to have my hands tied by this requirement. I think we can define defaults to allow browsers to participate, but that's where I would draw the line.
Brian
References