+1 on Rawlin's proposal on maintaining major API versions only to help us
get to the point where we have a clean API.   We've already spent way too
much time with backward compatibility when we have far too much tech debt
to get through.

-dan

On Wed, Mar 13, 2019 at 10:29 AM Dave Neuman <neu...@apache.org> wrote:

> I don't think we need to go all SemVer on this.  Our APIs are not being
> consumed by thousands or even hundreds of clients.  We should stick to
> either a major version (or no version) and make sure the clients we provide
> work.  I don't really like the idea of tying our version to our release
> version, but I won't be -1 on it if that is what the community wants.  At
> the end of the day we want to provide a solution that is both simple to
> understand and simple to use, even if it has downsides.
>
>
> On Wed, Mar 13, 2019 at 9:54 AM Gray, Jonathan <jonathan_g...@comcast.com>
> wrote:
>
> > The trick lies in how strict your serialization/deserialization is.  If
> > you only lock to the ATC Major rev, routine development can break strict
> > marshalling code as new fields are added/removed or methods are
> > added/removed in our primary master branch.  Suppose you're using the
> > golang or python native client libraries off the head of master, even if
> > you're vendoring the library properly the REST calls you're making may
> give
> > different answers (possibly even breaking the deserializer code) or
> > reference non-existent routes.  This is where the conversation about
> SemVer
> > comes in.  A lot of API and library development projects have adopted
> this
> > model because it solves this exact problem.  Another possible solution is
> > that 3rd parties simply never adopt the current ATC major API version and
> > rely on the stable API promise of the deprecated api version.  The
> downside
> > is that you won't be able to use any new functionality and you won't
> have a
> > transition window since the promise is only Current Release+1 instead of
> > Current Release+2.
> >
> > Regarding discoverability (#6) of available API versions there is already
> > an issue open for that:
> > https://github.com/apache/trafficcontrol/issues/2872
> >
> > Jonathan G
> >
> >
> > On 3/13/19, 9:15 AM, "Hank Beatty" <hbea...@apache.org> wrote:
> >
> >     Hello Rawlin,
> >
> >     Wow! I know that you are obviously really passionate about this
> > because
> >     that was a really long email. :)
> >
> >     Here are my 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 but, will always be optional for
> >     both GET and POST.
> >     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).
> >
> >     Yes, I know that #2 is not how it is today.
> >
> >     Traffic Control does not do enough minor and bug fix releases that
> > this
> >     should cause that big of an impact.
> >
> >     Regards,
> >     Hank
> >
> >     On 3/11/19 5:55 PM, Rawlin Peters wrote:
> >     > Hey Hank,
> >     >
> >     > I don't think we are planning on releasing TO separately from the
> > rest
> >     > of TC, nor do I think we should. The TO API version should not be
> the
> >     > same as the overarching TC version, because that would make it
> > unclear
> >     > whether or not an old script/client/whatever is expected to
> continue
> >     > to function properly with a new version of TC.
> >     >
> >     > The TO API version should provide some level of confidence that
> >     > scripts/clients/etc that have been coded against a particular API
> >     > major version will always work against that particular API major
> >     > version. Historically, we have inadvertently broken this "promise"
> > due
> >     > to making backwards-incompatible changes to the 1.x API, but I
> > believe
> >     > we are getting better at avoiding those breaking changes where its
> >     > reasonable.
> >     >
> >     > For example, let's say you were working with TC 3.0 and wrote a
> > script
> >     > against TO API V1 that GETs a bunch of servers, makes some changes,
> >     > then PUTs those changes back. Then you upgrade to TC 4.0 later.
> > Should
> >     > your script continue to work as-is? As long as V1 of the API is
> still
> >     > supported in TC 4.0, you should have some level of confidence that
> >     > your script will still work with TC 4.0.
> >     >
> >     > If the TO API was left un-versioned, every time you upgrade TC you
> >     > will have no real idea whether or not your old script is still
> going
> >     > to work. Some day, the script _won't_ work due to
> >     > backwards-incompatible changes made to the API. However, in a
> >     > major-versioned world, this would be in API V2, and your script
> would
> >     > stop working once API V1 is no longer supported, which hopefully
> > would
> >     > not be a surprise since we'd have to follow a schedule like this:
> >     >
> >     > - TC 3.0 released (supports TO API v1)
> >     > - TC 4.0 released 6 months later (supports TO API v1 _and_ v2, but
> v1
> >     > is now "obsolete")
> >     > At this point, you should convert any scripts/clients/whatever that
> >     > have been written against API v1 to work against the new API v2.
> >     > - TC 5.0 released 6 months later (now only supports TO API v2 --
> >     > requests made to the v1 API will fail immediately saying the v1 API
> > is
> >     > no longer supported)
> >     > At this point, you should not upgrade TO to 5.0 until you are
> >     > reasonably confident that you've gotten all your old v1
> >     > scripts/clients/etc to work against TO API v2, which you've had 6
> >     > months notice to complete already.
> >     >
> >     > If we left the TO API un-versioned or simply matched it to the TC
> >     > version, I think we'd fall into the trap of constantly making
> > breaking
> >     > API changes with no notice, which is bad for anything that uses the
> >     > API. It would make upgrading major TC versions a nightmare since
> > you'd
> >     > never really know if some script/client/etc was going to break
> after
> >     > the upgrade is completed. Using a major-versioned approach for the
> TO
> >     > API will make the upgrade process much smoother in the long run and
> >     > allow us to introduce breaking-API improvements without completely
> >     > blindsiding users.
> >     >
> >     > This approach would also help in-repo clients like Traffic Portal.
> >     > Today, Traffic Portal seems to be pretty much all-in on a single
> API
> >     > version. When we implement a TO API v2, we wouldn't immediately
> also
> >     > have to go fix Traffic Portal to work with the TO API v2 version.
> > This
> >     > means we can work on the API and UI separately, leading to more
> >     > focuses PRs and therefore a quicker PR review process, which is
> > better
> >     > for contributors and reviewers.
> >     >
> >     > On a related note, the TO API major version doesn't have to be an
> > "all
> >     > or nothing" kind of thing, so we shouldn't make our clients be
> >     > "all-in" on a single API major version. That is, we shouldn't have
> a
> >     > single global constant in the client that controls the API version
> it
> >     > requests across all endpoints. I imagine we will introduce v2
> >     > endpoints on an endpoint-by-endpoint basis, deprecating v1
> endpoints
> >     > as we go, so clients should be designed to support this kind of
> mixed
> >     > versioning eventually.
> >     >
> >     > - Rawlin
> >     >
> >     > On Mon, Mar 11, 2019 at 1:17 PM Hank Beatty <hbea...@apache.org>
> > wrote:
> >     >>
> >     >> Hello Rawlin,
> >     >>
> >     >> What is your reasoning to keep the API version separate from the
> TC
> > version?
> >     >>
> >     >> The only reason that I can think of is that the Traffic Control
> > Project
> >     >> team would plan on releasing an API (TO) version separately from
> the
> >     >> rest of the components. Is this something that we are planning on
> > doing
> >     >> in the future? From what I know we have not done that up to this
> > point.
> >     >>
> >     >> Regards,
> >     >> Hank
> >     >>
> >     >> On 2/14/19 12:53 PM, Rawlin Peters wrote:
> >     >>> There is a lot of stuff to digest here, and I agree that the v1
> > API is
> >     >>> desperately in need of a good v2. However, I'm not sure I agree
> > that
> >     >>> the API should be versioned alongside Traffic Ops. The API
> version
> >     >>> should be separate from the Traffic Ops/Traffic Control release
> >     >>> versions. We should do our best to not break a major API version,
> > so
> >     >>> in theory a script written against TO API v1 should always work
> > with
> >     >>> TO API v1. When TO API v2 is introduced, the script written
> > against v1
> >     >>> would not be guaranteed to work against v2 (although, we should
> > still
> >     >>> support v1 for some time before deprecating in favor of v2).
> >     >>>
> >     >>> - Rawlin
> >     >>>
> >     >>> On Thu, Feb 14, 2019 at 8:07 AM Fieck, Brennan
> >     >>> <brennan_fi...@comcast.com> wrote:
> >     >>>>
> >     >>>> I'd take it further, though in my opinion it shouldn't be done
> > until we're ready to do away with Perl entirely.
> >     >>>> I've been working on this for a little bit, and I sorta wanted
> to
> > make a wiki page for a proposed API v2 design before sending it, but what
> > the heck. The conversation is here now.
> >     >>>>
> >     >>>>
> >     >>>> I don't like the way our API is versioned. Let me be clear, it
> > _should_ be versioned, and the
> >     >>>> versions _should_ be semantic, but it is my opinion that the API
> > should be versioned alongside
> >     >>>> Traffic Ops rather than at its own pace. I've written
> essentially
> > an article on why this should be
> >     >>>> the case, and it follows:
> >     >>>>
> >     >>>> ** TIMING **
> >     >>>> The first issue I should address is timing - this needn't happen
> > immediately. For the time being, I
> >     >>>> think a radical change would be much more harmful than
> continuing
> > along our current versioning
> >     >>>> scheme. This change should be implemented with the advent of
> what
> > we currently refer to as "API v2".
> >     >>>> Presumably, at this time all of the Perl code has been removed
> > and we are looking to re-tool the API
> >     >>>> to be more sensible and standards-conforming. It's a time when
> > we'll already be making big, breaking
> >     >>>> changes. I personally would love for this to be ATC 4.0, but
> that
> > may not be a realistic goal.
> >     >>>>
> >     >>>> ** REDUNDANCY **
> >     >>>> The easiest to see - albiet simultaneously most trivial - issue
> > with the current API versioning
> >     >>>> scheme is how every request path must start with '/api/1.x/'.
> > This is annoying, to be frank;
> >     >>>> especially when one considers that the current plan for Traffic
> > Ops is to reduce it entirely to an
> >     >>>> API, so literally every endpoint will have '/api/' in common. We
> > _know_ the endpoint we are trying
> >     >>>> to query is an API endpoint because _all_ endpoints are API
> > endpoints. When we reach "API v2" the
> >     >>>> '/api/' part of request paths will have lost all value entirely.
> >     >>>> Even with that gone we are left with '/1.' (or '/2.' as the case
> > may become) as a common prefix,
> >     >>>> again annoying although not totally useless in this case.
> > However, the vast majority of API
> >     >>>> endpoints see no changes between minor versions, so really
> '/1.x'
> > just becomes a static, constant
> >     >>>> prefix where 'x' is the latest version of the API.
> >     >>>> In any case, versioning the API alongside Traffic Ops solves
> this
> > problem because our Traffic Ops
> >     >>>> server(s) emit HTTP headers that name the server. Once Perl is
> > gone, we'll be free to use the HTTP
> >     >>>> `Server:` header to name the server e.g. `Server: Traffic
> > Ops/3.2.1`. At this point, we could
> >     >>>> either implement an `OPTIONS` method request at the server's
> root
> > that would just return some
> >     >>>> headers - including `Server:` or just let people to a `GET` (or
> > better yet `HEAD`) request to
> >     >>>> `/ping` and pull the server version out of the headers. The
> > client then has all the information it
> >     >>>> needs to communicate effectively with the server. The
> alternative
> > to this within our current
> >     >>>> versioning schema is to implement an unversioned API endpoint
> > such that we have a hundred `/api/1.x`
> >     >>>> endpoints and one that has some other - or possibly no - prefix,
> > or have a versioned API version API
> >     >>>> endpoint, which is confusing even just to say.
> >     >>>>
> >     >>>> ** TRAFFIC OPS _IS_ THE API **
> >     >>>> As mentioned previously, the endgame of our transition from Perl
> > to Go is that Traffic Portal is the
> >     >>>> only UI for ATC - and in fact that's already somewhat true. That
> > leaves Traffic Ops as a database
> >     >>>> and a REST API for interacting with said database. In fact, the
> > database is often referred to as its
> >     >>>> own service: "ToDb", "Traffic Ops DB" etc. That means that we
> > have the single most important Traffic
> >     >>>> Control component split in two - half of its functionality is
> > versioned sanely with Traffic Control
> >     >>>> while the other half is versioned separately from anything else
> > in the world. That's crazy, because
> >     >>>> if you have a program that only does two things, then surely a
> > breaking change to one of those
> >     >>>> things means increasing its major version? If that's the case,
> > then why are we not versioning the
> >     >>>> API alongside Traffic Ops?
> >     >>>> It may be argued (incorrectly, in my opinion) that Traffic Ops
> > does more than serve an API to
> >     >>>> interact with a database. It generates configuration files and
> > system images, it combines data and
> >     >>>> does heavy processing on it. But really those things shouldn't
> be
> > taken into account in a versioning
> >     >>>> scheme except insofar as they affect the experience of some
> user,
> > administrator, or application
> >     >>>> interfacing with Traffic Ops. If the API responses don't change
> > in form or content, and if the
> >     >>>> process of setting up or maintaining the application haven't
> > changed, then any code changes you've
> >     >>>> made are a patch, not a version change. Traffic Ops does big
> > things, but at the end of the day it
> >     >>>> all just boils down to API inputs and outputs as far as anything
> > and anyone else is concerned.
> >     >>>>
> >     >>>> ** CONFUSION **
> >     >>>> We currently live in a world where I can run a script using the
> > Traffic Ops API that works perfectly
> >     >>>> fine against Traffic Ops version 3.2.1, but then if I again test
> > it against version 3.2.1 at some
> >     >>>> point in the future it breaks because breaking changes were made
> > in the API. It's easy to say, "oh,
> >     >>>> that just means that when we make breaking API changes we should
> > increment the version
> >     >>>> appropriately," but realize that this _is versioning the API
> > alongside Traffic Ops_. If we're not
> >     >>>> doing that, we're saying there is unpredictability with the
> > behavior of our system within releases,
> >     >>>> and if we _are_ doing that then the only difference between the
> > API version and the Traffic Ops
> >     >>>> version is that the API version is confusingly behind by about 2
> > major revisions. It should just be
> >     >>>> the same for simplicity's sake.
> >     >>>>
> >     >>>> ** THE API "PROMISE" **
> >     >>>> The single most common argument I hear in favor of our current
> > API versioning scheme is "well we've
> >     >>>> said an API version 1.x behaves in this way, and so we must
> > uphold that promise to the user base".
> >     >>>> Not only do we routinely break that promise already,
> >     >>>> (e.g. PR #3110 [
> > https://github.com/apache/trafficcontrol/pull/3110]) but I'm certainly
> not
> >     >>>> suggesting that we don't uphold this promise. Yes, this does
> mean
> > that making breaking API changes
> >     >>>> in TO would require a new major release and adding
> > features/fields to the API would require a new
> >     >>>> minor release. I don't see that as a big deal, especially if
> > implemented at the time I'm suggesting
> >     >>>> when we'd be re-designing the API - and it does sorely need to
> be
> > redesigned.
> >     >>>>
> >     >>>> * The API Needs to be Redesigned *
> >     >>>> I'm going to go down this rabbit hole for a second, if you're
> > already convinced the TO API needs a
> >     >>>> re-design then feel free to skip this section. I'm not going to
> > touch on any problems caused in the
> >     >>>> API as currently implemented by the use of a standalone API
> > version - that's what the entire article
> >     >>>> is for.
> >     >>>> Currently, our API currently has three huge problems:
> >     >>>>
> >     >>>> 1. Rampant oversaturation of endpoints
> >     >>>>           We have a systemic issue of re-implementing behaviour
> > in multiple endpoints. This is due in part
> >     >>>>           to a lack of good documentation - so developers aren't
> > aware of the endpoints available to them
> >     >>>>           - and partly because of the "Mojolicious Mindset" that
> > plagues our oldest endpoints. The
> >     >>>>           "Mojolicious Mindset" refers to the use of URL path
> > fragments as request parameters, e.g.
> >     >>>>           '/users/{{ID}}' instead of/in addition to
> > '/users?id={{ID}}'. From the perspective of someone
> >     >>>>           who is just writing the back-end for these endpoints,
> > there's no clear advantage to one over the
> >     >>>>           other except that the former seems to more clearly
> > reflect the intent of requesting a specific
> >     >>>>           object whereas the latter could be seen as more of a
> > "filter" on a larger collection. That's not
> >     >>>>           incorrect, necessarily, but the two are totally
> > separate request paths, so having '/users' and
> >     >>>>           '/users/{{ID}}' means documenting two endpoints
> instead
> > of one, and it means two lines in the
> >     >>>>           route definitions, and it means two seperate handlers
> > instead of one (albiet a more complex
> >     >>>>           one).
> >     >>>>           Consider also that we have all of the following
> > endpoints for manipulating Cache Groups:
> >     >>>>
> >     >>>>           * /api/1.x/cachegroup/{{parameter ID}}/parameter
> >     >>>>           * /api/1.x/cachegroup_fallbacks
> >     >>>>           * /api/1.x/cachegroupparameters
> >     >>>>           * /api/1.x/cachegroupparameters/{{ID}}/{{parameter
> ID}}
> >     >>>>           * /api/1.x/cachegroups
> >     >>>>           * /api/1.x/cachegroups/{{ID}}
> >     >>>>           * /api/1.x/cachegroups/{{ID}}/deliveryservices
> >     >>>>           * /api/1.x/cachegroups/{{ID}}/parameters
> >     >>>>           * /api/1.x/cachegroups/{{ID}}/queue_updates
> >     >>>>           * /api/1.x/cachegroups/{{ID}}/unassigned_parameters
> >     >>>>           * /api/1.x/cachegroups/{{parameter
> > ID}}/parameter_available
> >     >>>>           * /api/1.x/cachegroups_trimmed
> >     >>>>
> >     >>>>       These could all be collapsed neatly into one or two
> > endpoints, but were instead implemented
> >     >>>>       separately for whatever reason(s)
> >     >>>>       (see Issue #2934 [
> > https://github.com/apache/trafficcontrol/issues/2934] for details).
> >     >>>>
> >     >>>> 2. Improper/Non-existent standards conformity
> >     >>>>           We have requests that should be read-only that make
> > server-side state changes (Issue #3054
> >     >>>>           [
> https://github.com/apache/trafficcontrol/issues/3054]),
> > we have endpoints returning success
> >     >>>>           responses on failure (Issue #3003 [
> > https://github.com/apache/trafficcontrol/issues/3003]) and
> >     >>>>           our "CRUDER" has failed us. `PUT` should be used to
> > _create_ objects (or possibly update them by
> >     >>>>           creating an alternative representation with the same
> > identifiying information) but is instead
> >     >>>>           used as the primary "edit this" method. `POST` is for
> > processing entities in a data payload, but
> >     >>>>           is instead used for object creation. `PATCH`
> > languishes, totally unimplemented. These problems
> >     >>>>           are systemic and stem partially from the "Mojolicious
> > Mindset" whereby new functionality is
> >     >>>>           introduced into the API by first considering what
> > request method is appropriate and then
> >     >>>>           deciding on a request path that names the operation
> > being done. Request methods are meant to be
> >     >>>>           the different ways in which a client interacts with a
> > resource on the server, and thus the
> >     >>>>           resources themselves should be considered primary. The
> > "CRUDER" hampers this mindset, because it
> >     >>>>           makes treating payloads and query parameters generic
> > and isn't receptive to injection of new
> >     >>>>           behaviour.
> >     >>>>           The "CRUDER" is a great innovation, to be sure, as it
> > saves us quite a bit of time and prevents
> >     >>>>           duplicating code, but the problem it solves is an
> > emergent property of of API problem #1 above.
> >     >>>>           With fewer endpoints we'd have much more specific
> > handling, and the need for and advantages of
> >     >>>>           the "CRUDER" will vanish.
> >     >>>>
> >     >>>> 3. Needing multiple queries to obtain a single piece of
> > information
> >     >>>>           This issue is pretty deeply rooted, and is related to
> > the way our database is structured. But
> >     >>>>           that's part of the problem - an API needn't replicate
> > the database, and is therefore free from
> >     >>>>           some of the constraints that bind a database.
> >     >>>>           The way things are now, in order to e.g. create a
> > server definition I must make several
> >     >>>>           preliminary requests to determine the integral,
> unique,
> > non-deterministic identifiers of other
> >     >>>>           objects. I think we all agree that ideally these
> > integral IDs would have no part in the output
> >     >>>>           of the API, and many people I've spoken to would
> > support wiping them from the database entirely
> >     >>>>           given enough time and manpower.
> >     >>>>
> >     >>>> ________________________________________
> >     >>>> From: Robert Butts <r...@apache.org>
> >     >>>> Sent: Wednesday, February 13, 2019 6:11 PM
> >     >>>> To: dev@trafficcontrol.apache.org
> >     >>>> Subject: Re: [EXTERNAL] Re: Traffic Ops API versioning issues
> >     >>>>
> >     >>>>> It doesn't seem like the idea of full TO API SemVer was ever
> > fully
> >     >>>> discussed and voted on
> >     >>>>
> >     >>>>> Since it seems like we never truly committed to SemVer with
> > minor versions
> >     >>>> for the TO API
> >     >>>>
> >     >>>> There was consensus:
> >     >>>>
> >
> https://lists.apache.org/thread.html/8f8a850c68424021a0fe06967894383a24e463f1b0cee4d652d04590@%3Cdev.trafficcontrol.apache.org%3E
> >     >>>>
> >
> https://lists.apache.org/thread.html/1a42a2192a81fc4d76639ccd10761b6b73c31345a63715bb8aa86e4e@%3Cdev.trafficcontrol.apache.org%3E
> >     >>>>
> >     >>>> We didn't do an official [VOTE], but we rarely do that as a
> > project, unless
> >     >>>> there's difficulty reaching unofficial consensus. That said,
> > there's
> >     >>>> nothing stopping another discussion or vote, if we want to
> change
> > things.
> >     >>>>
> >     >>>>> as long as we set the expectations for the user
> >     >>>>
> >     >>>> That's precisely my point. We can always say "we set the
> > expectations, it's
> >     >>>> the user's fault for misreading, or misunderstanding, or not
> > noticing a
> >     >>>> changelog." It's not about fault, it's about providing a better
> > user
> >     >>>> experience.
> >     >>>>
> >     >>>>> that support has to be baked into traffic_ops_golang such that
> > it's easy
> >     >>>> and maintainable to support tons of minor versions. If we keep
> > heading down
> >     >>>> our current path we are going to be left with a giant mess.
> >     >>>>
> >     >>>> I don't think anyone disagrees. Traffic Ops versioning has had
> > considerable
> >     >>>> technical debt for some time now. We just haven't been willing
> to
> > spend the
> >     >>>> time to fix it. I agree, that needs to change.
> >     >>>>
> >     >>>> I'd also like to note, there's another option: code generation.
> > We can keep
> >     >>>> the structs and handlers largely the same, and generate the
> > "duplicate"
> >     >>>> code when a new minor version is added. There's a strong
> argument
> > that this
> >     >>>> is the "idomatic" way to solve this problem, for the Go
> language.
> > I
> >     >>>> personally feel Reflection is better here. But, I wanted
> everyone
> > to be
> >     >>>> aware that's an option, if the consensus is that it's the best
> > option. In a
> >     >>>> nutshell, we could generate code with a script (with a spectrum
> of
> >     >>>> precision and complexity, from `cp && sed` to parsing the AST),
> > and
> >     >>>> `routes.go` would have a `//go:generate` header. For examples,
> > see:
> >     >>>>
> >     >>>> https://blog.golang.org/generate
> >     >>>> https://godoc.org/golang.org/x/tools/cmd/stringer
> >     >>>>
> >     >>>> I did some prototyping of that approach, if anyone is
> interested,
> > just let
> >     >>>> me know and I can provide examples of what that would look like.
> >     >>>>
> >     >>>>
> >     >>>> On Wed, Feb 13, 2019 at 5:09 PM Rawlin Peters <
> > rawlin.pet...@gmail.com>
> >     >>>> wrote:
> >     >>>>
> >     >>>>> On Wed, Feb 13, 2019 at 1:20 PM Gray, Jonathan
> >     >>>>> <jonathan_g...@comcast.com> wrote:
> >     >>>>>>
> >     >>>>>> I'm +1 on keeping full API SemVer.
> >     >>>>>
> >     >>>>>> On 2/13/19, 12:16 PM, "Robert Butts" <r...@apache.org> wrote:
> >     >>>>>>
> >     >>>>>>       We would be abandoning Semantic Versioning.
> >     >>>>>
> >     >>>>> This is why I wanted to open this up for broader discussion
> > within the
> >     >>>>> community. It doesn't seem like the idea of full TO API SemVer
> > was
> >     >>>>> ever fully discussed and voted on (at least not to my
> knowledge),
> >     >>>>> which is why I haven't been abiding by it myself or enforcing
> it
> > upon
> >     >>>>> other TO API devs either. If we're going to truly commit to
> > SemVer
> >     >>>>> with minor versions for TO API then we should fully understand
> > the
> >     >>>>> cost vs utility of doing so. Also, SemVer doesn't have to be an
> > "all
> >     >>>>> or nothing" thing, as we currently choose to ignore the "patch"
> >     >>>>> version for the TO API. We could also choose to ignore the
> minor
> >     >>>>> version and just focus on the most important aspect of SemVer
> > which is
> >     >>>>> not introducing backwards-incompatible changes in the same
> major
> >     >>>>> version.
> >     >>>>>
> >     >>>>> Since it seems like we never truly committed to SemVer with
> minor
> >     >>>>> versions for the TO API, traffic_ops_golang wasn't designed to
> > easily
> >     >>>>> support minor versions. So if we're going to truly commit to
> > SemVer
> >     >>>>> with minor versions for TO API, then that support has to be
> > baked into
> >     >>>>> traffic_ops_golang such that it's easy and maintainable to
> > support
> >     >>>>> tons of minor versions. If we keep heading down our current
> path
> > we
> >     >>>>> are going to be left with a giant mess.
> >     >>>>>
> >     >>>>> The only way I can get behind supporting the "minor version
> > promise"
> >     >>>>> is if we have a way to basically just tag fields as introduced
> > in a
> >     >>>>> specific API version, with just a single struct per resource
> and
> > a
> >     >>>>> single handler per major version of an endpoint. We should only
> >     >>>>> require a single implementation of an endpoint per major
> > version. If a
> >     >>>>> custom JSON parser allows us to do that, then that's great.
> > Without
> >     >>>>> that, I don't think supporting the "minor version promise" is
> > even a
> >     >>>>> viable option.
> >     >>>>>
> >     >>>>> A lot of those scenarios around user confusion due to
> supporting
> > just
> >     >>>>> a major version are not really an issue as long as we set the
> >     >>>>> expectations for the user. I.e.:
> >     >>>>> - clients should request v1
> >     >>>>> - as the v1 API is enhanced in a backwards-compatible manner,
> > clients
> >     >>>>> will begin to see new fields in the server responses
> >     >>>>> - if a client wants to modify a resource, they will typically
> do
> > a GET
> >     >>>>> on the resource, modify the resource, then do a PUT back to the
> >     >>>>> server.
> >     >>>>> - in the GET response, if the client sees new fields, they can
> > expect
> >     >>>>> to modify those fields and see it reflected on the server.
> >     >>>>> - if the client does NOT see new fields, then they cannot add
> > fields
> >     >>>>> and expect to see that reflected on the server
> >     >>>>> - null values in optional fields will be interpreted by the
> > server as
> >     >>>>> whatever the default for that optional field is. So if the
> > default for
> >     >>>>> new optional field "foo" is 5, then a client sending `"foo":
> > null`
> >     >>>>> will be interpreted by the server as `"foo": 5`, and `"foo":
> > null`
> >     >>>>> should never have a different meaning than `"foo": 5` on the
> > server.
> >     >>>>>
> >     >>>>> The advantage of just supporting the "major version promise":
> >     >>>>> - jives better with Go's lack of metaprogramming
> >     >>>>> - no custom JSON parser in Go required
> >     >>>>> - less general overhead in development
> >     >>>>> - only have to worry about breaking changes
> >     >>>>> - no worrying about which fields belong to which minor versions
> >     >>>>> - no extra API testing to make sure fields introduced in API
> v1.N
> >     >>>>> aren't returned to v1.N-1 clients
> >     >>>>> - don't have to update every single client in the repo with the
> > new
> >     >>>>> minor version every time a minor version is incremented (since
> > clients
> >     >>>>> would just specify the major version)
> >     >>>>>
> >     >>>>> So, as a community, we need to weigh these options and decide
> > whether
> >     >>>>> or not we want to take the "major version only" route or the
> > "major
> >     >>>>> plus minor version" route. Personally, I prefer the "major
> > version
> >     >>>>> only" route because it means less code, less overhead, less
> >     >>>>> coordination, and less things to potentially go wrong. However,
> > if a
> >     >>>>> relatively small custom JSON parser is all we really need to
> >     >>>>> reasonably support the "minor version promise", then I can't
> say
> > I'm
> >     >>>>> completely against that route either (just that I wouldn't
> > prefer it).
> >     >>>>>
> >     >>>>> - Rawlin
> >     >>>>>
> >
> >
> >
>

Reply via email to