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: 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