[libvirt] PATCH: Improve URI error reporting

Daniel Veillard veillard at redhat.com
Thu Jun 11 15:49:55 UTC 2009


On Wed, Jun 03, 2009 at 05:31:13PM +0100, Daniel P. Berrange wrote:
> There are currently far too many cases where a correct URI returns an
> generic 'failed to connect to hypervisor' error message. This gives the
> user no idea why they could not connect. Of particular importance is
> that they cannot distinguish a correct URI + plus a driver problem, vs
> incorrect URI. Consider the following examples
[...]
> The core problem here is that far too many places are using the return
> code VIR_DRV_OPEN_DECLINED instead of VIR_DRV_OPEN_ERROR. The former
> provides no way to give any error info to the user. With this patch
> I have taken the view that a driver must *only* ever use the return
> code VIR_DRV_OPEN_DECLINED when:
> 
>   - Auto-probe of a driver URI, and this driver is not active
>   - Explicit URI with 'server' specified
>   - URI scheme does not match the driver

  okay

> The remote driver is special in that it *must* accept all URIs given to

  As long as we check first it's a correct URI...

> it, no matter what, unless of course it is running inside the daemon
> already. The result is that if you give a correct URI, but there is a
> real problem opening the driver you are now guarenteed to get a useful
> error message back. Consider the same examples again

  yup that looks way better

[...]
> -static int openvzProbe(void)
> -{
> -    if (geteuid() == 0 &&
> -        virFileExists("/proc/vz"))
> -        return 1;
> -
> -    return 0;
> -}
> -
>  static virDrvOpenStatus openvzOpen(virConnectPtr conn,
>                                     virConnectAuthPtr auth ATTRIBUTE_UNUSED,
>                                     int flags ATTRIBUTE_UNUSED)
>  {
>      struct openvz_driver *driver;
> -    if (!openvzProbe())
> -        return VIR_DRV_OPEN_DECLINED;
>  
>      if (conn->uri == NULL) {
> +        if (!virFileExists("/proc/vz"))
> +            return VIR_DRV_OPEN_DECLINED;
> +
> +        if (access("/proc/vz", W_OK) < 0)
> +            return VIR_DRV_OPEN_DECLINED;
> +

  Okay I was confused at first about dropping geteuid() == 0 check but
it's a more specific check,

>          conn->uri = xmlParseURI("openvz:///system");
>          if (conn->uri == NULL) {
> -            openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
> +            virReportOOMError(conn);

  Hum ... okay .

[...]
> --- a/src/remote_internal.c	Wed Jun 03 15:37:52 2009 +0100
> +++ b/src/remote_internal.c	Wed Jun 03 17:31:17 2009 +0100
> @@ -305,21 +305,28 @@ remoteForkDaemon(virConnectPtr conn)
>  
>  enum virDrvOpenRemoteFlags {
>      VIR_DRV_OPEN_REMOTE_RO = (1 << 0),
> -    VIR_DRV_OPEN_REMOTE_UNIX = (1 << 1),
> -    VIR_DRV_OPEN_REMOTE_USER = (1 << 2),
> -    VIR_DRV_OPEN_REMOTE_AUTOSTART = (1 << 3),
> -};
> -
> -/* What transport? */
> -enum {
> -    trans_tls,
> -    trans_unix,
> -    trans_ssh,
> -    trans_ext,
> -    trans_tcp,
> -} transport;
> -
> -
> +    VIR_DRV_OPEN_REMOTE_USER      = (1 << 1), /* Use the per-user socket path */
> +    VIR_DRV_OPEN_REMOTE_AUTOSTART = (1 << 2), /* Autostart a per-user daemon */
> +};
> +
> +
> +/*
> + * URIs that this driver needs to handle:
> + *
> + * The easy answer:
> + *   - Everything that no one else has yet claimed, but nothing if
> + *     we're inside the libvirtd daemon
> + *
> + * The hard answer:
> + *   - Plain paths (///var/lib/xen/xend-socket)  -> UNIX domain socket
> + *   - xxx://servername/      -> TLS connection
> + *   - xxx+tls://servername/  -> TLS connection
> + *   - xxx+tls:///            -> TLS connection to localhost
> + *   - xxx+tcp://servername/  -> TCP connection
> + *   - xxx+tcp:///            -> TCP connection to localhost
> + *   - xxx+unix:///           -> UNIX domain socket
> + *   - xxx:///                -> UNIX domain socket
> + */
>  static int
>  doRemoteOpen (virConnectPtr conn,
>                struct private_data *priv,
> @@ -328,37 +335,51 @@ doRemoteOpen (virConnectPtr conn,
>  {
>      int wakeupFD[2] = { -1, -1 };
>      char *transport_str = NULL;
> +    enum {
> +        trans_tls,
> +        trans_unix,
> +        trans_ssh,
> +        trans_ext,
> +        trans_tcp,
> +    } transport;

  hum ... I would have expected this to remain global somehow, but
  thinking about it, fine :-)


  Okay, the changes are larger than I would have expected but it's
  similar for all drivers. Looks fine, ACK

    thanks !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list