diff mbox

[v2,1/2] Explicitly error on uri=qemu://system

Message ID 9ec32b9b363d11eb8c3f26a6921a31edbd64d183.1461082800.git.crobinso@redhat.com
State Accepted
Commit 0d1579572a864c33621da4d01408f8bcb6de5d4a
Headers show

Commit Message

Cole Robinson April 19, 2016, 4:22 p.m. UTC
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(+)

-- 
2.7.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Comments

Cole Robinson April 19, 2016, 9:52 p.m. UTC | #1
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 mbox

Patch

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");