Blame SOURCES/0058-ovirt-foreign-menu-Bypass-errors-from-Host-Cluster-D.patch

1efd99
From f7f487b4490793eb54a276103eae7a17c829b2b4 Mon Sep 17 00:00:00 2001
1efd99
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
1efd99
Date: Fri, 6 Jul 2018 09:12:18 -0300
1efd99
Subject: [PATCH virt-viewer] ovirt-foreign-menu: Bypass errors from
1efd99
 Host/Cluster/Data Center
1efd99
1efd99
When accessing ovirt as a regular user, it may happen that queries to
1efd99
Hosts, Clusters and Data Centers return errors due to insufficient
1efd99
permissions, while they will work fine if access is done by admin user.
1efd99
In this case, we skip the errors and fallback to the old method.
1efd99
1efd99
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
1efd99
---
1efd99
 src/ovirt-foreign-menu.c | 51 ++++++++++++++++++++++++++++++----------
1efd99
 1 file changed, 39 insertions(+), 12 deletions(-)
1efd99
1efd99
diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c
1efd99
index b8ad179..451b116 100644
1efd99
--- a/src/ovirt-foreign-menu.c
1efd99
+++ b/src/ovirt-foreign-menu.c
1efd99
@@ -621,12 +621,21 @@ static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu,
1efd99
 
1efd99
 #ifdef HAVE_OVIRT_DATA_CENTER
1efd99
 static gboolean storage_domain_attached_to_data_center(OvirtStorageDomain *domain,
1efd99
-                                                      OvirtDataCenter *data_center)
1efd99
+                                                       OvirtDataCenter *data_center)
1efd99
 {
1efd99
     GStrv data_center_ids;
1efd99
     char *data_center_guid;
1efd99
     gboolean match;
1efd99
 
1efd99
+    /* For some reason we did not get data center information, so just return
1efd99
+     * TRUE as it will work like a fallback to old method, where we did not
1efd99
+     * check relationship between data center and storage domain.
1efd99
+     */
1efd99
+    if (data_center == NULL) {
1efd99
+        g_debug("Could not get data center info, considering storage domain is attached to it");
1efd99
+        return TRUE;
1efd99
+    }
1efd99
+
1efd99
     g_object_get(domain, "data-center-ids", &data_center_ids, NULL);
1efd99
     g_object_get(data_center, "guid", &data_center_guid, NULL);
1efd99
     match = g_strv_contains((const gchar * const *) data_center_ids, data_center_guid);
1efd99
@@ -725,9 +734,6 @@ static void data_center_fetched_cb(GObject *source_object,
1efd99
     ovirt_resource_refresh_finish(resource, result, &error);
1efd99
     if (error != NULL) {
1efd99
         g_debug("failed to fetch Data Center: %s", error->message);
1efd99
-        g_task_return_error(task, error);
1efd99
-        g_object_unref(task);
1efd99
-        return;
1efd99
     }
1efd99
 
1efd99
     ovirt_foreign_menu_next_async_step(menu, task, STATE_DATA_CENTER);
1efd99
@@ -742,6 +748,12 @@ static void ovirt_foreign_menu_fetch_data_center_async(OvirtForeignMenu *menu,
1efd99
     g_return_if_fail(OVIRT_IS_CLUSTER(menu->priv->cluster));
1efd99
 
1efd99
     menu->priv->data_center = ovirt_cluster_get_data_center(menu->priv->cluster);
1efd99
+
1efd99
+    if (menu->priv->data_center == NULL) {
1efd99
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_DATA_CENTER);
1efd99
+        return;
1efd99
+    }
1efd99
+
1efd99
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->data_center),
1efd99
                                  menu->priv->proxy,
1efd99
                                  g_task_get_cancellable(task),
1efd99
@@ -762,9 +774,6 @@ static void cluster_fetched_cb(GObject *source_object,
1efd99
     ovirt_resource_refresh_finish(resource, result, &error);
1efd99
     if (error != NULL) {
1efd99
         g_debug("failed to fetch Cluster: %s", error->message);
1efd99
-        g_task_return_error(task, error);
1efd99
-        g_object_unref(task);
1efd99
-        return;
1efd99
     }
1efd99
 
1efd99
     ovirt_foreign_menu_next_async_step(menu, task, STATE_CLUSTER);
1efd99
@@ -776,9 +785,21 @@ static void ovirt_foreign_menu_fetch_cluster_async(OvirtForeignMenu *menu,
1efd99
 {
1efd99
     g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu));
1efd99
     g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy));
1efd99
-    g_return_if_fail(OVIRT_IS_HOST(menu->priv->host));
1efd99
 
1efd99
-    menu->priv->cluster = ovirt_host_get_cluster(menu->priv->host);
1efd99
+    /* If there is no host information, we get cluster from the VM */
1efd99
+    if (menu->priv->host == NULL) {
1efd99
+        g_return_if_fail(OVIRT_IS_VM(menu->priv->vm));
1efd99
+        menu->priv->cluster = ovirt_vm_get_cluster(menu->priv->vm);
1efd99
+    } else {
1efd99
+        g_return_if_fail(OVIRT_IS_HOST(menu->priv->host));
1efd99
+        menu->priv->cluster = ovirt_host_get_cluster(menu->priv->host);
1efd99
+    }
1efd99
+
1efd99
+    if (menu->priv->cluster == NULL) {
1efd99
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_CLUSTER);
1efd99
+        return;
1efd99
+    }
1efd99
+
1efd99
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->cluster),
1efd99
                                  menu->priv->proxy,
1efd99
                                  g_task_get_cancellable(task),
1efd99
@@ -799,9 +820,6 @@ static void host_fetched_cb(GObject *source_object,
1efd99
     ovirt_resource_refresh_finish(resource, result, &error);
1efd99
     if (error != NULL) {
1efd99
         g_debug("failed to fetch Host: %s", error->message);
1efd99
-        g_task_return_error(task, error);
1efd99
-        g_object_unref(task);
1efd99
-        return;
1efd99
     }
1efd99
 
1efd99
     ovirt_foreign_menu_next_async_step(menu, task, STATE_HOST);
1efd99
@@ -816,6 +834,15 @@ static void ovirt_foreign_menu_fetch_host_async(OvirtForeignMenu *menu,
1efd99
     g_return_if_fail(OVIRT_IS_VM(menu->priv->vm));
1efd99
 
1efd99
     menu->priv->host = ovirt_vm_get_host(menu->priv->vm);
1efd99
+
1efd99
+    /* In some cases the VM XML does not include host information, so we just
1efd99
+     * skip to the next step
1efd99
+     */
1efd99
+    if (menu->priv->host == NULL) {
1efd99
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_HOST);
1efd99
+        return;
1efd99
+    }
1efd99
+
1efd99
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->host),
1efd99
                                  menu->priv->proxy,
1efd99
                                  g_task_get_cancellable(task),
1efd99
-- 
1efd99
2.20.1
1efd99