<div dir="ltr">Question: doesn't this go semi-into the stuff Keystone guys are working on for the ServiceCatalog? </div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/5/2 Gabriel Hurley <span dir="ltr"><<a href="mailto:Gabriel.Hurley@nebula.com" target="_blank">Gabriel.Hurley@nebula.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> Hi Garbiel<br>
Hi Mrak. ;-)<br>
<div class="im"><br>
> This is a bit of a side-track but ... I've been around this project a while now,<br>
> but I admit to still being pretty confused about our approach to API<br>
> versioning. Are extensions really our only way of adding new capabilities to<br>
> an API version in a backwards compatible way?<br>
<br>
</div>OpenStack's approach to API versioning has historically had a lot of "continue forward because it's what we know" associated with it. I think most of the PTLs and core devs at this point are together in saying better differentiation of backwards-compatible changes from breaking changes, more minor version bumps, and better definition of what an "extension" means are the future of evolving the APIs. The model of "oh god we can't change anything without rewriting the entire API!" simply has to end.<br>

<div class="im"><br>
> And are extensions really our only way of allowing an API capability to be<br>
> optional?<br>
<br>
</div>This debate is a current topic on the mailing list and TC. There seems to be a lot of support for "anything that is optional is not core and thereby should be an extensions" but nothing is final there.<br>

<div class="im"><br>
> I'd like to see us introducing new API versions a lot less regularly, but still<br>
> being able to add new capabilities (and optional capabilities) in a backwards<br>
> compatible and client-queryable way.<br>
<br>
</div>Yep, we're all working towards that. :-)<br>
<div class="im"><br>
> Some options for doing that:<br>
><br>
>   * We allow minor versions with new features; clients know what<br>
>     features are supported in minor versions and expose capabilities to<br>
>     users based on the queried versions<br>
<br>
</div>Yes.<br>
<div class="im"><br>
>   * We add a 'GET /capabilities' which returns a document describing<br>
>     which features this endpoints support - a feature could be optional<br>
>     because it was added in a new version or because not all<br>
>     deployments would be configured with it enabled. This would allow<br>
>     clients to be able to query for features, rather than having a<br>
>     hard-coded understanding of which minor versions support which<br>
>     features.<br>
<br>
</div>I think we're gonna end up standardizing on "/extensions" because a plurality are less confused by that terminology vs. "capabilities". But that really depends on what the decision is on what an "extension" means. I use the term "capabilities" because it's not coupled to the code-driven idea of an extension in Nova, Cinder, Quantum, etc.<br>

<div class="im"><br>
>   * We adopt a more HATEOAS model where a client basically never<br>
>     constructs a URL - everything can be reached via links in the<br>
>     hypertext we return. If an endpoint doesn't support a given<br>
>     feature, it just never includes a link to that feature in the<br>
>     hypertext.<br>
<br>
</div>I don't hate HATEOS but I do think it's staggeringly inefficient in the amount of data it requires to be transferred and the number of queries needed for, say, a UI to build on top of it. The upside is that you get a lot of semantic information in the first query or two, but digging deeper can get really costly. The biggest downside to it is it's a complete departure from what we're doing now so it's an even bigger shift.<br>

<br>
All in all I think we're on similar tracks.<br>
<span class="HOEnZb"><font color="#888888"><br>
    - Gabriel<br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev</a><br>
</div></div></blockquote></div><br></div>