[virt-tools-list] [virt-viewer 17/20] ovirt: fetch SPICE connection info from oVirt

Christophe Fergeau cfergeau at redhat.com
Wed Jun 13 12:23:25 UTC 2012


---
 src/virt-viewer-session-ovirt.c |  194 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 189 insertions(+), 5 deletions(-)

diff --git a/src/virt-viewer-session-ovirt.c b/src/virt-viewer-session-ovirt.c
index 3fc7c62..5b71c83 100644
--- a/src/virt-viewer-session-ovirt.c
+++ b/src/virt-viewer-session-ovirt.c
@@ -27,8 +27,11 @@
 #include <glib/gi18n.h>
 
 #include "ovirt-proxy.h"
-#include "virt-viewer-util.h"
+#include "ovirt-vm.h"
+#include "ovirt-vm-display.h"
 #include "virt-viewer-session-ovirt.h"
+#include "virt-viewer-session-spice.h"
+#include "virt-viewer-util.h"
 
 #if !GLIB_CHECK_VERSION(2, 26, 0)
 #include "gbinding.h"
@@ -177,7 +180,7 @@ parse_uri(VirtViewerSession *session, const gchar *uri)
     tmp_uri = g_strndup(uri, pos - uri + 1);
     g_assert(g_str_has_prefix(tmp_uri, "ovirt://"));
     /* FIXME: how to decide between http and https? */
-    self->priv->rest_uri = g_strdup_printf("http://%s/api/",
+    self->priv->rest_uri = g_strdup_printf("https://%s/api/",
                                            tmp_uri + strlen("ovirt://"));
     g_free(tmp_uri);
     self->priv->vm_name = g_strdup(vm_name);
@@ -187,20 +190,201 @@ parse_uri(VirtViewerSession *session, const gchar *uri)
     return TRUE;
 }
 
