On 11/29/2013 11:59 AM, Michael Pasternak wrote:
On 11/29/2013 11:45 AM, Michael Pasternak wrote:
> On 11/28/2013 09:22 PM, Vojtech Szocs wrote:
>>
>>
>> ----- Original Message -----
>>> From: "Michael Pasternak" <mpastern(a)redhat.com>
>>> To: "Vojtech Szocs" <vszocs(a)redhat.com>
>>> Cc: "engine-devel" <engine-devel(a)ovirt.org>
>>> Sent: Sunday, November 24, 2013 9:07:01 AM
>>> Subject: Re: [Engine-devel] Using REST API in web UI - review call summary
>>>
>>>
>>>
>>> Hi Vojtech,
>>>
>>> First of all it was a good "presentation" of requirements +
suggested
>>> solutions - well done!,
>>
>> Thank you :)
>>
>>> few comments/questions inline.
>>>
>>> On 11/21/2013 11:18 PM, Vojtech Szocs wrote:
>>>> Hi guys,
>>>>
>>>> this is a summary of yesterday's review call, I'll try to
highlight
>>>> important Q/A and things we agreed on.
>>>> Feel free to add anything in case I've missed something.
>>>>
>>>> --
>>>>
>>>> Q: Why don't we simply try to use existing Java SDK and adapt it for
GWT
>>>> apps? (asked by Michael & Gilad)
>>>>
>>>> A: This might be a viable option to consider if we wanted to skip
>>>> JavaScript-based SDK altogether and target Java/GWT code
>>>> directly; we could simply take Java SDK and customize its abstractions
>>>> where necessary, i.e. using HTTP transport layer
>>>> implementation that works with GWT. In any case, this would mean
coupling
>>>> ourselves to Java SDK (which has its own release cycle)
>>>> and I think this would complicate things for us.
>>>
>>> not sure i buy this one :), this is the purpose of any sdk, including the
>>> one you about to write, people that will use it, will be "coupling"
to it ...
>>
>> Of course, but by saying "coupling ourselves to Java SDK" I meant SDK
perspective, not client perspective:
>
> of course, but you told something different, that you want js-sdk to be aware
> of the client, and this is actually why you taking this path.
>
>>
>> - someone else (you) maintains Java SDK and therefore controls generated sources
(JAR or RPM isn't relevant here)
>> - another guy (me) maintains (fictional) Java/GWT SDK that relies on Java SDK +
some (supported) customizations
>> - the only way I can impose changes in my SDK is through supported customizations
as you control original (Java SDK) sources,
>> i.e. the whole code generation process is driven by your SDK, so my SDK is
coupled to your SDK's build/release cycle
>
> that's how things working in software, you always depending on the certain
version
> of the component you're working against, as it expose set of features you need, i
don't
> think that having control over framework features, justifying rewriting the
> framework ...
>
> (please note that i'm not against the js-sdk, go ahead, this is a nice initiative
indeed, i
> just can't see the business case for not reusing existent infrastructure cause it
works
> for all your needs and eventually both worlds would benefiting from it UI and
java-sdk users
> cause you where extending it with additional capabilities they may also need)
>
>>
>> For the sake of simplicity, I guess it's best to start with SDK that has no
dependencies whatsoever.
>
> so why won't you rewrite the engine in Java-script? your js-sdk eventually will
be depending on it,
> this way you'll have control over it (and it's features) as well ;-)
>
>> After all, there's no common dependency (aside from running Engine to provide
XSD & RSDL) between Java & Python SDK too, if I understand correctly.
>>
>> In other words, building on top of something existing (just because we can do
that) isn't always appropriate/flexible/efficient, it always depends on given context
and requirements.
>
> it would be true, if your requirements would make existing infrastructure
inappropriate.
>
>>
>>>
>>>>
>>>> As proposed on the meeting, I think it's best to aim for JavaScript
SDK as
>>>> the lowest
>>>> common denominator for *any* web application that wants to work with
REST
>>>> API. oVirt GWT-based
>>>> UI can simply bind to JavaScript SDK, i.e. Java/GWT code that just
overlays
>>>> objects and functions
>>>> provided by JavaScript SDK. Another reason is ease of maintenance -
I'd
>>>> rather see JavaScript SDK's code
>>>> generation process to be independent of any other SDK (people
responsible
>>>> for maintaining JavaScript SDK
>>>> should have full control over generated code).
>>>
>>> what do you mean by "people should have full control over generated
code"?
>>
>> It's related to "coupling from SDK perspective" I mentioned above:
>> "the only way I can impose changes in my SDK is through supported
customizations as you control original (Java SDK) sources"
>
> if you need additional functionality in java-sdk, you could do the following:
>
> 1. submit a patch to java-sdk
> 2. build new java-sdk locally and use it along with new feature you've added
> 3. make UI depending on next version of java-sdk (which includes your new feature)
>
> we (and all other SW projects) doing that day by day in engine,api,etc.
>
> (as i mentioned this would also benefit java-sdk users with additional features
> they might find useful as well)
>
>>
>> (by "people" I meant "JavaScript SDK developers")
>>
>> Full control means ability to change generated sources in whatever way desired,
but assuming the idea of reusing/customizing existing SDK code, aspect of full control is
lost in favor of reusing existing code.
>
> i disagree on this one, you have all control you need over java-sdk at any time
> as it one of indoor projects.
>
>> And of course, this assumes that existing code (Java SDK) provides everything we
need, which might or might not be the case.
>>
>> So I just vote for simplicity, generate JavaScript SDK the way like other SDKs
(Java/Python) - not trying to reuse anything, just grab XSD & RSDL and generate
sources.
>>
>>> the purpose of
>>> code generation is to ease maintenance, i.e you/maintainer should not write
>>> the feature
>>> once it available in api, just run CodeGen and you'll get it for free,
but
>>> this is zero control
>>> over code.
>>
>> +1
>>
>> I agree with you on this.
>>
>>>
>>>>
>>>> --
>>>>
>>>> Q: What about functionality currently used by oVirt UI but not supported
by
>>>> REST API? (asked by Einav)
>>>> [For example, fetching VM entity over GWT RPC also returns related
data
>>>> such as Cluster name.]
>>>>
>>>> A: Based on discussion I've had with other colleagues after
yesterday's
>>>> review call, I don't think that
>>>> separate support-like backend layer is a good idea. Instead, this is the
>>>> kind of functionality that could be
>>>> placed in oVirt.js library. Logical operations like "get VMs and
related
>>>> data" would be exposed through oVirt.js
>>>> (callback-based) API and ultimately realized as multiple physical
requests
>>>> to REST API via JavaScript Binding.
>>>>
>>>> oVirt.js client would be completely oblivious to the fact that multiple
>>>> physical requests are dispatched. In fact,
>>>> since HTTP communication is asynchronous in nature, oVirt.js client
>>>> wouldn't even notice any difference in terms of API
>>>> consumption. This assumes JavaScript SDK would use callback-based
>>>> (non-blocking) API instead of blocking one - after all,
>>>> blocking API on top of non-blocking implementation sounds pretty much
like
>>>> leaky abstraction [1].
>>>>
>>>> For example:
>>>>
>>>> sdk.getVmsWithExtraData(
>>>> callbackToGetExtraDataForGivenVm, // might cause extra physical
>>>> requests to REST API
>>>> callbackFiredWhenAllDataIsReady // update client only when all
>>>> data is ready
>>>> )
>>>
>>> actually this the main bottleneck in moving UI to work on top of REST, and
>>> most interesting/complex part of this project,
>>
>> Agreed, it's because UI "got used to" using internal backend
interface concepts (actions, queries etc.) in the first place.. So we'll have to
emulate what we used to use to prevent regressions, maybe improve/refactor in future.
>>
>>>
>>> you should think of very wise polling mechanism cause callbacks is a nice
>>> thing on paper, but behind the scene it all about polling:
>>>
>>> - the entity/s till action got accomplished
>>> - add to this updating different grids
>>> - running multiple actions
>>> - showing events
>>> - and obviously much more
>>
>> IMHO polling is just a workaround and indicates lack of proper notification
solution.
>>
>> Apparently, oVirt web UI isn't some CLI program for which HTTP
request/response style is sufficient. oVirt web UI is dynamic, interactive web application
that displays/updates data in real time. This is, in my opinion, quite a big difference.
>>
>> I don't think callbacks are just a nice thing on paper. Callbacks are needed
because the underlying communcation is async in nature:
>
> Vojtech, you've got all wrong, i told that you *do need* callbacks,
> but implementing them only sounds easy, while actually it will be
> a quite complicated task.
>
>>
>> - caller invokes API function and provides callback to execute when operation
completes -> API is non-blocking
>> - polling attempts to detect change (i.e. operation completed) and notify the
caller, so it's also some sort of callback -> this is more complicated compared to
simple callback
>>
>>>
>>> and don't forget that every polled entity should be marshalled from xml
to
>>> the javascript
>>> entity so at the end, "callbacks" mechanism will be extremely CPU
consuming.
>>
>> First of all, I don't understand how callback mechanism can be CPU consuming,
can you please provide some explanation or use case?
>
> of course, you'll have to do per call-back call:
s/"call-back call"/"polling request", e.g:
1 polling task == N * (#1+#2+#3)
[where N is amount of requests you need to perform till desired state is achieved]
i have a solution for this!, will get back to you/publish it when i have a mature design.
>
> 1. request/response to the server
> 2. decompression of data from gzip
> 3. object mapping (in 99% of cases)
>
>
> note you'll have a lot of callback consumers that monitoring resource state,
waiting for new events.
>
>
>>
>> Does Java SDK provide ability to poll Engine in order to get recent updates, and
if yes, why?
>
> i was kinda hoping that you'll add it, but you've chosen to write your own
sdk ;-)
>
>>
>> Finally, polling makes things stateful, whereas SDK code should be stateless
instead. If client wants to get recent updates, it should just use (stateless) SDK code to
achieve this goal.
>
> sdk cannot be stateful by definition simply because server is stateless,
> (also pooling != keeping state, being stateful means that you save data
> for request on server side)
>
>>
>>>
>>>>
>>>> [1]
http://en.wikipedia.org/wiki/Leaky_abstraction
>>>>
>>>> --
>>>>
>>>> Last but not least, where to maintain JavaScript SDK projects: low-level
>>>> JavaScript Binding + high-level oVirt.js library.
>>>>
>>>> I agree that conceptually both above mentioned projects should go into
>>>> dedicated "ovirt-engine-sdk-js" git repository and
>>>> have their own build/release process. However, for now, we're just
making
>>>> baby steps so let's keep things simple and prototype
>>>> these projects as part of "ovirt-engine" git repository.
>>>>
>>>> ... we can complicate things anytime, but we should know that any
complex
>>>> system that works has inevitably evolved from simple
>>>> system that works ... (quote from
>>>>
http://en.wikipedia.org/wiki/Gall%27s_law)
>>>>
>>>> Regards,
>>>> Vojtech
>>>> _______________________________________________
>>>> Engine-devel mailing list
>>>> Engine-devel(a)ovirt.org
>>>>
http://lists.ovirt.org/mailman/listinfo/engine-devel
>>>>
>>>
>>>
>>> --
>>>
>>> Michael Pasternak
>>> RedHat, ENG-Virtualization R&D
>>>
>
>
--
Michael Pasternak
RedHat, ENG-Virtualization R&D