[virt-tools-list] [PATCH v2 virt-viewer] Report more detail about oVirt connection failures
Christophe Fergeau
cfergeau at redhat.com
Wed Aug 27 08:07:27 UTC 2014
On Tue, Aug 26, 2014 at 04:49:02PM -0500, Jonathon Jongsma wrote:
> 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.
> ---
>
> I could have sworn that I had already sent this revised patch to the list, but
> I can't find any evidence of having sent it. Fixed issues from Christophe's
> earlier review.
>
> src/remote-viewer.c | 82 ++++++++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 62 insertions(+), 20 deletions(-)
>
> diff --git a/src/remote-viewer.c b/src/remote-viewer.c
> index cb43365..03998bf 100644
> --- a/src/remote-viewer.c
> +++ b/src/remote-viewer.c
> @@ -670,7 +670,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;
> @@ -683,16 +683,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(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + _("URI is not valid"));
I mentioned using g_set_error_litteral in my earlier review. Were there
some issues with it?
> return FALSE;
> + }
>
> if (g_strcmp0(uri->scheme, "ovirt") != 0) {
> xmlFreeURI(uri);
> + if (error)
> + *error = g_error_new(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(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + _("No virtual machine specified"));
> return FALSE;
> }
> g_return_val_if_fail(*uri->path == '/', FALSE);
> @@ -701,12 +714,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(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)
> @@ -789,7 +809,7 @@ virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app,
>
>
> static gboolean
> -create_ovirt_session(VirtViewerApp *app, const char *uri)
> +create_ovirt_session(VirtViewerApp *app, const char *uri, GError **err)
> {
> OvirtProxy *proxy = NULL;
> OvirtApi *api = NULL;
> @@ -815,12 +835,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, &error))
> goto error;
>
> + proxy = ovirt_proxy_new(rest_uri);
> g_object_set(proxy,
> "username", username,
> NULL);
> @@ -830,19 +848,29 @@ create_ovirt_session(VirtViewerApp *app, const char *uri)
>
> api = ovirt_proxy_fetch_api(proxy, &error);
> if (error != NULL) {
> - g_debug("failed to get oVirt 'api' collection: %s", error->message);
> + g_debug("Failed to get oVirt 'api' collection: %s", error->message);
> goto error;
> }
> vms = ovirt_api_get_vms(api);
> - ovirt_collection_fetch(vms, proxy, &error);
> - if (error != NULL) {
> + if (!ovirt_collection_fetch(vms, proxy, &error)) {
> g_debug("failed to lookup %s: %s", vm_name, error->message);
> goto error;
> }
> vm = OVIRT_VM(ovirt_collection_lookup_resource(vms, vm_name));
> - g_return_val_if_fail(vm != NULL, FALSE);
> + if (!vm) {
> + error = g_error_new(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + "Unable to find virtual machine '%s'",
> + vm_name);
> + g_debug("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) {
> + error = g_error_new(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + "oVirt VM %s is not running",
> + vm_name);
> g_debug("oVirt VM %s is not running", vm_name);
> goto error;
> }
> @@ -854,6 +882,9 @@ create_ovirt_session(VirtViewerApp *app, const char *uri)
>
> g_object_get(G_OBJECT(vm), "display", &display, NULL);
> if (display == NULL) {
> + error = g_error_new(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + _("Unable to get the display for the requested virtual machine"));
> goto error;
> }
>
> @@ -873,6 +904,10 @@ create_ovirt_session(VirtViewerApp *app, const char *uri)
> } else if (type == OVIRT_VM_DISPLAY_VNC) {
> session_type = "vnc";
> } else {
> + error = g_error_new(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + "Unknown display type: %d",
> + type);
> g_debug("Unknown display type: %d", type);
> goto error;
> }
> @@ -886,8 +921,12 @@ create_ovirt_session(VirtViewerApp *app, const char *uri)
> 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) {
> + error = g_error_new(VIRT_VIEWER_ERROR,
> + VIRT_VIEWER_ERROR_FAILED,
> + _("Unable to create session"));
> goto error;
> + }
>
> #ifdef HAVE_SPICE_GTK
> if (type == OVIRT_VM_DISPLAY_SPICE) {
> @@ -909,8 +948,6 @@ create_ovirt_session(VirtViewerApp *app, const char *uri)
> }
> #endif
>
> - success = TRUE;
> -
> error:
> g_free(username);
> g_free(rest_uri);
> @@ -921,8 +958,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)
> @@ -932,6 +967,12 @@ error:
> if (proxy != NULL)
> g_object_unref(proxy);
>
> + success = (error == NULL);
> + if (err)
> + *err = error;
> + else
> + g_clear_error(&error);
same comment about using g_set_error which should remove the need for
this bit of code.
> +
> return success;
> }
>
> @@ -1158,8 +1199,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 at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20140827/3267b11a/attachment.sig>
More information about the virt-tools-list
mailing list