Blame SOURCES/0002-DOWNSTREAM-ovirt-foreign-menu-Bypass-errors-from-Hos.patch

2a0fe3
From d8dc636c63a3616a938c600487e473a71c67cf96 Mon Sep 17 00:00:00 2001
394f7b
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
394f7b
Date: Fri, 6 Jul 2018 09:12:18 -0300
2a0fe3
Subject: [PATCH virt-viewer] [DOWNSTREAM] ovirt-foreign-menu: Bypass errors
2a0fe3
 from Host/Cluster/Data Center
394f7b
394f7b
When accessing ovirt as a regular user, it may happen that queries to
394f7b
Hosts, Clusters and Data Centers return errors due to insufficient
394f7b
permissions, while they will work fine if access is done by admin user.
394f7b
In this case, we skip the errors and fallback to the old method.
394f7b
394f7b
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
394f7b
---
394f7b
 src/ovirt-foreign-menu.c | 60 ++++++++++++++++++++++++++++++----------
394f7b
 1 file changed, 46 insertions(+), 14 deletions(-)
394f7b
394f7b
diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c
2a0fe3
index a849991..dc6ecf4 100644
394f7b
--- a/src/ovirt-foreign-menu.c
394f7b
+++ b/src/ovirt-foreign-menu.c
2a0fe3
@@ -627,12 +627,21 @@ G_GNUC_END_IGNORE_DEPRECATIONS
2a0fe3
 }
394f7b
 
394f7b
 static gboolean storage_domain_attached_to_data_center(OvirtStorageDomain *domain,
394f7b
-                                                      OvirtDataCenter *data_center)
394f7b
+                                                       OvirtDataCenter *data_center)
394f7b
 {
394f7b
     GStrv data_center_ids;
394f7b
     char *data_center_guid;
394f7b
     gboolean match;
394f7b
 
394f7b
+    /* For some reason we did not get data center information, so just return
394f7b
+     * TRUE as it will work like a fallback to old method, where we did not
394f7b
+     * check relationship between data center and storage domain.
394f7b
+     */
394f7b
+    if (data_center == NULL) {
394f7b
+        g_debug("Could not get data center info, considering storage domain is attached to it");
394f7b
+        return TRUE;
394f7b
+    }
394f7b
+
394f7b
     g_object_get(domain, "data-center-ids", &data_center_ids, NULL);
394f7b
     g_object_get(data_center, "guid", &data_center_guid, NULL);
2a0fe3
     match = strv_contains((const gchar * const *) data_center_ids, data_center_guid);
2a0fe3
@@ -779,9 +788,11 @@ static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu
394f7b
 #ifdef HAVE_OVIRT_DATA_CENTER
394f7b
     g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu));
394f7b
     g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy));
394f7b
-    g_return_if_fail(OVIRT_IS_DATA_CENTER(menu->priv->data_center));
394f7b
 
394f7b
-    collection = ovirt_data_center_get_storage_domains(menu->priv->data_center);
394f7b
+    if (menu->priv->data_center != NULL)
394f7b
+        collection = ovirt_data_center_get_storage_domains(menu->priv->data_center);
394f7b
+    else
394f7b
+        collection = ovirt_api_get_storage_domains(menu->priv->api);
394f7b
 #else
394f7b
     collection = ovirt_api_get_storage_domains(menu->priv->api);
394f7b
 #endif
2a0fe3
@@ -806,9 +817,7 @@ static void data_center_fetched_cb(GObject *source_object,
394f7b
     ovirt_resource_refresh_finish(resource, result, &error);
394f7b
     if (error != NULL) {
394f7b
         g_debug("failed to fetch Data Center: %s", error->message);
394f7b
-        g_task_return_error(task, error);
394f7b
-        g_object_unref(task);
394f7b
-        return;
394f7b
+        g_clear_error(&error);
394f7b
     }
394f7b
 
394f7b
     ovirt_foreign_menu_next_async_step(menu, task, STATE_DATA_CENTER);
2a0fe3
@@ -823,6 +832,12 @@ static void ovirt_foreign_menu_fetch_data_center_async(OvirtForeignMenu *menu,
394f7b
     g_return_if_fail(OVIRT_IS_CLUSTER(menu->priv->cluster));
394f7b
 
394f7b
     menu->priv->data_center = ovirt_cluster_get_data_center(menu->priv->cluster);
394f7b
+
394f7b
+    if (menu->priv->data_center == NULL) {
394f7b
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_DATA_CENTER);
394f7b
+        return;
394f7b
+    }
394f7b
+
394f7b
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->data_center),
394f7b
                                  menu->priv->proxy,
