btw, based on discussion at the netstack meeting yesterday, we're going to go forward with this.
Salv, always a gent, volunteered to create and take on the following BP: https://blueprints.launchpad.net/quantum/+spec/api-error-codes This is targeted for E-3, which means feedback on spec will have to be quick. Earlier in this thread I throw out one option for how to map existing error codes to more standard codes. There are probably other approaches as well. Dan On Tue, Jan 10, 2012 at 1:37 PM, Dan Wendlandt <d...@nicira.com> wrote: > > > 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 > ~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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