← Back to team overview

launchpad-dev team mailing list archive

RFA: Not breaking the WS API

 

Hi folks,

A Request-For-Answers here. I'm currently working on fixing bug 657004
("can't read bug.linked_branches via REST API when it contains a
private branch"). The most efficient solution I've been able to come
up with (with lots of help and advice from Rob) adds a getter,
getVisibleLinkedBranches(user) to IBug, which returns all the linked
branches visible to `user`. This is now exposed in the API (in my
branch [1]) as IBug.linked_branches, replacing the existing collection
attribute.

I didn't expect this to work, but with the following declaration:

    @call_with(user=REQUEST_USER)
    @export_operation_as('linked_branches')
    @export_read_operation()
    @operation_for_version('devel')
    def getVisibleLinkedBranches(user):
        """Rertun the linked to this bug that are visible by `user`."""

The following launchpadlib call works perfectly:

    >>> linked_branches = lp.bug[12345].linked_branches

(I'd expected that I'd need to add parens after the call because it's
become a named get instead of a property on the bug. Launchpadlib
appears to do magic, which is slightly worrying).

The problem that I now have is that although for launchpadlib users
the API won't appear to have changed, at the RESTful level it *has*
changed:

 - There's no longer a linked_branches_collection_link in
   the Bug JSON.
 - To get linked_branches you now have to make a named GET
   to linked_branches.

Basically, if I'm right, any API client that uses the RESTful API
directly - including our own JS API client - is now going to break
when it tries to do anything with linked_branches.

I can see a couple of solutions to this:

 1. Make linked_branches a property again. This means using
    the LaunchBag to get the current user. Avoiding the Bag
    was the main reason for adding a getter instead of using
    a property here.
 2. Leave the current linked_branches attribute exposed for
    the stable versions of the API and expose the new getter
    for the devel API (and subsequent stable versions).
 3. Change the API and contact all the people who use the WS
    API to let them know about the change.

Thoughts:

 - Option 1 seems like the simplest, though I dislike using
   the LaunchBag.
 - Option 2 seems like a half-decent option, though I don't
   know if it's possible to expose an attribute for only a
   given set of API versions (as one would an operation with
   @operation_for_version). Also, this then means that the bug
   itself hasn't been fixed except for the devel version of the
   API.
 - Option 3 is the most complete solution in terms of not using
   the LaunchBag and using a getter which receives a user
   parameter. However, it explicitly violates our
   backwards-compatibility rules regarding the WS API and means
   that we're probably going to end up causing some pain for API
   users, regardless of how much we try to mitigate that pain.

At the moment I'm leaning towards option #1, but I'd appreciate
suggestions, ideas or instructions from the peanut gallery at this
point.

Yours in vague hope,

Graham

 [1] https://code.launchpad.net/~gmb/launchpad/private-branches-bug-657004/+merge/65639

-- 
Graham Binns | PGP Key: EC66FA7D
http://launchpad.net/~gmb


Follow ups