On Mon, Jan 9, 2012 at 4:33 AM, Salvatore Orlando < salvatore.orla...@eu.citrix.com> wrote:
> Hi all,**** > > Here’s another “resurrecting” email thread, after exactly a month! > just in time! everyone knows that email thread expire after one month. I agre with your thoughts below and don't really have anything to add. Are we to the point where we should create a BP for this? Dan > **** > > ** ** > > Aaron had a very interesting observation concerning error codes raised > from the Quantum API. We currently use several 4xx codes to describe > Quantum-specific errors, such as “NetworkNotFound” or “PortNotFound”; we > ensured that Quantum error codes did not overlap with standard HTTP error > codes. **** > > Even if this simplifies the process of understanding the reason of the > failure of an API operation, on the other hand it might create problems for > clients using standard REST libraries which expect only standard HTTP > codes; also this is not compliant with the current implementation of the > Openstack API; to the best of my knowledge, Keystone and Glance API too > only use standard HTTP error codes; I’m not sure about swift, but I think > it also uses standard codes only.**** > > ** ** > > It is my opinion that, in order to proceed in the right way on error code, > we should answer the following three questions:**** > > **1) **Do we want to change the error codes at all? – and if yes, > when.**** > > **2) **How do we want to restructure them?**** > > **3) **How do we handle the difference between Quantum API v1.0 and > v1.1?**** > > ** ** > > Personally, my answers are:**** > > 1 – If being compliant with APIs for core OS projects is a priority for > us, then yes, we should definitely change the structure of the error codes; > the sooner we do it, the better it is;**** > > 2 – The OS API approach (I’m referring API spec 1.1 for an example, I > don’t know whether there are changes in error codes for API 2.0) “maps” the > fault to the HTTP error codes which semantically closer to the fault. For > instance, “buildinprogress” is mapped to HTTP 409 – which is used for > expressing a conflict error. Even though we could follow this approach, it > is my opinion that we could just use a few error codes (namely 400, 401, > and 403) and then embed a Quantum-specific code, and a detailed error > message in the response body.**** > > 3 – That’s a very delicate point, but I reckon we should leave the current > error codes in v1.0, and provide the new ones in v1.1. This would > definitely break backward compatibility for clients written for API v1.0; > hence we should also consider branding this new version 2.0.**** > > ** ** > > What are your thoughts?**** > > ** ** > > Regards,**** > > Salvatore**** > > ** ** > > *From:* Dan Wendlandt [mailto:d...@nicira.com] > *Sent:* 09 December 2011 02:13 > *To:* Salvatore Orlando > *Cc:* Aaron Lee; netstack@lists.launchpad.net > > *Subject:* Re: error codes in quantum api**** > > ** ** > > ** ** > > On Wed, Dec 7, 2011 at 7:29 AM, Salvatore Orlando < > salvatore.orla...@eu.citrix.com> wrote:**** > > Hi Aaron, **** > > **** > > The error codes returned by the Quantum API were one of the most discussed > points in the diablo release cycle. I reckon I changed them at least 4 > times!**** > > **** > > Let me first give you some background. The choice was between using HTTP > response codes capable of easily pointing the user to the root cause or > using only standard HTTP response code, embedding application-level error > codes (e.g.: NetworkNotFound) within the response itself. We decided to > follow the first option, provisioned that we ensured no error code chosen > for Quantum redefined any standard HTTP error code.**** > > **** > > Personally, I think both approaches are perfectly valid; however I realize > the approach we chose is probably not the ‘standard’ way of implementing > RESTful APIs. I’m therefore completely open at restructuring Quantum’s > response codes, and target this work for E-3 provided that i) there’s > agreement from the community (meaning that nobody has a strong argument > against it) **** > > ** ** > > I think this generally makes sense, going by the two measuring sticks of > "least surprise" and "most like other openstack projects". **** > > ** ** > > **** > > and ii) we agree on how to deal with the resulting incompatibility between > v1.0 and v1.1.**** > > ** ** > > As long as this is part of a version change, and the client is updated, I > don't think this will be a big deal, right? **** > > ** ** > > My bigger concern is to see who is volunteering for the work... are you > interested Aaron? I know Salv is already quite loaded with work for E-2 > and E-3. **** > > **** > > **** > > I also think we are summarizing pretty well how we could restructure the > error codes:**** > > · 420, 430 à 404**** > > · 421, 432, 440 à 409**** > > ** ** > > Definitely agree with the above mappings. **** > > **** > > · 431 (RequestedStateInvalid) could also be mapped on 409. It is > not a 5xx case, as this error is generated when an invalid administrative > state is specified in the request (invalid means that its syntax is > invalid, not that the server does not consider it valid due to its current > state)**** > > ** ** > > Agreed that this is not really a 5xx error. This is a case of a "bad user > input", where a certain text string named "state" in the JSON or XML body > should be one of a few well-defined values (either "DOWN" or "ACTIVE") > otherwise we return an error code. In my experience, usually a 409 is used > the request is syntactically "valid" but being rejected because it violates > some constraint in the resource model. This is more of a case of "this > request is not valid syntax". For this, the vanilla 400 error seems > applicable. The RFC text is: "The request could not be understood by the > server due to malformed syntax. The client SHOULD NOT repeat the request > without modifications."**** > > ** ** > > That said, I don't really feel strongly about this :) **** > > ** ** > > ** ** > > · For the Unauthorized error, the discussion on the > WWW-Authenticated header probably goes beyond Quantum, as I think it > involves each Openstack project integrated with Keystone.**** > > ** ** > > Agreed. **** > > **** > > In case we decide to restructure the error code another thing we might > consider is to use 400 BADREQUEST (and 401 for auth failures) only, > including the Quantum-specific error code in the response. IMHO This would > also be along the same lines of what Aaron suggested, and possibly easier > for client apps which will not have to look for multiple error codes in the > HTTP response.**** > > ** ** > > That's a fair point. I tend to like using 404s and 409s as well, as it > allows some differentiation (e.g., I can programmatically tell the > difference between a valid request for an entity that doesn't exist and an > invalidly formated request. I might want to react to them differently. In > the first case, perhaps I perform some action to create the entity. In the > latter, I probably just log something and give up.)**** > > **** > > Dan**** > > ** ** > > ** ** > > **** > > Regards,**** > > Salvatore**** > > **** > > **** > > **** > > *From:* Aaron Lee [mailto:aaron....@rackspace.com] > *Sent:* 06 December 2011 22:42 > *To:* netstack@lists.launchpad.net > *Cc:* Salvatore Orlando; Dan Wendlandt > *Subject:* Re: error codes in quantum api**** > > **** > > Dan, Salvatore, folks,**** > > **** > > The issue I've seen with this was an error in quantum that raised an > unexpected error within nova, causing a 500 to bubble back to the api. It > was a miss configuration that caused the initial error, but it could have > occurred in the wild as well. This will occur for other consumers of this > API as well. We can expect at lest some of them to use HTTP or REST > libraries that don't know what to do with non-standard HTTP error codes. I > think it would be nicer to those people to use the most specific, yet IETF > defined, error code possible. We can include a more specific message within > response, but it should conform to an expected(and hopefully handled by > their libraries) error code. The idea I'm promoting here is the > element-of-least-surprise. If someone were rolling their own http client, > it may be cute to see custom codes, but I don't think most people will be > doing that. It could be off putting for them to have to pick a different > library just because of these codes.**** > > **** > > As far as how to change them;**** > > **** > > I'm not sure what to do with 401, rfc 2661 says this "response MUST > include a WWW-Authenticate header field (section 14.47) containing a > challenge applicable to the requested resource." And I'm not sure we always > do that. For authentication and authorization I would recommend we remain > consistent with the rest of openstack.**** > > **** > > For NetworkNotFound 420, and PortNotFound 430 I recommend we replace these > with 404. We can have a more specific message about the exact missing > resource in the response.**** > > **** > > NetworkInUse 421, PortInUse 432, and AlreadyAttached 440 seem like good > candidates for 409 Conflict. 409 requires the response to include enough > information to identify the source of the conflict, and I believe this > would satisfy the original idea of being more specific for the users of > this API.**** > > **** > > RequestedStateInvalid 431 I'm not 100% sure what to do about this one. It > almost seems like it would be a 5xx-opps-I'm-sorry instead of a > 4xx-no-you'r-wrong because it's a missing feature. But I would be afraid of > a client that handles 5xx response different from 4xx ones. Following least > surprise it could be 501, Not Implemented. However I don't see a 4xx error > code that would express this.**** > > **** > > Please let me know what you think,**** > > **** > > Aaron Lee**** > > **** > > On Dec 6, 2011, at 3:58 PM, Dan Wendlandt wrote:**** > > ** ** > > Hi folks, **** > > **** > > One quick of the Quantum API that is potentially confusing is that we use > non-standard HTTP error codes to provide specialized error codes. For > example, instead of a 404 for any not found, we have 420 for "network not > found" and 430 for "port not found". This could be potentially useful if > the exact item that could not be found is not implicit in the actual API > call (e.g., if I query port Y on network X, it could be either the network > or the port that was not found). I'm not sure if that was the original > intent fo the design, but that's my guess. **** > > **** > > Given that we're close to defining a new rev of the API, Aaron suggested > that we open a discussion on the topic, so I'm doing just that. Please jump > in. **** > > **** > > Dan**** > > **** > > **** > > -- > ~~~~~~~~~~~~~~~~~~~~~~~~~~~ > Dan Wendlandt **** > > Nicira Networks: www.nicira.com**** > > twitter: danwendlandt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~**** > > **** > > **** > > > > **** > > ** ** > > -- > ~~~~~~~~~~~~~~~~~~~~~~~~~~~ > Dan Wendlandt **** > > Nicira Networks: www.nicira.com**** > > twitter: danwendlandt > ~~~~~~~~~~~~~~~~~~~~~~~~~~~**** > > ** ** > -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dan Wendlandt Nicira Networks: www.nicira.com twitter: danwendlandt ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Mailing list: https://launchpad.net/~netstack Post to : netstack@lists.launchpad.net Unsubscribe : https://launchpad.net/~netstack More help : https://help.launchpad.net/ListHelp