<div dir="ltr"><div>I feel like every REST API I&#39;ve ever worked with has had the aggregation + projection problem. It&#39;s like we&#39;re trying to use REST as a replacement for SQL -- but the logic that executes the &quot;SQL&quot; lives in a browser now, and it used to live on a server close to the DB. And REST isn&#39;t expressive for selecting data like SQL is.<br></div><div><br></div><div>There must be some industry solution to this &quot;I want to do SQL over REST&quot; problem.</div><div><br></div><div class="gmail_extra"><div class="gmail_quote">On Fri, Mar 24, 2017 at 5:54 AM, Martin Sivak <span dir="ltr">&lt;<a href="mailto:msivak@redhat.com" target="_blank">msivak@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">&gt; for quite some time I have been more or less involved in development of<br>
&gt; various UIs for oVirt based entirely on the oVirt&#39;s REST API ranging from<br>
&gt; the quite mature moVirt [1] through some cockpit extensions to a young and<br>
&gt; experimental user portal replacement [2].<br>
<br>
</span>oVirt optimizer has the same issue..<br>
<span class=""><br>
&gt; 2: add some tiny service which would just accept a list of queries, execute<br>
&gt; them locally (but using real HTTP requests) and return in one bulk. A naive<br>
&gt; implementation just to give a sense of what I mean of this would be a shell<br>
&gt; script getting list of strings like<br>
&gt; &quot;<a href="https://localhost/ovirt-engine/api/vms/123/sessions" rel="noreferrer" target="_blank">https://localhost/ovirt-<wbr>engine/api/vms/123/sessions</a>&quot; iterate over them and<br>
&gt; do a curl request for each, mangle the results into one string and return<br>
&gt; (credits for this idea to msivak). Easy to implement, possibility to add<br>
&gt; also projections later to save some bandwidth. But the API would anyway be<br>
&gt; hammered by bunch of queries, only the network roundtrip would be saved.<br>
<br>
</span>The biggest cost for (especially mobile) clients is the cost of<br>
establishing new SSL connection. SSL is also pretty expensive on the<br>
server side.<br>
<br>
So running the aggregation service on the ovirt-engine machine (behind<br>
Apache) means the client will do a single SSL request with list of N<br>
urls and the local &quot;reverse-proxy&quot; will perform single authentication<br>
and N plain HTTP requests (or even better - AJP). It won&#39;t remove any<br>
time from the actual command run time, but it will reduce protocol<br>
overhead.<br>
<br>
I think this is the simplest first step that requires almost no change<br>
to existing infrastructure.<br>
<br>
--<br>
Martin Sivak<br>
SLA / oVirt<br>
<div><div class="h5"><br>
On Fri, Mar 24, 2017 at 10:20 AM, Tomas Jelinek &lt;<a href="mailto:tjelinek@redhat.com">tjelinek@redhat.com</a>&gt; wrote:<br>
&gt; Hi All,<br>
&gt;<br>
&gt; for quite some time I have been more or less involved in development of<br>
&gt; various UIs for oVirt based entirely on the oVirt&#39;s REST API ranging from<br>
&gt; the quite mature moVirt [1] through some cockpit extensions to a young and<br>
&gt; experimental user portal replacement [2].<br>
&gt;<br>
&gt; One issue we hit over and over again is the missing data aggregation. In the<br>
&gt; 3.x era we used to use in moVirt the detail=something<br>
&gt; api to get the disks and nics of the VM, something like:<br>
&gt;<br>
&gt; GET /ovirt-engine/api/vms<br>
&gt; Accept: application/json; detail=disks<br>
&gt;<br>
&gt; This allowed us to store this data in local database leading to great user<br>
&gt; experience. Since this feature has been removed in 4.x API [3]<br>
&gt; we needed to retire to a different solution. When the VM detail is selected<br>
&gt; by the user, start loading the disks and nics and hope the user<br>
&gt; will not be fast enough to see the delay. The UX is slightly worse bug kinda<br>
&gt; acceptable.<br>
&gt;<br>
&gt; We hit this issue harder in the new user portal [2], because we already have<br>
&gt; the VM cached and show the whole VM in one screen. So, if you pick it, you<br>
&gt; will get it&#39;s details immediately.<br>
&gt; But, since you don&#39;t have all the details, we need to do an additional call<br>
&gt; (two actually) to load this data and they start to appear later.<br>
&gt; So, something which would be very fast and smooth starts to feel sluggish.<br>
&gt;<br>
&gt; Recently, we hit this issue again which forced us to sacrifice the UX even<br>
&gt; more - it is the &quot;console in use&quot; feature of user portal.<br>
&gt; The use case is this:<br>
&gt; - if the console is already taken by some user, there are complications if<br>
&gt; other current user tryes to take it as well (will avoid details about<br>
&gt; settings and permissins involved, but long story short, the user will<br>
&gt; probably not be allowed to connect to it. The &quot;probably&quot; is the key here<br>
&gt; since we can not do any intelligent decision in advance, we can only warn<br>
&gt; the user that the console is taken).<br>
&gt; - in the current GWT user portal, if the VM&#39;s console is taken, it is shown<br>
&gt; on the VM&#39;s &quot;box&quot; that &quot;console is taken&quot;. This was a highly requested<br>
&gt; feature<br>
&gt; - to get this information using the current REST API, we need to go to the<br>
&gt; /vms/&lt;vmid&gt;/sessions subcollection. To get this for all VMs, it would be<br>
&gt; doing N queries per poll which we can not afford<br>
&gt; - so the current PR [4] will probably end up to only check it on the attempt<br>
&gt; to connect to the console warning the user. Maybe it will be also shown in<br>
&gt; Vm details. But the UX in case the user will look for a VM which has free<br>
&gt; console will suffer significantly (e.g. try one by one until some opens or<br>
&gt; look at details one by one to see if the warning appears (with a delay))<br>
&gt;<br>
&gt; I understand that embedding the details of the VM to the response comes with<br>
&gt; a cost, namely:<br>
&gt; - performance hit<br>
&gt; - complexity of the API code<br>
&gt; - the &quot;cleanness&quot; of REST suffers<br>
&gt;<br>
&gt; But I think we should seriously consider to provide some option to data<br>
&gt; aggregation.<br>
&gt;<br>
&gt; I know this has been discussed many times with no result, but I think it is<br>
&gt; time to bring this topic up again. I&#39;ll try to summarize the (failed)<br>
&gt; attempts tried so far:<br>
&gt; - the detail=&lt;something&gt; parameter with ad-hoc embedding of data. This has<br>
&gt; been there and removed in 4.0 [3]<br>
&gt; - the DoctorREST project - e.g. a proxy above the current api. The idea was<br>
&gt; to create a service which will be independent of the engine itself, will<br>
&gt; locally poll the engine&#39;s REST, store all data in local (mongo)DB and<br>
&gt; provide a rich api with aggregations and projections and push notifications.<br>
&gt; This polling of everything to get the data to DoctorREST proved to be pretty<br>
&gt; costy, so also a more invasive approach of pushing data from engine to<br>
&gt; doctor has been discused [5]. None of this two approaches have been accepted<br>
&gt; (too complicated, too invasive).<br>
&gt; - writing some custom ad-hoc servlet serving only a purpose of one frontend<br>
&gt; - this is actually there for the dashboard, but it is not a generic solution<br>
&gt; for the other frontends and we really should not develop custom &quot;APIs&quot; for<br>
&gt; every frontend<br>
&gt; - there were some other proposals discussed (some 3th party solutions etc)<br>
&gt; but I think none of them made it even to a PoC<br>
&gt;<br>
&gt; So, now I would try again and try small to get at least some benefit. I see<br>
&gt; 2 paths we could try:<br>
&gt; 1: embed something which burns us immediatly, e.g. the /sessions into VMs. I<br>
&gt; really liked the ;detail=sessions approach, could we move it back?<br>
&gt; 2: add some tiny service which would just accept a list of queries, execute<br>
&gt; them locally (but using real HTTP requests) and return in one bulk. A naive<br>
&gt; implementation just to give a sense of what I mean of this would be a shell<br>
&gt; script getting list of strings like<br>
&gt; &quot;<a href="https://localhost/ovirt-engine/api/vms/123/sessions" rel="noreferrer" target="_blank">https://localhost/ovirt-<wbr>engine/api/vms/123/sessions</a>&quot; iterate over them and<br>
&gt; do a curl request for each, mangle the results into one string and return<br>
&gt; (credits for this idea to msivak). Easy to implement, possibility to add<br>
&gt; also projections later to save some bandwidth. But the API would anyway be<br>
&gt; hammered by bunch of queries, only the network roundtrip would be saved.<br>
&gt; 3: any other simple approaches?<br>
&gt;<br>
&gt; I honestly prefer the first approach. It is not beautiful, it is not<br>
&gt; REST-ful, but it is easy to implement, very pragmatic and useful.<br>
&gt; What do you think?<br>
&gt;<br>
&gt; Thank you and sorry for the long mail :)<br>
&gt; Tomas<br>
&gt;<br>
&gt; [1]: <a href="https://github.com/oVirt/moVirt" rel="noreferrer" target="_blank">https://github.com/oVirt/<wbr>moVirt</a><br>
&gt; [2]: <a href="https://github.com/oVirt/ovirt-web-ui" rel="noreferrer" target="_blank">https://github.com/oVirt/<wbr>ovirt-web-ui</a><br>
&gt; [3]: <a href="https://gerrit.ovirt.org/#/c/61260" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/<wbr>61260</a><br>
&gt; [4]: <a href="https://github.com/oVirt/ovirt-web-ui/pull/106/" rel="noreferrer" target="_blank">https://github.com/oVirt/<wbr>ovirt-web-ui/pull/106/</a><br>
&gt; [5]: <a href="https://gerrit.ovirt.org/#/c/45233/" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/<wbr>45233/</a><br>
&gt;<br>
&gt;<br>
</div></div>&gt; ______________________________<wbr>_________________<br>
&gt; Devel mailing list<br>
&gt; <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt; <a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/<wbr>mailman/listinfo/devel</a><br>
______________________________<wbr>_________________<br>
Devel mailing list<br>
<a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
<a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/<wbr>mailman/listinfo/devel</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Greg Sheremeta, MBA<br>Red Hat, Inc.<br>Sr. Software Engineer<br><a href="mailto:gshereme@redhat.com" target="_blank">gshereme@redhat.com</a><br></div></div></div>
</div></div>