[libvirt] [PATCH 36/41] remote: open secondary drivers via remote driver if needed

Andrea Bolognani abologna at redhat.com
Mon Jul 29 08:33:08 UTC 2019


On Tue, 2019-07-23 at 17:03 +0100, Daniel P. Berrangé wrote:
[...]
> +++ b/src/remote/remote_daemon_dispatch.c
> @@ -1954,18 +1954,35 @@ remoteGetHypervisorConn(virNetServerClientPtr client)
>  }
>  
>  
> +static virConnectPtr
> +remoteGetSecondaryConn(bool readonly, virConnectPtr *conn, const char *uri)

We seem to mostly have a single empty line between functions in this
file, so please stick to that style. Also, have each argument on its
own line.

Additional comments: it personally would make more sense to me if
readonly was the last argument, though I won't object if you prefer
keeping it this way; however, the way you return the connection
pointer in addition to storing it in the user-provided location looks
weird to me.

You could have

  static bool
  remoteGetSecondaryConn(virConnectPtr *conn,
                         const char *uri,
                         bool readonly)

or actually even

  static void
  remoteGetSecondaryConn(virConnectPtr *conn,
                         const char *uri,
                         bool readonly)

since you're not doing any additional check on the return value in
the caller. Then...

[...]
>  static virConnectPtr
>  remoteGetInterfaceConn(virNetServerClientPtr client)
>  {
>      struct daemonClientPrivate *priv =
>          virNetServerClientGetPrivateData(client);
>  
> -    if (!priv->interfaceConn) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("hypervisor connection not open"));
> -        return NULL;
> -    }
> -
> -    return priv->interfaceConn;
> +    return remoteGetSecondaryConn(priv->readonly, &priv->interfaceConn, priv->interfaceURI);

... you could leave the 'return' statement alone, and just replace
the check on priv->xxxConn with a call to remoteGetSecondaryConn().

[...]
>  }
>  
>  
> +
>  void *remoteClientNew(virNetServerClientPtr client,
>                        void *opaque ATTRIBUTE_UNUSED)

Unrelated whitespace change.

[...]
> @@ -2093,20 +2089,70 @@ remoteDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
> +    VIR_DEBUG("Opening driver %s", name);
> +    if (!(priv->conn = priv->readonly ?
> +          virConnectOpenReadOnly(name) :
> +          virConnectOpen(name)))
> +        goto cleanup;
> +    VIR_DEBUG("Opened %p", priv->conn);

Ewww. Please get rid of the Elvis operator and just use a regular
if/else instead.

> +
> +#ifndef LIBVIRTD
> +    if (!(type = virConnectGetType(priv->conn)))
> +        goto cleanup;
> +
> +    VIR_DEBUG("Primary driver type is '%s'", type);
> +    if (STREQ(type, "QEMU") ||
> +        STREQ(type, "LIBXL") ||
> +        STREQ(type, "LXC") ||
> +        STREQ(type, "VBOX") ||
> +        STREQ(type, "bhyve") ||
> +        STREQ(type, "vz") ||
> +        STREQ(type, "Parallels")) {

Wait, we store the connection type as a string? Ewww.

> +        VIR_DEBUG("Hypervisor driver found, setting URIs for secondary drivers");
> +        priv->interfaceURI =  getuid() == 0 ? "interface:///system" : "interface:///session";
> +        priv->networkURI = getuid() == 0 ? "network:///system" : "network:///session";
> +        priv->nodedevURI =  getuid() == 0 ? "nodedev:///system" : "nodedev:///session";
> +        if (getuid() == 0)
> +            priv->nwfilterURI = "nwfilter:///system";
> +        priv->secretURI = getuid() == 0 ? "secret:///system" : "secret:///session";
> +        priv->storageURI = getuid() == 0 ? "storage:///system" : "storage:///session";

Lots of repeated calls to getuid() and lots of Elvis operators
here... I would rewrite it along the lines of

  if (getuid() == 0) {
      priv->interfaceURI = "interface:///system";
      priv->networkURI = "network:///system";
      priv->nodedevURI = "nodedev:///system";
      priv->secretURI = "secret:///system";
      priv->storageURI = "storage:///system";
      priv->nwfilterURI = "nwfilter:///system";
  } else {
      priv->interfaceURI = "interface:///session";
      priv->networkURI = "network:///session";
      priv->nodedevURI = "nodedev:///session";
      priv->secretURI = "secret:///session";
      priv->storageURI = "storage:///session";
      /* No session URI for the nwfilter driver */
  }

[...]
> +    } else if (STREQ(type, "storage")) {
> +        VIR_DEBUG("Storage driver found");
> +        priv->storageConn = virObjectRef(priv->conn);
> +
> +        /* Co-open the secret driver, as apps using the storage driver may well
> +         * need access to secrets for storage auth
> +         */
> +        priv->secretURI = getuid() == 0 ? "secret:///system" : "secret:///session";

Again, lose the Elvis operator.

Could there be other dependencies like this one we might be missing?
I guess we're gonna find out as people start using this :)

> +    } else {
> +#endif /* LIBVIRTD */

The comment should be "! LIBVIRTD". Same below.

> +        VIR_DEBUG("Pointing secondary drivers to primary");
> +        priv->interfaceConn = virObjectRef(priv->conn);
> +        priv->networkConn = virObjectRef(priv->conn);
> +        priv->nodedevConn = virObjectRef(priv->conn);
> +        priv->nwfilterConn = virObjectRef(priv->conn);
> +        priv->secretConn = virObjectRef(priv->conn);
> +        priv->storageConn = virObjectRef(priv->conn);

Do we even need this code for the non-libvirtd case? We have listed
all drivers, primary and secondary, above, so I can't think of any
valid reason we'd end up here unless there's a bug, and in that case
we'd just be masking it, no? So the structure should be more like

  #ifdef LIBVIRTD
  /* point all secondary drivers to primary */
  #else /* ! LIBVIRTD */
  if (STREQ(type, ...) {
      ...
  } else if (STREQ(type, ...) {
  ...
  } else {
      /* freak out */
  }
  #endif /* ! LIBVIRTD */

-- 
Andrea Bolognani / Red Hat / Virtualization




More information about the libvir-list mailing list