[virt-tools-list] [PATCH virt-viewer 1/2] virt-viewer: Allow more precise VM selection

Daniel P. Berrange berrange at redhat.com
Thu Mar 2 09:44:16 UTC 2017


On Fri, Feb 24, 2017 at 03:57:23PM +0100, Pavel Grunt wrote:
> Theoretically a VM name can be a valid VM id or uuid. In that case
> connecting to the VMs may be problematic since virt-viewer selects
> the VM by its id then by uuid if not found then by its name.
> 
> Introduce new command line options to cover this situation:
>  "--domain-name" to connect to the VM by its name
>  "--id" to connect to the VM by its id
>  "--uuid" to connect to the VM by its uuid
> The options are mutually exclusive
> 
> Resolves: rhbz#1399077
> ---
>  man/virt-viewer.pod | 14 ++++++++
>  src/virt-viewer.c   | 97 +++++++++++++++++++++++++++++++++++++++++++++++------
>  2 files changed, 101 insertions(+), 10 deletions(-)
> 
> diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod
> index 9abf03c..30af8db 100644
> --- a/man/virt-viewer.pod
> +++ b/man/virt-viewer.pod
> @@ -122,6 +122,20 @@ kiosk-quit option to "on-disconnect" value, virt-viewer will quit
>  instead. Please note that --reconnect takes precedence over this
>  option, and will attempt to do a reconnection before it quits.
>  
> +=item --id, --uuid, --domain-name
> +
> +Connect to the virtual machine by its id, uuid or name. These options
> +are mutual exclusive. For example the following command may sometimes
> +connect to a virtual machine with the id 2 or with the name 2 (depending
> +on the number of running machines):
> +
> +    virt-viewer 2
> +
> +To always connect to the virtual machine with the name "2" use the
> +"--domain-name" option:
> +
> +    virt-viewer --domain-name 2
> +
>  =back
>  
>  =head1 CONFIGURATION
> diff --git a/src/virt-viewer.c b/src/virt-viewer.c
> index 1f99552..6bc9b6d 100644
> --- a/src/virt-viewer.c
> +++ b/src/virt-viewer.c
> @@ -82,6 +82,46 @@ static gboolean opt_attach = FALSE;
>  static gboolean opt_waitvm = FALSE;
>  static gboolean opt_reconnect = FALSE;
> 
> +typedef enum {
> +    DOMAIN_SELECTION_NONE,
> +    DOMAIN_SELECTION_NAME,
> +    DOMAIN_SELECTION_ID,
> +    DOMAIN_SELECTION_UUID,
> +} DomainSelection;


> +    switch (domain_selection_type) {
> +    default: /* DOMAIN_SELECTION_NONE */
> +    case DOMAIN_SELECTION_ID:
> +        id = strtol(priv->domkey, &end, 10);
> +        if (id >= 0 && end && !*end) {
> +            dom = virDomainLookupByID(priv->conn, id);
> +        }
> +        if (domain_selection_type != DOMAIN_SELECTION_NONE) {
> +            break;
> +        }
> +        /* fallthrough */
> +    case DOMAIN_SELECTION_UUID:
> +        if (!dom && virt_viewer_parse_uuid(priv->domkey, uuid) == 0) {
> +            dom = virDomainLookupByUUID(priv->conn, uuid);
> +        }
> +        if (domain_selection_type != DOMAIN_SELECTION_NONE) {
> +            break;
> +        }
> +        /* fallthrough */
> +    case DOMAIN_SELECTION_NAME:
> +        if (!dom) {
> +            dom = virDomainLookupByName(priv->conn, priv->domkey);
> +        }
>      }
> +
>      return dom;
>  }

IMHO using a switch here isn't really helping particularly with the
tricks to allow fallthrough, except when you don't want to allow
fallthrough.

I think this can be made nicer with a different approach that uses
the enum as a bitfield. eg psuedo code...

   int selection = 0;

   if (--domain is set) {
     selection |= DOMAIN_SELECTION_DOMAIN;
   } else if (--uuid is set) {
     selection |= DOMAIN_SELECTION_UUID;
   } else if (--id is set) {
     selection |= DOMAIN_SELECTION_ID;
   }

   if (!selection) {
     selection = DOMAIN_SELECTION_DOMAIN |
                 DOMAIN_SELECTION_UUID |
		 DOMAIN_SELECTION_ID;
   }


   if (selection & DOMAIN_ID) {
       dom = ...lookup by id...
       if (dom)
         selection = 0;
   }
   if (selection & DOMAIN_UUID) {
       dom = ...lookup by uuid...
       if (dom)
         selection = 0;
   }
   if (selection & DOMAIN_NAME) {
       dom = ...lookup by name...
       if (dom)
         selection = 0;
   }

This also avoids the issue with the switch potentially generating
fallthrough warnings under gcc7.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://entangle-photo.org       -o-    http://search.cpan.org/~danberr/ :|




More information about the virt-tools-list mailing list