On 07/01/2014 23:41, Jesse Benedict wrote:
>
> I am setting up my own dev environment, but in the mean-time I would
> like to propose the following:
>
>  
>
> *PROPOSAL*
>
> Auto Ejection of All Mounted CDs
>
>  
>
> *PURPOSE*
>
> To make application of patches/hotfixes easier in large environments
> where ISO images may be mounted to VMs
>
>  
>
> *TARGET COMPONENTS*
>
> XE command line, ie:
>
> xe eject-all-isos
>
>  
>
> XenCenter (API call to eject-all-isos)
>
>  
>
> OR in our XSxxxxx.upadate package format as a pre-req script.
>

Looks very sensible and useful.

However, when scripting xe calls,
"params=some,list,of,parameter,you,are,interested,in" and "--minimal"
are your friends.  See inline below.

>  
>
> *EXAMPLE CODE*
>
> An example is a file I wrote, xe-eject-all-isos (using Bash for
> simplicity):
>
>  
>
> #!/bin/bash
>
>  
>
> echo "CHECKING"
>
>  
>
> # Get list of VMs from xe vm-list -- specifically UUID
>
> VMLIST=`xe vm-list is-control-domain=false | grep uuid | awk '{print $5}'`
>

VMLIST=$(xe vm-list is-control-domain=false params=uuid --minimal | tr
',' ' ')

should do that without grep or awk, (but sadly still using tr)

(Note for Ring3: It would be lovely for shell scripts to get a
space-delimited list from --minimal rather than comma-delimited, but I
cant see a convenient option for that)

>  
>
> # Loop through list and see if a DVD/CDROM is present
>
> for VMUUID in $VMLIST
>
> do
>
>      VMNAME=`xe vm-list uuid=$VMUUID | grep "name-label" | awk '{print
> $4}'`
>

VMNAME="$(xe vm-list uuid=$VMUUID params=name-label --minimal)"

You need to quote in case the VM name has spaces in.

>     ISOMOUNTED=`xe vm-cd-list uuid=$VMUUID | grep "empty" | awk
> '{print $4}'`
>

vm-cd-list doesn't take a uuid parameter, but then again doesn't appear
to function correctly.

Note for Ring3: This appears to be a bug (tested on XS 6.2 SP1).  `xe
vm-cd-list uuid=` tab completes to VM uuids, but rejects them, and the
help description doesn't mention uuid= as a valid parameter.  The help
text indicates that it accepts the meta-option "vm=", which works for vm
names, but not for vm uuids.  Running a bare `xe vm-cd-list` insists on
having the '--multiple' option, and (when provided) hands back a list of
vbd uuids of cds for each vm.

Also, unlike some of the other $FOO-list options, vm-cd-list doesn't
appear to like "params=".

Jesse:

Best as I can tell, you probably want:

ISOMOUNTED=$(xe vm-cd-list vm=$VMNAME | grep "empty" | awk '{print $4})

>  
>
>      if [ "$ISOMOUNTED" = "false" ] ; then
>
>            xe vm-cd-eject uuid=$VMUUID
>

xe vm-cd-eject also tab completes uuid= to VM uuids but rejects them,
and yet accepts vm=$VMNAME

>            echo "UNMOUNTED DVD/CD IMAGE FROM $VMNAME"
>
>      fi     
>
> done
>
>  
>
> # END
>
> echo "DONE"
>
>  
>
>  
>
>  
>
> Sincerely,
>

I occurs to me that all of this can be achieved with the single call

xe vm-cd-eject --multiple

So long as you are happy to accept

"operation failed on $VMUUID: Operation could not be performed because
the drive is empty"

for PV guests, and

"operation failed on $VMUUID: INTERNAL_ERROR: [ Cli_util.Cli_failure("No
CDs found") ]"

for HVM guests, when CDs are not actually present in the first place. 
(Again, tested on XS 6.2 SP1)


~Andrew
_______________________________________________
Xen-api mailing list
Xen-api@lists.xen.org
http://lists.xen.org/cgi-bin/mailman/listinfo/xen-api

Reply via email to