From 182fb30ff7cd85873d479b214bebf291aed2eaf1 Mon Sep 17 00:00:00 2001 From: "Eduardo Lima (Etrunko)" Date: Fri, 23 Aug 2019 11:30:32 -0300 Subject: [PATCH virt-viewer] [DOWNSTREAM] 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) --- 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 98ab7b9..a849991 100644 --- a/src/ovirt-foreign-menu.c +++ b/src/ovirt-foreign-menu.c @@ -686,6 +686,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) @@ -717,8 +748,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.26.2