394f7b
                                  g_task_get_cancellable(task),
2a0fe3
@@ -843,9 +858,7 @@ static void cluster_fetched_cb(GObject *source_object,
394f7b
     ovirt_resource_refresh_finish(resource, result, &error);
394f7b
     if (error != NULL) {
394f7b
         g_debug("failed to fetch Cluster: %s", error->message);
394f7b
-        g_task_return_error(task, error);
394f7b
-        g_object_unref(task);
394f7b
-        return;
394f7b
+        g_clear_error(&error);
394f7b
     }
394f7b
 
394f7b
     ovirt_foreign_menu_next_async_step(menu, task, STATE_CLUSTER);
2a0fe3
@@ -857,9 +870,21 @@ static void ovirt_foreign_menu_fetch_cluster_async(OvirtForeignMenu *menu,
394f7b
 {
394f7b
     g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu));
394f7b
     g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy));
394f7b
-    g_return_if_fail(OVIRT_IS_HOST(menu->priv->host));
394f7b
 
394f7b
-    menu->priv->cluster = ovirt_host_get_cluster(menu->priv->host);
394f7b
+    /* If there is no host information, we get cluster from the VM */
394f7b
+    if (menu->priv->host == NULL) {
394f7b
+        g_return_if_fail(OVIRT_IS_VM(menu->priv->vm));
394f7b
+        menu->priv->cluster = ovirt_vm_get_cluster(menu->priv->vm);
394f7b
+    } else {
394f7b
+        g_return_if_fail(OVIRT_IS_HOST(menu->priv->host));
394f7b
+        menu->priv->cluster = ovirt_host_get_cluster(menu->priv->host);
394f7b
+    }
394f7b
+
394f7b
+    if (menu->priv->cluster == NULL) {
394f7b
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_CLUSTER);
394f7b
+        return;
394f7b
+    }
394f7b
+
394f7b
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->cluster),
394f7b
                                  menu->priv->proxy,
394f7b
                                  g_task_get_cancellable(task),
2a0fe3
@@ -880,9 +905,7 @@ static void host_fetched_cb(GObject *source_object,
394f7b
     ovirt_resource_refresh_finish(resource, result, &error);
394f7b
     if (error != NULL) {
394f7b
         g_debug("failed to fetch Host: %s", error->message);
394f7b
-        g_task_return_error(task, error);
394f7b
-        g_object_unref(task);
394f7b
-        return;
394f7b
+        g_clear_error(&error);
394f7b
     }
394f7b
 
394f7b
     ovirt_foreign_menu_next_async_step(menu, task, STATE_HOST);
2a0fe3
@@ -897,6 +920,15 @@ static void ovirt_foreign_menu_fetch_host_async(OvirtForeignMenu *menu,
394f7b
     g_return_if_fail(OVIRT_IS_VM(menu->priv->vm));
394f7b
 
394f7b
     menu->priv->host = ovirt_vm_get_host(menu->priv->vm);
394f7b
+
394f7b
+    /* In some cases the VM XML does not include host information, so we just
394f7b
+     * skip to the next step
394f7b
+     */
394f7b
+    if (menu->priv->host == NULL) {
394f7b
+        ovirt_foreign_menu_next_async_step(menu, task, STATE_HOST);
394f7b
+        return;
394f7b
+    }
394f7b
+
394f7b
     ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->host),
394f7b
                                  menu->priv->proxy,
394f7b
                                  g_task_get_cancellable(task),
394f7b
-- 
2a0fe3
2.26.2
394f7b