<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Nov 25, 2015 at 6:32 PM, Martin Betak <span dir="ltr">&lt;<a href="mailto:mbetak@redhat.com" target="_blank">mbetak@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=""><br>
<br>
<br>
<br>
----- Original Message -----<br>
&gt; From: &quot;Marek Libra&quot; &lt;<a href="mailto:mlibra@redhat.com">mlibra@redhat.com</a>&gt;<br>
&gt; To: &quot;Martin Perina&quot; &lt;<a href="mailto:mperina@redhat.com">mperina@redhat.com</a>&gt;<br>
&gt; Cc: &quot;Piotr Kliczewski&quot; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;Michal Skrivanek&quot; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;, &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot;<br>
&gt; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;<br>
</span><div><div class="h5">&gt; Sent: Wednesday, November 25, 2015 5:19:31 PM<br>
&gt; Subject: Re: [ovirt-devel] Push notifications in 4.0 backend<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ----- Original Message -----<br>
&gt; &gt; From: &quot;Martin Perina&quot; &lt;<a href="mailto:mperina@redhat.com">mperina@redhat.com</a>&gt;<br>
&gt; &gt; To: &quot;Eli Mesika&quot; &lt;<a href="mailto:emesika@redhat.com">emesika@redhat.com</a>&gt;<br>
&gt; &gt; Cc: &quot;Piotr Kliczewski&quot; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot;<br>
&gt; &gt; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;, &quot;Michal Skrivanek&quot;<br>
&gt; &gt; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;<br>
&gt; &gt; Sent: Wednesday, 25 November, 2015 11:20:49 AM<br>
&gt; &gt; Subject: Re: [ovirt-devel] Push notifications in 4.0 backend<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; From: &quot;Eli Mesika&quot; &lt;<a href="mailto:emesika@redhat.com">emesika@redhat.com</a>&gt;<br>
&gt; &gt; &gt; To: &quot;Vojtech Szocs&quot; &lt;<a href="mailto:vszocs@redhat.com">vszocs@redhat.com</a>&gt;<br>
&gt; &gt; &gt; Cc: &quot;Piotr Kliczewski&quot; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;Michal Skrivanek&quot;<br>
&gt; &gt; &gt; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;, &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot;<br>
&gt; &gt; &gt; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;<br>
&gt; &gt; &gt; Sent: Wednesday, November 25, 2015 10:42:35 AM<br>
&gt; &gt; &gt; Subject: Re: [ovirt-devel] Push notifications in 4.0 backend<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; From: &quot;Vojtech Szocs&quot; &lt;<a href="mailto:vszocs@redhat.com">vszocs@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; To: &quot;Martin Betak&quot; &lt;<a href="mailto:mbetak@redhat.com">mbetak@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; Cc: &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;, &quot;Piotr Kliczewski&quot;<br>
&gt; &gt; &gt; &gt; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;Michal Skrivanek&quot;<br>
&gt; &gt; &gt; &gt; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; Sent: Monday, November 23, 2015 6:22:45 PM<br>
&gt; &gt; &gt; &gt; Subject: Re: [ovirt-devel] Push notifications in 4.0 backend<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; From: &quot;Martin Betak&quot; &lt;<a href="mailto:mbetak@redhat.com">mbetak@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; To: &quot;Vojtech Szocs&quot; &lt;<a href="mailto:vszocs@redhat.com">vszocs@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; Cc: &quot;Einav Cohen&quot; &lt;<a href="mailto:ecohen@redhat.com">ecohen@redhat.com</a>&gt;, &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;, &quot;Roy Golan&quot; &lt;<a href="mailto:rgolan@redhat.com">rgolan@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Roman Mohr&quot; &lt;<a href="mailto:rmohr@redhat.com">rmohr@redhat.com</a>&gt;, &quot;Michal Skrivanek&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Piotr Kliczewski&quot; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Tomas Jelinek&quot; &lt;<a href="mailto:tjelinek@redhat.com">tjelinek@redhat.com</a>&gt;, &quot;Alexander Wels&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:awels@redhat.com">awels@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Greg Sheremeta&quot; &lt;<a href="mailto:gshereme@redhat.com">gshereme@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Scott Dickerson&quot; &lt;<a href="mailto:sdickers@redhat.com">sdickers@redhat.com</a>&gt;, &quot;Arik Hadas&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:ahadas@redhat.com">ahadas@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Allon Mureinik&quot; &lt;<a href="mailto:amureini@redhat.com">amureini@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &quot;Shmuel Melamud&quot; &lt;<a href="mailto:smelamud@redhat.com">smelamud@redhat.com</a>&gt;, &quot;Jakub Niedermertl&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:jniederm@redhat.com">jniederm@redhat.com</a>&gt;, &quot;Marek Libra&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:mlibra@redhat.com">mlibra@redhat.com</a>&gt;, &quot;Martin Perina&quot; &lt;<a href="mailto:mperina@redhat.com">mperina@redhat.com</a>&gt;, &quot;Alona<br>
&gt; &gt; &gt; &gt; &gt; Kaplan&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:alkaplan@redhat.com">alkaplan@redhat.com</a>&gt;, &quot;Martin Mucha&quot;<br>
&gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:mmucha@redhat.com">mmucha@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; Sent: Thursday, November 19, 2015 1:53:07 PM<br>
&gt; &gt; &gt; &gt; &gt; Subject: Re: Push notifications in 4.0 backend<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Hi All,<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; I have created a PoC patch [1] demonstrating the idea of annotating<br>
&gt; &gt; &gt; &gt; &gt; basic CRUD commands to publish CDI events. It is not meant as 100%<br>
&gt; &gt; &gt; &gt; &gt; solution, but as a simplification of the common use cases when<br>
&gt; &gt; &gt; &gt; &gt; one would inject CDI event with given qualifier and fire it after<br>
&gt; &gt; &gt; &gt; &gt; successful completion of transaction.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; The patches (mentioned below) look interesting.<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; At this point, it would be great if backend core maintainers<br>
&gt; &gt; &gt; &gt; voiced their opinions on the general idea of firing CDI events<br>
&gt; &gt; &gt; &gt; in response to important actions happening on Engine, such as<br>
&gt; &gt; &gt; &gt; backend commands being executed. So, what do you think guys?<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; +1<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I am for it, I think it may reduce load from our DB<br>
&gt; &gt;<br>
&gt; &gt; +1<br>
&gt; &gt;<br>
&gt; The load reduction can be achieved and seems like not a big deal to implement<br>
&gt; it.<br>
&gt; +1<br>
<br>
</div></div>Yes, the DB load reduction is perhaps the bigest boon of this effort :-).<br></blockquote><div><br></div><div>This needs to be quantified.</div><div><br></div><div>As always, we need a cost-risk-benefit evaluation of a change, especially for infra changes, since:</div><div>1. Infra changes are more likely to affect cross-teams, multiple features, so the potential &#39;damage&#39; to existing flows is not limited as in specific feature changes.</div><div>2. If they are beneficial, we&#39;ll want/need more flows to be modified - which adds more cost and risk (and hopefully, benefit!). If few flows aren&#39;t changed, there&#39;s usually little value in making the change in the first place. If only few flows are changed, unless they are critical, no point in pushing the infra change too soon. </div><div><br></div><div>The events mechanism in VDSM&lt;-&gt;engine is an example of a change that meets this - and we haven&#39;t yet executed on item #2 above for it - not many flows use it. </div><div>Mainly for risk and cost factors, as we do believe there is benefit in it.</div><div><br></div><div>Of course, such an effort has to be coordinated with the Infra team.</div><div>Y.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
My first patch makes very convenient to fire notification from basic CRUD management<br>
operations that manipulate main business entities. The next (and probably more<br>
complicated) step will be a refactoring of the monitoring code to support CDI<br>
(injections and events) and have it fire events of VmDynamic payload. Then on<br>
the event we can have listening scheduler (balancing), HA, ... and other parts<br>
that not only won&#39;t have to issue expensive DB queries (e.g. GetVmsRunningOnVds)<br>
but also can be more decoupled from monitoring (e.g. VdsEventListener).<br>
<br>
But this will be a little bit more involved than just annotating all CRUD commands<br>
with one annotation :-)<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; The usage of this annotations is demonstrated on several basic CRUD<br>
&gt; &gt; &gt; &gt; &gt; commands in [2] on StoragePool, VDS, VDSGroup, .etc<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; As always, comments and suggestions are very welcome!<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Thank you and best regards,<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; Martin<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; [1] infra: <a href="https://gerrit.ovirt.org/#/c/48696/" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/48696/</a><br>
&gt; &gt; &gt; &gt; &gt; [2] usage: <a href="https://gerrit.ovirt.org/#/c/48697/" rel="noreferrer" target="_blank">https://gerrit.ovirt.org/#/c/48697/</a><br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; &gt; From: &quot;Vojtech Szocs&quot; &lt;<a href="mailto:vszocs@redhat.com">vszocs@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; To: &quot;Martin Betak&quot; &lt;<a href="mailto:mbetak@redhat.com">mbetak@redhat.com</a>&gt;, &quot;Einav Cohen&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:ecohen@redhat.com">ecohen@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Cc: &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;, &quot;Roy Golan&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:rgolan@redhat.com">rgolan@redhat.com</a>&gt;, &quot;Roman Mohr&quot; &lt;<a href="mailto:rmohr@redhat.com">rmohr@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &quot;Michal Skrivanek&quot; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;, &quot;Piotr Kliczewski&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;Tomas Jelinek&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:tjelinek@redhat.com">tjelinek@redhat.com</a>&gt;, &quot;Alexander Wels&quot; &lt;<a href="mailto:awels@redhat.com">awels@redhat.com</a>&gt;, &quot;Greg<br>
&gt; &gt; &gt; &gt; &gt; &gt; Sheremeta&quot; &lt;<a href="mailto:gshereme@redhat.com">gshereme@redhat.com</a>&gt;, &quot;Scott<br>
&gt; &gt; &gt; &gt; &gt; &gt; Dickerson&quot; &lt;<a href="mailto:sdickers@redhat.com">sdickers@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Sent: Friday, November 13, 2015 9:31:45 PM<br>
&gt; &gt; &gt; &gt; &gt; &gt; Subject: Re: Push notifications in 4.0 backend<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Hi everyone,<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; assuming that 4.0 UI will be based on the existing GWT technology,<br>
&gt; &gt; &gt; &gt; &gt; &gt; I&#39;d like to improve two things which I believe are very important:<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; #1 goal: improve GWT compilation times<br>
&gt; &gt; &gt; &gt; &gt; &gt;    - don&#39;t use standard GWT i18n mechanism which yields separate<br>
&gt; &gt; &gt; &gt; &gt; &gt;      permutation vector, but use our own i18n mechanism instead<br>
&gt; &gt; &gt; &gt; &gt; &gt;    - in practice, compiling for X browsers and Y languages should<br>
&gt; &gt; &gt; &gt; &gt; &gt;      result in GWT compiler processing X permutations (not X * Y)<br>
&gt; &gt; &gt; &gt; &gt; &gt;    - this will also directly impact GWT debug performance, making<br>
&gt; &gt; &gt; &gt; &gt; &gt;      GWT debugging experience less painful for developers<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; #2 goal: improve UX related to backend operations<br>
&gt; &gt; &gt; &gt; &gt; &gt;    - replace periodic polling with push notifications that inform<br>
&gt; &gt; &gt; &gt; &gt; &gt;      UI of changes in oVirt &quot;system&quot; as they happen<br>
&gt; &gt; &gt; &gt; &gt; &gt;    - in practice, UI becomes reactive instead of proactive, which<br>
&gt; &gt; &gt; &gt; &gt; &gt;      has several benefits (reduced HTTP load on Engine being the<br>
&gt; &gt; &gt; &gt; &gt; &gt;      most obvious one)<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; So what Martin wrote in email below directly relates to #2 goal.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Push notifications improve user experience regardless of specific<br>
&gt; &gt; &gt; &gt; &gt; &gt; UI technology, regardless of whether we improve existing REST API<br>
&gt; &gt; &gt; &gt; &gt; &gt; (e.g. introduce data aggregations) or not.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; For me, it&#39;s a big +1.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Having BLL commands firing CDI events upon execution makes sense.<br>
&gt; &gt; &gt; &gt; &gt; &gt; That said, I&#39;d suggest to start with a simple implementation and<br>
&gt; &gt; &gt; &gt; &gt; &gt; proceed from there.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; What Martin suggested:<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;   void onVmChanged(@Observes @Updated VM vm)<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; could be even simplified into:<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;   void onCommandExecuted(@Observes @CommandExecuted UpdateVmCommand<br>
&gt; &gt; &gt; &gt; &gt; &gt;   cmd)<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; and still it would bring value to the general idea, which is the<br>
&gt; &gt; &gt; &gt; &gt; &gt; ability to detect changes in oVirt &quot;system&quot; as they happen along<br>
&gt; &gt; &gt; &gt; &gt; &gt; with the ability to react upon such changes.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; I&#39;m interested what Engine backend maintainers&#39; thoughts are.<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; Regards,<br>
&gt; &gt; &gt; &gt; &gt; &gt; Vojtech<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; ----- Original Message -----<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; From: &quot;Martin Betak&quot; &lt;<a href="mailto:mbetak@redhat.com">mbetak@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; To: &quot;<a href="mailto:engine-devel@ovirt.org">engine-devel@ovirt.org</a>&quot; &lt;<a href="mailto:devel@ovirt.org">devel@ovirt.org</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Cc: &quot;Roy Golan&quot; &lt;<a href="mailto:rgolan@redhat.com">rgolan@redhat.com</a>&gt;, &quot;Roman Mohr&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:rmohr@redhat.com">rmohr@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &quot;Michal Skrivanek&quot; &lt;<a href="mailto:mskrivan@redhat.com">mskrivan@redhat.com</a>&gt;,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &quot;Piotr Kliczewski&quot; &lt;<a href="mailto:pkliczew@redhat.com">pkliczew@redhat.com</a>&gt;, &quot;Vojtech Szocs&quot;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &lt;<a href="mailto:vszocs@redhat.com">vszocs@redhat.com</a>&gt;, &quot;Tomas Jelinek&quot; &lt;<a href="mailto:tjelinek@redhat.com">tjelinek@redhat.com</a>&gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Sent: Wednesday, November 11, 2015 4:34:11 PM<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Subject: Push notifications in 4.0 backend<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Hi All,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; I would like to take this opportunity to start a discussion<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; about the possibility of implementing a user facing change<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; notifications.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; The benefit of this would be to remove the need for periodic<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; polling<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; from frontends and other services that consume our REST API.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Also implmenting a common infrastructure on the backend for event<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; notifications (e.g. CDI events) would further reduce the internal<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; need for polling the DB by the backend itself, maybe even<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; reducing<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the need to use DB for some things and just keep them in memory<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; and<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; updated by CDI event observers.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; There are many solutions how to provide the user-facing part of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; notifications:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Doctor Rest, MQTT, websocket, server-sent events, ... .  Ideally<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; these<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; notifications<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; should be consumable both by web browser (webadmin/userportal)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; but<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; also<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; by<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; other services (such as ManageIQ), or other REST clients such as<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; moVirt<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; android client.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; But regardless of the chosen user-facing transport, I believe a<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; common<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; infrastructure<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; can be implemented on the BLL layer with the usage of CDI events<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; fired<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; from<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; commands.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; I see 2 major sources of changes in the engine (please correct me<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; if<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; this<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; is<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; wrong):<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 1) CRUD &amp; management commands<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 2) Vms/Hosts monitoring<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the changes originating from 2) are AFAIK very localized and not<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; so<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; numerous<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; so a manual<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; firing of appropriate events for VMs and Hosts could be added<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; here.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; The 1) case is more extensive in terms of required code changes.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; While<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; a<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; manual solution<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; would still be feasible, I believe there is place for a more<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; automated/declarative way.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; One solution for 1) that comes to my mind are simple<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; command-level<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; annotations covering the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Created, Updated, Removed (C, U, and D from CRUD) cases. The goal<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; here<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; is<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; to<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; fire the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; appropriate CDI events when an entity is created/updated/deleted.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Since<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; commands usually<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; contain getters for entities they work with (such as getVm(),<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; getVds(),<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; getStorageDomain() ...)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; It should be sufficient for the most common simple cases (of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; course<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; this<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; will<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; not cover<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; everything) to use annotation @Creates, @Updates, @Removes on the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; commands<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; classes, where<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; parameters of the annotation should specify the getter method<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; that<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; returns<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the affected entity<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; (VM/VDS/StorageDomain...). This could be specified by the entity<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; class<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; token<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; or method name<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; (depending on the level of &quot;magic&quot; one prefers :-) and the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; CommandBase<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; infrastructure would<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; then collect those annotations and upon successful completion of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; command<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; fire the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; appropriate events.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Example #1:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; @Updates(&#39;getVm&#39;) // or @Updates(VM.class)?<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; public class UpdateVmCommand&lt;...&gt;  extends VmManagementComandBase<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; ...<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Note that since Java 8 we have repeatable annotations so we can<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; have<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; more<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; complex commands<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; that affect more entities.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Example #2:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; @Updates(Vm.class)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; @Updates(VmTemplate.class)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; // possibly also some @Creates and @Removes annotations or their<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; combination<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; public class ContrivedExampleCommand extends SomeCommandBase<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the infrastructure would then look upon successful completion of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; command<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; on the getVm()<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; and getVmTemplate() methods, invoke them, determine the resulting<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; types<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; entities VM and VmTemplate<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; and since the annotations used were @Updates fire CDI event<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; equivalent<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; to<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;   @Inject<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;   @Updated // our custom CDI qualifier<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;   Event&lt;VM&gt; vmChangedEvent;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; and anologously for VmTemplate.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; But regardless of the exact implementation of the CDI event<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; firing:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; whether<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; manual, the above<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; proposal, or some crazy usage of AspectJ - the interface for the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; rest<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; the<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; code should always<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; be the like this:<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; public void onVmChanged(@Observes @Updated VM vm) {<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;     // ....<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; }<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; On top of this, I believe, we can build the user-facing part of<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; push<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; notifications and also<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; improve our existing backend code.<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Thank you for reading this long email and I welcome any comments<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; or<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; counter-proposals you<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; might have on this topic :-)<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Best regards,<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Martin<br>
&gt; &gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; &gt; Devel mailing list<br>
&gt; &gt; &gt; &gt; <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt; &gt; &gt; &gt; <a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/mailman/listinfo/devel</a><br>
&gt; &gt; &gt; &gt;<br>
&gt; &gt; &gt; _______________________________________________<br>
&gt; &gt; &gt; Devel mailing list<br>
&gt; &gt; &gt; <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt; &gt; &gt; <a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/mailman/listinfo/devel</a><br>
&gt; &gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; Devel mailing list<br>
&gt; &gt; <a href="mailto:Devel@ovirt.org">Devel@ovirt.org</a><br>
&gt; &gt; <a href="http://lists.ovirt.org/mailman/listinfo/devel" rel="noreferrer" target="_blank">http://lists.ovirt.org/mailman/listinfo/devel</a><br>
&gt; &gt;<br>
&gt; _______________________________________________<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/mailman/listinfo/devel</a><br>
&gt;<br>
_______________________________________________<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/mailman/listinfo/devel</a><br>
</div></div></blockquote></div><br></div></div>