>When API version 1.3 came out, why could I not call 1.3 for every API
route even if the route didn't change?

That was a Perl mistake, and a bug.

>Why not point the 1.3 to the 1.1 for example?

Go does, and we manually do in Perl now, too.


On Thu, Apr 18, 2019 at 11:47 AM Hank Beatty <hbea...@apache.org> wrote:

> +1
>
> I agree with Jonathan but, I ran into my issue going from one TC release
> to the next.  I want to have the API not break as long as that API is
> supported.
>
> I also don't want to have to use multiple versions of the API in my
> script unless I absolutely have to for some reason on my end. I want to
> be able to define the API version at the top of my script and use that
> version all the way through my script.
>
> I don't really care if more fields are returned. I may not be using all
> of the fields anyway. I do care if some of the fields disappear but, the
> API version I am using is supposed to not have changed.
>
> I guess what I am realizing is my issues with the API may not be about
> how it is versioned at all but, about testing to make sure the supported
> versions have not changed in the way they work. I brought up versioning
> because it seemed that would help with the breaking changes issue.
>
> There used to be a matrix of the API routes (that I can't seem to find
> now). When API version 1.3 came out, why could I not call 1.3 for every
> API route even if the route didn't change? Why not point the 1.3 to the
> 1.1 for example?
>
> Perhaps part of the issue is not deprecating things fast enough and not
> incrementing the major version fast enough? If we release a new major
> version of TC every 6 mos. as we are trying for but, not always
> succeeding, we could deprecate faster and scripts would be supported for
> a year. If we could get to a point where we could support a 2 major
> release versions of TC this would mean a script would be supported for 2
> years.
>
> Which brings me back to my original thoughts on API versioning:
>
> 1. The URL for the API should follow the TC major version (e.g.
> http://.../api/v3/...)
> 2. TC 3.x.x would support v2 (with a warning message that it is
> obsolete) and v3 of the API.
> 3. TC 4.x.x would support v3 (with a warning message that it is
> obsolete) and v4 of the API.
> 4. A user of the API should not have to call v1.2, v1.3, and v1.4 in the
> same script. This would be taken care of with 1, 2, and 3 above.
> 5. In the documentation, define "backward compatible" as new fields will
> be introduced within a major version and will be presented in a GET but,
> not available for a POST (and specify a default in the documentation).
> 6. If a user really wants to know the specific version (x.x.x) of the
> API there should be an API route (e.g. https://.../api/v3/version).
>
> I changed 5 a bit from my original thoughts.
>
> I am not helping to develop the API, unfortunately. This is what I see
> as a user of the API.
>
> -Hank
>
> On 4/18/19 12:37 PM, Gray, Jonathan wrote:
> > At the end of the day, what I want is a consistent API that I can code
> against in the head of master that's treated like a contract.  As an API
> user outside of the ATC repo it's incredibly frustrating to have my stuff
> break all the time.  It basically encourages never developing using the
> latest API versions (regardless of how they're defined and even then things
> still break retroactively) or a non-official OSS release alltogether.  It's
> a catch22 to be forced to either not vendor the go/python/bash libraries
> which leads to constant develop/recompile/deploys in lockstep with ATC or
> vendor and still have to do these things when stuff breaks anyway in the
> API.  Really debating the native client libraries at all is just a red
> herring because the root issue is the HTTP API itself which is the real
> thing to care about since not all integrations use one of the client
> libraries, nor can be forced to do so, and may require a rigid API
> definition.
> >
> > Jonathan G
> >
> >
> > On 4/18/19, 10:12 AM, "Rawlin Peters" <rawlin.pet...@gmail.com> wrote:
> >
> >      > The UPDATE statements need modified to fix #3497 even if we get
> rid of
> >      > versioning. Unless we decide to permanently break all clients
> older than
> >      > the newest server field, with every new server upgrade. The only
> other
> >      > option is to fix the updates. Unless you know of a way to fix
> missing
> >      > fields without changing the update statements, that I'm not
> seeing?
> >
> >      By removing minor versioning, only certain clients that don't handle
> >      new unknown fields would potentially be broken, and I believe only
> the
> >      TO Go client has that problem in our repo. However, the TO Go client
> >      happens to use the same Go structs as traffic_ops_golang, so
> whenever
> >      new fields are added to the API, all the client has to do is
> recompile
> >      with the up-to-date structs. Unless we made breaking changes to the
> >      client, in most cases all that would be needed for those clients is
> a
> >      recompile. Traffic Portal, the Python TO client, and I'm pretty sure
> >      the Java TO client all handle unknown fields properly.
> >
> >      Without minor versions, #3497 would not even an issue. It's only an
> >      issue because of the attempt to support minor versioning. If we just
> >      support the major version, all client requests would be treated as
> v1,
> >      and there would only ever be one SQL UPDATE statement per major
> >      version. We wouldn't need to "upgrade" 1.2 requests into a 1.4
> struct
> >      (thus preventing the bug in #3497) by selecting and inserting all
> 1.4
> >      values from the DB into the struct before handling the request or
> >      dynamically generating the SQL UPDATE statement to use based on the
> >      requested minor version.
> >
> >      > So, this solution actually gives us
> >      > this bug fix almost for free. All that's required is another
> small function
> >      > to iterate over the object fields to create the update query.
> It's by far
> >      > the easiest and simplest fix for #3497; unless we also
> permanently break
> >      > all older clients on every server upgrade along with the minor
> version
> >      > removal.
> >
> >      Switching all the endpoints over to your "apiver" library would not
> be
> >      as trivial to implement or remove as you make it sound. It would
> >      require lots of added API test coverage and a non-trivial amount of
> >      code modifications to all API endpoints. Certain UPDATE queries
> might
> >      be easy to generate from a given struct if the struct only uses a
> >      single table, but I don't think something like that would work for a
> >      field like `cachegroup.LocalizationMethods` which doesn't come from
> >      the cachegroups table and is updated separately from the rest of the
> >      cachegroup fields.
> >
> >      - Rawlin
> >
> >
>

Reply via email to