Message ID | 9ec32b9b363d11eb8c3f26a6921a31edbd64d183.1461082800.git.crobinso@redhat.com |
---|---|
State | Accepted |
Commit | 0d1579572a864c33621da4d01408f8bcb6de5d4a |
Headers | show |
On 04/19/2016 12:46 PM, Maxim Nestratov wrote: > 19.04.2016 19:22, 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 >> >> https://bugzilla.redhat.com/show_bug.cgi?id=1038304 >> --- >> v2: >> Use conventional function naming >> Improve a comment >> Handle 'vz' driver >> >> src/libvirt.c | 35 +++++++++++++++++++++++++++++++++++ >> 1 file changed, 35 insertions(+) > > ACK > Thanks, pushed patch this now - Cole -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
diff --git a/src/libvirt.c b/src/libvirt.c index a21d00e..919c9cb 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -928,6 +928,35 @@ virConnectGetDefaultURI(virConfPtr conf, } +/* + * Check to see if an invalid URI like qemu://system (missing /) was passed, + * offer the suggested fix. + */ +static int +virConnectCheckURIMissingSlash(const char *uristr, virURIPtr uri) +{ + /* To avoid false positives, only check drivers that mandate + a path component in the URI, like /system or /session */ + if (STRNEQ(uri->scheme, "qemu") && + STRNEQ(uri->scheme, "vbox") && + STRNEQ(uri->scheme, "vz")) + 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 +1024,12 @@ do_open(const char *name, NULLSTR(ret->uri->user), ret->uri->port, NULLSTR(ret->uri->path)); + if (virConnectCheckURIMissingSlash(alias ? alias : name, + ret->uri) < 0) { + VIR_FREE(alias); + goto failed; + } + VIR_FREE(alias); } else { VIR_DEBUG("no name, allowing driver auto-select");