<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, May 24, 2013 at 12:39 PM, Tomas Sedovic <span dir="ltr"><<a href="mailto:tsedovic@redhat.com" target="_blank">tsedovic@redhat.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello all,<br>
<br>
I wrote a small proof of concept for the realtime communication in Horizon[1][2]. The code is on Gerrit awaiting your feedback. It's just two smallish commits:<br>
<br>
<a href="https://review.openstack.org/30462" target="_blank">https://review.openstack.org/<u></u>30462</a><br>
<a href="https://review.openstack.org/30463" target="_blank">https://review.openstack.org/<u></u>30463</a><br>
<br>
I would very much like anyone interested to try it out and send their thoughts. Below are notes on the implementation and a few things that we should hash out.<br>
<br>
<br>
## The Realtime library<br>
<br>
The PoC is written in Python and integrated with Horizon. We're all familiar with Python and we can leverage the existing infrastructure (views and templates, the Request objects for API authentication, deploy both the realtime portion and the traditional code on a single server and the common RPC API).<br>

<br>
As for the specific transport implementation, I picked gevent-socketio[3]. I wanted to use a Socket.IO-compatible solution because it supports several fallbacks for WebSockets and allows us to switch to Node.js later if necessary.<br>

<br>
There are a few Python <a href="http://socket.io" target="_blank">socket.io</a> implementations out there:<br>
<br>
<a href="https://github.com/abourget/gevent-socketio" target="_blank">https://github.com/abourget/<u></u>gevent-socketio</a><br>
<a href="https://github.com/MrJoes/tornadio2" target="_blank">https://github.com/MrJoes/<u></u>tornadio2</a><br>
<a href="https://github.com/stephenmcd/django-socketio" target="_blank">https://github.com/stephenmcd/<u></u>django-socketio</a><br>
<br>
django-socketio currently supports an out-of-date version of the Socket.IO protocol. We may want to revisit it once they get up to date.<br>
<br>
The development of tornadio2 seems to be less active, and gevent-socketio seems to be more readily integrated into various web frameworks. But it seems either would work.<br>
<br>
<br>
## Deployment<br>
<br>
No matter what backend we end up using, the deployment will get more complicated. The WSGI specification doesn't support websockets-like transfer so this (or any other solution I could find) won't work with vanilla WSGI servers (most notably mod_wsgi).<br>

<br>
The <a href="http://socket.io" target="_blank">socket.io</a> part of Horizon can be served via Gevent or Gunicorn and since both support WSGI, we can serve the rest of the app alongside. An alternative is to keep using mod_wsgi for the non-realtime part and a separate process for realtime.<br>

<br>
While this complicates things, it isn't worse than using Node.js: there we must have two servers: one for Django and one for Node.<br>
<br>
<br>
## Functionality<br>
<br>
The code doesn't do much at the moment. It's more about laying the ground work and having something tangible we can discuss. So the only functionality right now is that in the /project/instances/ page, the change in the instances' statuses are continuously updated using <a href="http://socket.io" target="_blank">socket.io</a> instead of the existing ajax polling.<br>

<br>
If you have a few instances running, when you visit the page and then change their status out of band (e.g. via the command line), this should be reflected in the UI.<br>
<br>
I purposefully avoided two thornier issues that need to be resolved before this is of any use. These should be discussed and decided before we jump in and start to write more code:<br>
<br>
1. The current way of updating the UI is to send the new chunk of HTML to the browser. For the purposes of the realtime communication, it would (I think) make more sense to send just the updated data and update the UI client-side.<br>

<br>
We can of course keep sending the HTML chunks, if that's the way you all want to go, but it limits what we can do.<br>
<br>
2. Horizon is mostly a request/response UI. To be able to push changes to the browsers, the server needs to figure out when things actually changed. We could receive the notifications via RPC or we poll for the changes internally and then broadcast them to the browsers.<br>

<br>
I wonder if we could leverage Ceilometer here since it already listens in on the message bus. Could it be configured to send interesting information to Horizon (as opposed to being polled for it)?<br></blockquote><div><br>
</div><div style>This really feels like a different use case that what ceilometer is made for. Gabriel and I talked at the grizzly summit about the code we have in ceilometer for listening to notifications, and we agreed to try to put that in oslo somewhere to make it easier to create a similar listening service in horizon that redirects the notifications to the browser(s). I haven't had a chance to do that. If you want to tackle it, I can help figure out which bits are interesting/useful.</div>
<div style><br></div><div style>Doug</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
I'm not sure whether it makes sense to push the code or not, but I tried to make sure I didn't break the standard set up.<br>
<br>
Please let me know what you think.<br>
<br>
Thanks,<br>
Tomas Sedovic<br>
<br>
<br>
[1]: <a href="https://blueprints.launchpad.net/horizon/+spec/realtime-communication" target="_blank">https://blueprints.launchpad.<u></u>net/horizon/+spec/realtime-<u></u>communication</a><br>
[2]: <a href="https://etherpad.openstack.org/havana-horizon-realtime" target="_blank">https://etherpad.openstack.<u></u>org/havana-horizon-realtime</a><br>
[3]: <a href="https://github.com/abourget/gevent-socketio" target="_blank">https://github.com/abourget/<u></u>gevent-socketio</a><br>
<br>
______________________________<u></u>_________________<br>
OpenStack-dev mailing list<br>
<a href="mailto:OpenStack-dev@lists.openstack.org" target="_blank">OpenStack-dev@lists.openstack.<u></u>org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev" target="_blank">http://lists.openstack.org/<u></u>cgi-bin/mailman/listinfo/<u></u>openstack-dev</a><br>
</blockquote></div><br></div></div>