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" <mpast...@redhat.com> >>>> To: "Vojtech Szocs" <vsz...@redhat.com> >>>> Cc: "engine-devel" <engine-devel@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@ovirt.org >>>>> http://lists.ovirt.org/mailman/listinfo/engine-devel >>>>> >>>> >>>> >>>> -- >>>> >>>> Michael Pasternak >>>> RedHat, ENG-Virtualization R&D >>>> >> >> > > -- Michael Pasternak RedHat, ENG-Virtualization R&D _______________________________________________ Engine-devel mailing list Engine-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-devel