Hi Arvind,

what you suggest is a little more change than I think we need right now;
in particular, there's no reason for us to switch to Rails - Sinatra has
and is serving us well.

VersionCake is a terrible idea for a RESTful API - and the sort of
version negotiation that he suggests through headers is completely the
wrong way to go. See [1] for more info.

As for auth, Deltacloud doesn't handle authorization at all, by design.
It simply passes credentials through to the backend cloud.

David

[1] http://www.watzmann.net/blog/2012/08/rest-api-evolution.html

On Tue, 2013-04-09 at 21:11 +0530, Arvind Creatrix IT Soft wrote:
> Hi
> 
> With ref to the discussion- I was already planning to work on creating an API 
> over the core Delta Cloud code as I need it in a number of my projects.
> 
> I suggest the following means to do this, in as painless a manner as 
> possible--
> 
> (1) Use Rails and RABL--> https://github.com/nesquena/rabl to generate the API
> (2) Use the VersionCake gem for versioning( 
> https://github.com/bwillis/versioncake) 
> (3) Controllers are set up in an hierarchy where you have one BaseController 
> which contains this authentication logic (as a before_filter) and then the 
> other controllers inherit from that. If you have any other helpers, they 
> would go in this controller too. 
> (4) For authorization, use CanCan.(https://github.com/ryanb/cancan)  It's 
> README and Wiki are great sources of information on how to use it. 
> 
> Finally, here is some helpful text from the RABL docs-->
> 
> Once you have installed RABL (explained above), you can construct a RABL view 
> template and then render the template from your Sinatra, Padrino or Rails 
> applications from the controller (or route) very easily. Using Padrino as an 
> example, assuming you have aPost model filled with blog posts, you can render 
> an API representation (both JSON and XML) by creating a route:
> 
> # app/app.rb
> get "/posts", :provides => [:json, :xml] do
>   @user = current_user
>   @posts = Post.order("id DESC")
>   render "posts/index"
> end
> Then we can create the following RABL template to express the API output of 
> @posts:
> 
> # app/views/posts/index.rabl
> collection @posts
> attributes :id, :title, :subject
> child(:user) { attributes :full_name }
> node(:read) { |post| post.read_by?(@user) }
> Which would output the following JSON or XML when visiting 
> http://localhost:3000/posts.json
> 
> [{  "post" :
>   {
>     "id" : 5, title: "...", subject: "...",
>     "user" : { full_name : "..." },
>     "read" : true
>   }
> }]
> This is an easy way to create a API library that has its own versioning- and 
> at the same time it basically just uses the core code in the Delta Cloud 
> library itself.
> 
> Yours sincerely,
> Arvind,
> Creatrix IT Soft.
> -----Original Message----- 
> From: Jozef Zigmund 
> Sent: Tuesday, April 9, 2013 7:28 PM 
> To: dev@deltacloud.apache.org 
> Cc: Martin Povolny ; aeolus-devel 
> Subject: Re: deltacloud as a lib and broker 
> 
> On Mon, 2013-04-08 at 16:45 -0700, David Lutterkort wrote:
> > On Mon, 2013-04-08 at 14:44 +0200, Jan Provaznik wrote:
> > > > There are some other downsides to using DC in process (as a library): it
> > > > also significantly changes where DC can go architecturally. So far, the
> > > > classic DC API has worked very hard to be stateless - CIMI isn't, and it
> > > > wouldn't be unreasonable to introduce state into the classic DC API.
> > > > That would be much more awkward if DC becomes a library.
> > > >
> > > 
> > > I'm not familiar with DC plans (which sound really interesting) but even 
> > > with stateful DC the lib could make sense:
> > > 1) the DC lib - can be used by anyone who doesn't need any stateful 
> > > feature
> > > 2) DC/CIMI stateful service - built *on top* of the lib, wraps the lib 
> > > with REST API, adds stateful features
> > 
> > I think this is the right way to slice things up: make the DC service(s)
> > wrappers around the DC library. The library essentially deals with
> > adapting the internal driver API to something stable, and probably will
> > make the API look a little more Rubyish. For example, right now code to
> > start and stop an instance would look something like
> > 
> >         dc = Deltacloud::new(some_backend, some_provider, credentials)
> >         inst = dc.create_instance(...)
> >         unless starts_automatically(dc)  # needs to look at
> >         instance_states
> >           wait_for_state(dc, inst, "STOPPED")
> >           dc.start_instance(credentials, inst.id)
> >         end
> >         wait_for_state(dc, inst, "STARTED")
> >         .. do stuff with your running instance ..
> >         dc.stop_instance(dc, inst)
> >         
> > As you can see, the above isn't very Rubyish; it would be nicer to write
> > 
> >         dc = Deltacloud::new(some_backend, some_provider, credentials)
> >         inst = dc.create_instance(...)
> >         if inst.initial_state == 'STOPPED'
> >           inst.poll_for { |inst| inst.stopped? }
> >           inst.start
> >         end
> >         inst.poll_for { |inst| inst.started? }
> >         .. do stuff with your running instance ..
> >         inst.stop
> > 
> > What I am mostly after is a feel for who's going to do the following
> > around a DC library:
> > 
> >       * Come up with a library API that is safe to use - that includes
> >         keeping the API stable and making sure we only expose reasonable
> >         parts of the driver API. We don't want an automatic "It's in the
> >         drivers, therefore it's part of the API"
> >       * Write enough tests to convince us that the library API still
> >         works
> >       * Document that API
> > 
> > Ok .. who's raising their hand ? ;)
> > 
> 
> I'm in to help with it.
> 
> > David
> > 
> > 
> 


Reply via email to