Blob Blame History Raw
From 905b37a562b94b60511396823e83ff718e2d8fcd Mon Sep 17 00:00:00 2001
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
Date: Fri, 23 Aug 2019 11:30:32 -0300
Subject: [PATCH virt-viewer] Workaround inconsistency with REST API

The storage domain object returned in this stage does not provide a link
to the files subcollection. To workaround this problem, we use the id of
the given storage domain to create a new object but referencing the
toplevel api, which in turn provides the file collection.

This is meant to be a donwnstream patch only, while this issue is not
addressed by RHV.

Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1717900

Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
---
 src/ovirt-foreign-menu.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c
index 4c1ea06..d4cc06a 100644
--- a/src/ovirt-foreign-menu.c
+++ b/src/ovirt-foreign-menu.c
@@ -692,6 +692,37 @@ static gboolean ovirt_foreign_menu_set_file_collection(OvirtForeignMenu *menu, O
     return TRUE;
 }
 
+static gboolean set_file_collection_from_toplevel_storage_domain(OvirtForeignMenu *menu, OvirtStorageDomain *domain)
+{
+    gboolean ret = FALSE;
+    GError *error = NULL;
+    OvirtResource *resource = NULL;
+    gchar *href = NULL, *id = NULL;
+
+    g_object_get(domain, "guid", &id, NULL);
+    href = g_strdup_printf("/ovirt-engine/api/storagedomains/%s", id);
+    resource = g_initable_new(OVIRT_TYPE_STORAGE_DOMAIN, NULL, &error, "guid", id, "href", href, NULL);
+    if (error != NULL) {
+        g_warning("Failed to create storage domain with href %s: %s", href, error->message);
+        goto end;
+    }
+
+    ovirt_resource_refresh(resource, menu->priv->proxy, &error);
+    if (error != NULL) {
+        g_warning("Failed to refresh storage domain: %s", error->message);
+        goto end;
+    }
+
+    ret = ovirt_foreign_menu_set_file_collection(menu, ovirt_storage_domain_get_files(OVIRT_STORAGE_DOMAIN(resource)));
+
+end:
+    g_clear_error(&error);
+    g_clear_object(&resource);
+    g_free(id);
+    g_free(href);
+    return ret;
+}
+
 static void storage_domains_fetched_cb(GObject *source_object,
                                        GAsyncResult *result,
                                        gpointer user_data)
@@ -723,8 +754,11 @@ static void storage_domains_fetched_cb(GObject *source_object,
             domain_valid = TRUE;
 
         file_collection = ovirt_storage_domain_get_files(domain);
-        if (!ovirt_foreign_menu_set_file_collection(menu, file_collection))
-            continue;
+        if (!ovirt_foreign_menu_set_file_collection(menu, file_collection)) {
+            /* Retry with toplevel storage domain */
+            if (!set_file_collection_from_toplevel_storage_domain(menu, domain))
+                continue;
+        }
 
         break; /* There can only be one valid storage domain at a time,
                   no need to iterate more on the list */
-- 
2.21.0