Previously, when a user tried to connect to an ovirt vm using an ovirt:// URI, all connection failures were reported to the user with a simple "Couldn't open oVirt Session" error dialog. Now we report a slightly more detailed error message to the user (e.g. "Unauthorized", "No vm specified", etc. This change also catches an error case that wasn't handled before: an empty string is no longer a valid vm name. --- src/remote-viewer.c | 95 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/src/remote-viewer.c b/src/remote-viewer.c index b2cf748..30f8444 100644 --- a/src/remote-viewer.c +++ b/src/remote-viewer.c @@ -624,7 +624,7 @@ remote_viewer_window_added(VirtViewerApp *app, #ifdef HAVE_OVIRT static gboolean -parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **username) +parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **username, GError** error) { char *vm_name = NULL; char *rel_path; @@ -637,16 +637,29 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern g_return_val_if_fail(name != NULL, FALSE); uri = xmlParseURI(uri_str); - if (uri == NULL) + if (uri == NULL) { + if (error) + *error = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("URI is not valid")); return FALSE; + } if (g_strcmp0(uri->scheme, "ovirt") != 0) { xmlFreeURI(uri); + if (error) + *error = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("URI is not an ovirt URI")); return FALSE; } if (uri->path == NULL) { xmlFreeURI(uri); + if (error) + *error = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("No virtual machine specified")); return FALSE; } @@ -654,12 +667,19 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern path_elements = g_strsplit(uri->path, "/", -1); element_count = g_strv_length(path_elements); - if (element_count == 0) { + if (element_count > 0) + vm_name = path_elements[element_count - 1]; + + if (vm_name == NULL || *vm_name == '\0') { g_strfreev(path_elements); xmlFreeURI(uri); + if (error) + *error = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("No virtual machine specified")); return FALSE; } - vm_name = path_elements[element_count-1]; + path_elements[element_count-1] = NULL; if (username && uri->user) @@ -712,7 +732,7 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth, static gboolean -create_ovirt_session(VirtViewerApp *app, const char *uri) +create_ovirt_session(VirtViewerApp *app, const char *uri, GError **error) { OvirtProxy *proxy = NULL; OvirtApi *api = NULL; @@ -720,7 +740,6 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) OvirtVm *vm = NULL; OvirtVmDisplay *display = NULL; OvirtVmState state; - GError *error = NULL; char *rest_uri = NULL; char *vm_name = NULL; char *username = NULL; @@ -729,6 +748,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) guint secure_port; OvirtVmDisplayType type; const char *session_type; + GError* e = NULL; gchar *gport = NULL; gchar *gtlsport = NULL; @@ -738,12 +758,10 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), FALSE); - if (!parse_ovirt_uri(uri, &rest_uri, &vm_name, &username)) - goto error; - proxy = ovirt_proxy_new(rest_uri); - if (proxy == NULL) + if (!parse_ovirt_uri(uri, &rest_uri, &vm_name, &username, &e)) goto error; + proxy = ovirt_proxy_new(rest_uri); g_object_set(proxy, "username", username, NULL); @@ -751,32 +769,43 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) g_signal_connect(G_OBJECT(proxy), "authenticate", G_CALLBACK(authenticate_cb), app); - api = ovirt_proxy_fetch_api(proxy, &error); - if (error != NULL) { - g_debug("failed to get oVirt 'api' collection: %s", error->message); + api = ovirt_proxy_fetch_api(proxy, &e); + if (e) { + g_debug("failed to get oVirt 'api' collection"); goto error; } vms = ovirt_api_get_vms(api); - ovirt_collection_fetch(vms, proxy, &error); - if (error != NULL) { - g_debug("failed to lookup %s: %s", vm_name, error->message); + if (!ovirt_collection_fetch(vms, proxy, &e)) { + g_debug("failed to lookup %s", vm_name); goto error; } vm = OVIRT_VM(ovirt_collection_lookup_resource(vms, vm_name)); - g_return_val_if_fail(vm != NULL, FALSE); + if (!vm) { + e = g_error_new(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + "Unable to find virtual machine '%s'", + vm_name); + goto error; + } g_object_get(G_OBJECT(vm), "state", &state, NULL); if (state != OVIRT_VM_STATE_UP) { - g_debug("oVirt VM %s is not running", vm_name); + e = g_error_new(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + "oVirt VM %s is not running", + vm_name); goto error; } - if (!ovirt_vm_get_ticket(vm, proxy, &error)) { - g_debug("failed to get ticket for %s: %s", vm_name, error->message); + if (!ovirt_vm_get_ticket(vm, proxy, &e)) { + g_debug("failed to get ticket for %s", vm_name); goto error; } g_object_get(G_OBJECT(vm), "display", &display, NULL); if (display == NULL) { + e = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("Unable to get the display for the requested virtual machine")); goto error; } @@ -796,15 +825,22 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) } else if (type == OVIRT_VM_DISPLAY_VNC) { session_type = "vnc"; } else { - g_debug("Unknown display type: %d", type); + e = g_error_new(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + "Unknown display type: %d", + type); goto error; } virt_viewer_app_set_connect_info(app, NULL, ghost, gport, gtlsport, session_type, NULL, NULL, 0, NULL); - if (virt_viewer_app_create_session(app, session_type) < 0) + if (virt_viewer_app_create_session(app, session_type) < 0) { + e = g_error_new_literal(VIRT_VIEWER_ERROR, + VIRT_VIEWER_ERROR_FAILED, + _("Unable to create session")); goto error; + } #ifdef HAVE_SPICE_GTK if (type == OVIRT_VM_DISPLAY_SPICE) { @@ -826,8 +862,6 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) } #endif - success = TRUE; - error: g_free(username); g_free(rest_uri); @@ -838,8 +872,6 @@ error: g_free(ghost); g_free(host_subject); - if (error != NULL) - g_error_free(error); if (display != NULL) g_object_unref(display); if (vm != NULL) @@ -849,6 +881,12 @@ error: if (proxy != NULL) g_object_unref(proxy); + success = (e == NULL); + if (error) + *error = e; + else + g_clear_error(&e); + return success; } @@ -1075,8 +1113,9 @@ retry_dialog: } #ifdef HAVE_OVIRT if (g_strcmp0(type, "ovirt") == 0) { - if (!create_ovirt_session(app, guri)) { - virt_viewer_app_simple_message_dialog(app, _("Couldn't open oVirt session")); + if (!create_ovirt_session(app, guri, &error)) { + virt_viewer_app_simple_message_dialog(app, _("Couldn't open oVirt session: %s"), error->message); + g_clear_error(&error); goto cleanup; } } else -- 1.9.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list