[libvirt] [PATCH] Explicitly error on uri=qemu://system

Maxim Nestratov mnestratov at virtuozzo.com
Tue Apr 19 07:59:51 UTC 2016


19.04.2016 2:04, Cole Robinson пишет:

> It's a fairly common error that a user tries to connect to a URI
> like qemu://system or qemu://session (missing a slash). This errors
> like:
>
> $ virsh --connect qemu://session
> error: failed to connect to the hypervisor
> error: Unable to resolve address 'session' service '16514': No address associated with hostname
>
> If you already know that the standard qemu URI has 3 slashes, that
> error will make it obvious enough. But new user's may not get it.
> There's even a RHEL support page explicitly mentioning it!:
>
> https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-Troubleshooting-Common_libvirt_errors_and_troubleshooting.html
>
> Catch this error early in libvirt.c virConnectOpen for qemu (and vbox
> which has similar rules

Please, add 'vz' also as it suffers from the problem too. Though it 
doesn't support vz:///session it clearly says about it in the error message.

>
> https://bugzilla.redhat.com/show_bug.cgi?id=1038304
> ---
>   src/libvirt.c | 32 ++++++++++++++++++++++++++++++++
>   1 file changed, 32 insertions(+)
>
> diff --git a/src/libvirt.c b/src/libvirt.c
> index a21d00e..7607ae3 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -928,6 +928,33 @@ virConnectGetDefaultURI(virConfPtr conf,
>   }
>   
>   
> +/*
> + * Check to see if an invalid URI like qemu://system (missing /) was passed,
> + * offer the suggested fix.
> + */
> +static int
> +check_uri_missing_slash(const char *uristr, virURIPtr uri)
> +{
> +    /* These drivers _only_ accepts URIs with a 'path' element */
> +    if (STRNEQ(uri->scheme, "qemu") &&
> +        STRNEQ(uri->scheme, "vbox"))
> +        return 0;
> +
> +    if (uri->path != NULL)
> +        return 0;
> +
> +    if (STREQ(uri->server, "session") ||
> +        STREQ(uri->server, "system")) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("invalid URI %s (maybe you want %s:///%s)"),
> +                       uristr, uri->scheme, uri->server);
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +
>   static virConnectPtr
>   do_open(const char *name,
>           virConnectAuthPtr auth,
> @@ -995,6 +1022,11 @@ do_open(const char *name,
>                     NULLSTR(ret->uri->user), ret->uri->port,
>                     NULLSTR(ret->uri->path));
>   
> +        if (check_uri_missing_slash(alias ? alias : name, ret->uri) < 0) {
> +            VIR_FREE(alias);
> +            goto failed;
> +        }
> +
>           VIR_FREE(alias);
>       } else {
>           VIR_DEBUG("no name, allowing driver auto-select");




More information about the libvir-list mailing list