[Engine-devel] REST API calls from

Michael Pasternak mpastern at redhat.com
Sun Feb 24 07:47:28 UTC 2013


On 02/24/2013 09:05 AM, Oved Ourfalli wrote:
> 
> 
> ----- Original Message -----
>> From: "Doron Fediuck" <dfediuck at redhat.com>
>> To: "Michael Pasternak" <mpastern at redhat.com>
>> Cc: engine-devel at ovirt.org, arch at ovirt.org
>> Sent: Thursday, February 21, 2013 6:54:59 PM
>> Subject: Re: [Engine-devel] REST API calls from
>>
>>
>>
>> ----- Original Message -----
>>> From: "Michael Pasternak" <mpastern at redhat.com>
>>> To: "Doron Fediuck" <dfediuck at redhat.com>
>>> Cc: engine-devel at ovirt.org, arch at ovirt.org
>>> Sent: Wednesday, February 20, 2013 2:56:59 PM
>>> Subject: Re: [Engine-devel] REST API calls from
>>>
>>> On 02/14/2013 11:20 AM, Doron Fediuck wrote:
>>>>
>>>>
>>>> ----- Original Message -----
>>>>> From: "Michael Pasternak" <mpastern at redhat.com>
>>>>> To: "Libor Spevak" <lspevak at redhat.com>
>>>>> Cc: engine-devel at ovirt.org, arch at ovirt.org
>>>>> Sent: Wednesday, February 13, 2013 12:55:36 PM
>>>>> Subject: Re: [Engine-devel] REST API calls from the GUI
>>>>>
>>>>>
>>>>> Hi Libor,
>>>>>
>>>>> This issue came across in one of the conversations i had with UX
>>>>> folks, but since we didn't end
>>>>> up with any conclusion/road map (nor discussed it properly to
>>>>> hear
>>>>> other thoughts), this is a perfect
>>>>> place to start this discussion,
>>>>>
>>>>> Intuitively REST is a way to go with GWT AJAX calls
>>>>> ---------------------------------------------------
>>>>>
>>>>> pros
>>>>> ====
>>>>>
>>>>> - api data objects can be reused by generating java classes
>>>>> (using
>>>>> jaxb) from the rest schema [1]
>>>>> - no backend logic will be duplicated as api abstracts the
>>>>> backend
>>>>> exposing RESTful collection/resources to operate on
>>>>> - development against api is "easy" as api describes itself in
>>>>> RSDL
>>>>> [2]
>>>>>
>>>>> cons
>>>>> ====
>>>>>
>>>>> - implementing transport layer (HTTP) under GWT
>>>>> - implementing own j2xml/json/yaml/... marshalling layer
>>>>> - implementing own error handling mechanism
>>>>> - implementing REST callback mechanism (in GWT)
>>>>> - constant maintenance of the data objects generated from the
>>>>> api
>>>>> - painful for Java developers
>>>>>
>>>>> Java-SDK
>>>>> --------
>>>>>
>>>>> pros
>>>>> ====
>>>>>
>>>>> - abstracts transport layer (leaving developer in standard Java
>>>>> api)
>>>>> - typesafe code (no need to mess with XML bulks)
>>>>> - has own data objects to work with
>>>>> - abstracts authentication/authorization
>>>>> (kerberos/cookie/session/etc.)
>>>>> - since SDK is auto-generated, it can be easily extended with
>>>>> required
>>>>>   features to support UI (such as callback infrastructure for
>>>>>   instance)
>>>>>
>>>>> cons
>>>>> ====
>>>>>
>>>>> - has to be converted in to Javascript (not sure what the
>>>>> impacts
>>>>> are
>>>>> in terms of AJAX calls/etc.)
>>>>> - probably much more cons that we're not aware of and will have
>>>>> to
>>>>> figure out with POC
>>>>>
>>>>>
>>>>> thoughts?
>>>>>
>>>>> [1] http[s]://server[:port]/api?schema
>>>>> [2] http[s]://server[:port]/api?rsdl
>>>>>
>>>>
>>>> Although started as a UI request, there are other needs who wish
>>>> to use API calls with a different transport. For example a
>>>> backend
>>>> hook which gets a REST entry point it can use to fetch for
>>>> additional
>>>> data, or perform actions. In this case I'd expect an internal
>>>> connection
>>>> rather than creating additional connections.
>>>> How would you resolve it generically enough in this context?
>>>
>>> Doron,
>>>
>>> I believe your approach a bit different, UX folks seeking for a
>>> convenient
>>> way of communicating with ovirt public api, e.g closing api<->GUI
>>> gap, and
>>> theirs alternatives where native HTTP layer or Java-SDK based
>>> framework,
>>> while what you need is in-process channel to communicate with the
>>> engine itself,
>>>
>>> i understanding your will of using stable api for this (RESTapi),
>>> but
>>> not
>>> sure that doing this via JavaSDK is a good way to go simply because
>>> SDK is
>>> designed to operate in a client-space, while what you need is a
>>> server-space
>>> bridge for that.
>>>
>>
>> Michael, true but...
>> Thinking about it differently both UI and hooks needs a client.
>> The underlying protocols should be abstracted. This is something
>> which will serve other functions as well.
>>
> 
> I'm not sure we would need a new abstraction here.
> Both UI plugins and engine plugins need some API to do basic operations, and have access to different properties in the engine.

