[Pulp-list] REST Musings
Jay Dobies
jason.dobies at redhat.com
Thu Jan 5 15:14:44 UTC 2012
I'm adding the REST APIs for the unit association (read: cloning) stuff.
What they look like is another discussion since conceptually it's
crossing boundaries across two resources, but that's not my worry right now.
That call is eventually going to be asynchronous when the coordinator
layer is finished. Even outside of this call, I'm wondering if making
things asynchronous is going to complicate the HTTP status code reporting.
I'm of the mindset that the manager layer code is the real brains of
Pulp. I view the REST API is just an implementation detail on top of it
and we may eventually support some different interface. So I treat the
managers are totally standalone, meaning all of my data validation is in
the managers themselves; the REST layer is an adapter between inbound
format and the call to the manager.
What I've been doing is using fine grained exceptions coming out of the
manager to describe, among other things, validation errors. For
instance, when copying packages from one repo to another, if either repo
doesn't exist, that's a validation check in the manager call.
Conceptually I think that makes sense and keeps the manager layer as
self-contained logic.
That also nicely translates to HTTP status codes. I catch certain
exceptions differently and translate them accordingly into 404s or 400s.
The problem I think I'm going to run into is that if the entire manager
call is wrapped into an asynchronous task by the REST controller layer,
I won't have access to those validation exceptions at the time I need to
complete the REST call. They'll happen in the task itself, long
(relatively speaking) after I've returned the HTTP request.
I'm curious if anyone has any ideas on how to handle it. I could split
out the validation checks in the managers into their own methods. So for
associate_from_repo, have a call pre_associate_from_repo that will test
the data and let me know if I shouldn't even bother calling the real
function. That just feels a bit dirty and annoying.
We could loosen up how RESTful we are and not honor those sorts of HTTP
status codes as much for asynchronous calls, but I think we're still in
the mindset of trying to be at least reasonably RESTful.
I suppose we could argue to have the REST controllers do validation on
their own outside of the managers before calling the functions, but that
doesn't buy us anything more than the pre_* methods I described above
and couples the managers to the REST controllers too much for my tastes.
Any thoughts?
--
Jay Dobies
Freenode: jdob @ #pulp
http://pulpproject.org | http://blog.pulpproject.org
More information about the Pulp-list
mailing list