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

Daniel P. Berrangé berrange at redhat.com
Mon Jul 29 13:46:04 UTC 2019


On Mon, Jul 29, 2019 at 10:33:08AM +0200, Andrea Bolognani wrote:
> 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

It is handling the remote driver case for virtproxyd, but we could
make that more explicit.

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

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list