+1, that's exactly what i've suggested to begin with.

> In the UI plguins implementation, we gave this API, and in addition created a REST session to be used in order to do more sophisticated operations.
> I think we should probably do the same for engine plugins, 
> giving the basic API, and giving a REST session for more advanced operations.
> The engine plugin may also have another 3rd party application it interacts with, and it would be able to share this session with it, 
> allowing it to perform different operations on the engine. It would obviously be easy to do that using the Java SDK in the engine side,
> without creating a new layer of abstraction.

true, but the thing is that java-sdk designed to work with rest-api, and what Doron is trying to do
is saving round-trip of engine->sdk->api->engine by enabling extra layer in sdk that will work not via HTTP,
but natively with RESTeasy (REST framework we using in api), the disadvantages of such design are:

1. working with java-sdk via JNI (walking out from container to client application - sdk)
2. hacking RESTeasy by:
   2.1 working with underlying (not public/backward compatible) interfaces & using JNI as well
   2.2 most likely maintaining code working with RESTeasy on every new (RESTeasy) release by reverse
       engineering new changes/behaviour of this framework
   2.3 making assumptions on code invocations to emulate GET/POST/PUT/DELETE HTTP calls
   2.4 still having round-trip engine->sdk->RESTeasy->engine

therefore i think that having own private API in engine for that is a much better solution.

> I assume the 3rd party application will use either the Java SDK, or another one, according the platform it is built upon, and in the "worst case", will interact directly with the API.
> 
> 
>>>>
>>>>> On 02/12/2013 06:13 PM, Libor Spevak wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I would like to ask, if there have been discussions about an
>>>>>> option
>>>>>> to call REST API services directly from the Frontend (GWT
>>>>>> layer)?
>>>>>> GWT compiles Java frontend-side to
>>>>>> Javascript, calls to backend services are performed
>>>>>> "transparently"
>>>>>> by the framework using AJAX support. But, there is still a need
>>>>>> to
>>>>>> have a special set of data objects
>>>>>> and the server-side logic can duplicate.
>>>>>>
>>>>>> Java REST API SDK enables to build "thick" client. The calls
>>>>>> are
>>>>>> realized using e.g. Apache HttClient and supported libraries. I
>>>>>> think the requirements of GWT can be a
>>>>>> little bit different, but something overlaps.
>>>>>>
>>>>>> I found several links about REST API support from GWT, so there
>>>>>> is
>>>>>> something for inspiration...
>>>>>>
>>>>>> - http://www.spiffyui.org/
>>>>>> - http://www.zackgrossbart.com/hackito/gwt-rest/
>>>>>> - http://code.google.com/p/gwt-rest/
>>>>>> - http://restygwt.fusesource.org/
>>>>>>
>>>>>> But, do you think it would be useful and what drawbacks can
>>>>>> occur
>>>>>> (authentication, authorization, response times, need to support
>>>>>> larger set of services, painful
>>>>>> refactoring, ...)?
>>>>>>
>>>>>> Regards,
>>>>>> Libor
>>>>>>
>> _______________________________________________
>> Engine-devel mailing list
>> Engine-devel at ovirt.org
>> http://lists.ovirt.org/mailman/listinfo/engine-devel
>>


-- 

Michael Pasternak
RedHat, ENG-Virtualization R&D



More information about the Engine-devel mailing list