+static void
+create_spice_session(VirtViewerSessionOvirt *ovirt,
+                     const char *address,
+                     guint16 port, guint16 secure_port,
+                     const char *ticket)
+{
+    VirtViewerApp *app;
+    char *spice_uri;
+
+    /* FIXME: escape & and ; in password */
+    spice_uri = g_strdup_printf("spice://%s?password=%s", address, ticket);
+    if (secure_port != 0) {
+        char *tmp_uri;
+        tmp_uri = g_strdup_printf("%s&tls-port=%d", spice_uri, secure_port);
+        g_free(spice_uri);
+        spice_uri = tmp_uri;
+    }
+    if (port != 0) {
+        char *tmp_uri;
+        tmp_uri = g_strdup_printf("%s&port=%d", spice_uri, port);
+        g_free(spice_uri);
+        spice_uri = tmp_uri;
+    }
+    g_debug("spice URI: %s", spice_uri);
+
+    g_object_get(ovirt, "app", &app, NULL);
+    ovirt->priv->real_session = virt_viewer_session_spice_new(app, ovirt->priv->main_window);
+    g_object_unref(app);
+
+    virt_viewer_session_open_uri(ovirt->priv->real_session, spice_uri);
+    g_free(spice_uri);
+}
+
+static void
+get_ticket_async_cb(OvirtProxy *proxy, OvirtVm *vm,
+                    const GError *error, gpointer user_data)
+{
+    VirtViewerSessionOvirt *ovirt;
+    OvirtVmDisplay *display = NULL;
+    gchar *address = NULL;
+    guint port;
+    guint secure_port;
+    OvirtVmDisplayType type;
+    char *ticket = NULL;;
+
+    ovirt = VIRT_VIEWER_SESSION_OVIRT(user_data);
+    if (error != NULL) {
+        g_debug("failed to get ticket for VM %s: %s",
+                ovirt->priv->vm_name, error->message);
+        goto end;
+    }
+
+    g_object_get(G_OBJECT(vm), "display", &display, NULL);
+    if (display == NULL) {
+        goto end;
+    }
+
+    g_object_get(G_OBJECT(display),
+                 "type", &type,
+                 "address", &address,
+                 "port", &port,
+                 "secure-port", &secure_port,
+                 "ticket", &ticket,
+                 NULL);
+    g_debug("Ticket: %s", ticket);
+
+    if (type != OVIRT_VM_DISPLAY_SPICE) {
+        goto end;
+    }
+
+    if ((port == 0) && (secure_port == 0)) {
+        goto end;
+    }
+
+    create_spice_session(ovirt, address, port, secure_port, ticket);
+
+end:
+    g_free(address);
+    g_free(ticket);
+    if (display != NULL) {
+        g_object_unref(G_OBJECT(display));
+    }
+    g_object_unref(G_OBJECT(proxy));
+    g_object_unref(G_OBJECT(vm));
+}
+
+static void
+start_vm_async_cb(OvirtProxy *proxy, OvirtVm *vm,
+                  const GError *start_error, gpointer user_data)
+{
+    VirtViewerSessionOvirt *ovirt = VIRT_VIEWER_SESSION_OVIRT(user_data);
+    GError *error = NULL;
+
+    ovirt = VIRT_VIEWER_SESSION_OVIRT(user_data);
+    if (start_error != NULL) {
+        g_debug("failed to start VM %s: %s",
+                ovirt->priv->vm_name, start_error->message);
+        goto error;
+    }
+
+    if (!ovirt_proxy_vm_get_ticket_async(proxy, vm, get_ticket_async_cb,
+                                         ovirt, &error)) {
+        g_debug("failed to get ticket for VM %s: %s",
+                ovirt->priv->vm_name, error->message);
+        goto error;
+    }
+    return;
+
+error:
+    if (error != NULL)
+        g_error_free(error);
+    g_object_unref(G_OBJECT(proxy));
+    g_object_unref(G_OBJECT(vm));
+}
+
+static void
+lookup_vm_async_cb(OvirtProxy *proxy, OvirtVm *vm,
+                   const GError *lookup_error, gpointer user_data)
+{
+    VirtViewerSessionOvirt *ovirt = VIRT_VIEWER_SESSION_OVIRT(user_data);
+    OvirtVmState state;
+    GError *error = NULL;
+
+    if (vm == NULL) {
+        g_debug("%s could not be lookep up", ovirt->priv->vm_name);
+    }
+    g_object_ref(G_OBJECT(vm));
+    if (lookup_error != NULL) {
+        g_debug("error looking up %s: %s",
+                ovirt->priv->vm_name,
+                lookup_error->message);
+        goto error;
+    }
+
+    g_object_get(G_OBJECT(vm), "state", &state, NULL);
+    if (state != OVIRT_VM_STATE_UP) {
+        /* FIXME: should be async */
+        ovirt_proxy_vm_start_async(proxy, vm, start_vm_async_cb, ovirt, &error);
+        if (error != NULL) {
+            g_debug("failed to start %s: %s",
+                    ovirt->priv->vm_name,
+                    error->message);
+            goto error;
+        }
+    }
+
+    if (!ovirt_proxy_vm_get_ticket_async(proxy, vm, get_ticket_async_cb,
+                                         ovirt, &error)) {
+        g_debug("failed to get ticket for VM %s: %s",
+                ovirt->priv->vm_name, error->message);
+        goto error;
+    }
+    return;
+
+error:
+    if (vm != NULL)
+        g_object_unref(vm);
+    g_object_unref(proxy);
+    if (error != NULL)
+        g_error_free(error);
+}
+
 static gboolean
 virt_viewer_session_ovirt_open_uri(VirtViewerSession *session,
                                    const gchar *uri)
 {
     /* FIXME: resolve */
     VirtViewerSessionOvirt *self = VIRT_VIEWER_SESSION_OVIRT(session);
-    OvirtProxy *proxy;
+    OvirtProxy *proxy = NULL;
+    GError *error = NULL;
 
     g_return_val_if_fail(self != NULL, FALSE);
 
-    g_warning("open_uri: %s", uri);
     if (!parse_uri(session, uri))
-        return FALSE;
+        goto error;
+    g_debug("oVirt REST URI: %s", self->priv->rest_uri);
+    proxy = ovirt_proxy_new (self->priv->rest_uri);
+    if (proxy == NULL)
+        goto error;
+    ovirt_proxy_lookup_vm_async(proxy, self->priv->vm_name,
+                                lookup_vm_async_cb, session,
+                                &error);
+    if (error != NULL) {
+        g_debug("failed to lookup %s: %s",
+                self->priv->vm_name,
+                error->message);
+        goto error;
+    }
+    return TRUE;
 
+error:
+    if (error != NULL)
+        g_error_free(error);
+    if (proxy != NULL)
+        g_object_unref(proxy);
     return FALSE;
 }
 
-- 
1.7.10.2




More information about the virt-tools-list mailing list