I had a customer who tried to use this script, but it didn't work.  I
made some modifications to the control script.  Additionally, the
customer wanted to start/stop multiple machines.  The solution
implemented makes the Resource Agent a simple script -- vmstart_all --
that makes multiple calls to vmstart in order to start/stop the virtual
machines.  Here is vmstart_all:

#!/bin/bash
VMSTARTDIR="/etc/ha.d/resource.d"
# Start up multiple virtual machines
# enter one per line in the following format:
# $VMSTARTDIR/vmstart $1 directoryname
#
# where directoryname is the name of the
# directory that contains a .vmx file
$VMSTARTDIR/vmstart $1 vm1
$VMSTARTDIR/vmstart $1 vm2

And here's the patch for vmstart:
--- vmstart.20081114    2008-12-18 11:02:30.000000000 -0500
+++ vmstart    2008-12-18 11:12:45.000000000 -0500
@@ -31,79 +31,106 @@
 #################################################################
 
 # Source ocf shell functions
-#. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
-. /usr/lib64/heartbeat/ocf-shellfuncs
-#. /etc/ha.d/shellfuncs
+OCF_ROOT=/usr/lib/ocf
+. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
+#. /usr/lib64/heartbeat/ocf-shellfuncs
+. /etc/ha.d/shellfuncs
+
 # Basic variables configuration
 #################################################################
 
 # Path to the virtual machine configuration file
-VMXPATH="$OCF_RESKEY_vmxpath"
+#VMXPATH="$OCF_RESKEY_vmxpath"
+VMXPATH="/mnt/vmware/$2"
 
 # Path to the vmware-vim-cmd executable
-VIMSHBIN="$OCF_RESKEY_vimshbin"
+#VIMSHBIN="$OCF_RESKEY_vimshbin"
+VIMSHBIN="/usr/bin/vmware-vim-cmd"
+
+# Additional options to pass to vmware-vim-cmd executable
+VIMSHBINOPTS="-H localhost -O 904"
+
+# Print usage summary
+vmware_usage() {
+cat <<EOF
+usage: $0 VMDIR {start|stop|status|monitor|meta-data|validate-all}
+
+VMDIR    A directory under $VMXPATH that contains a virtual machine.
+EOF
+}
+
+# Check for two parameters
+if [ "$2" == "" ]; then
+  vmware_usage
+  exit 0
+fi
+
 
 # vmware-vim-cmd functions
 #################################################################
 
 # Get virtual machine vid
 vmware_get_vid() {
-$VIMSHBIN vmsvc/getallvms 2>/dev/null | awk '/\/'"$1"'/ {print $1}'
+$VIMSHBIN $VIMSHBINOPTS vmsvc/getallvms 2>/dev/null | awk '/\/'"$1"'/
{print $1}'
 }
 
 # Is the vm waiting for input after a migration?
 vmware_uuid_alt() {
-$VIMSHBIN vmsvc/message $1 2>/dev/null | awk /^msg.uuid.altered/
+$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 2>/dev/null | awk
/^msg.uuid.altered/
 }
 
 # Get message id
 vmware_get_msgid() {
-$VIMSHBIN vmsvc/message $1 2>/dev/null | awk '/^Virtual machine
message/ {print $4}' | awk -F : '{print $1}'
+$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 2>/dev/null | awk '/^Virtual
machine message/ {print $4}' | awk -F : '{print $1}'
 }
 
 # Answers message
 vmware_answer_msg() {
-$VIMSHBIN vmsvc/message $1 $2 $3 &> /dev/null
+$VIMSHBIN $VIMSHBINOPTS vmsvc/message $1 $3 $4 &> /dev/null
 }
 
 # Register a virtual machine
 vmware_register_vm() {
-$VIMSHBIN solo/registervm '"'$1'"' &> /dev/null
+$VIMSHBIN $VIMSHBINOPTS solo/registervm '"'$1'"' &> /dev/null
 }
 
 # Unregister a virtual machine
 vmware_unregister_vm() {
-$VIMSHBIN vmsvc/unregister $1 &> /dev/null
+$VIMSHBIN $VIMSHBINOPTS vmsvc/unregister $1 &> /dev/null
 }
 
 # Start a virtual machine
 vmware_poweron_vm() {
-$VIMSHBIN vmsvc/power.on $1 &> /dev/null
+$VIMSHBIN $VIMSHBINOPTS vmsvc/power.on $1 &> /dev/null
 }
 
 # Suspend a virtual machine
 vmware_suspend_vm() {
-$VIMSHBIN vmsvc/power.suspend $1 &> /dev/null
+$VIMSHBIN $VIMSHBINOPTS vmsvc/power.suspend $1 &> /dev/null
 }
 
 # Get virtual machine power state
 vmware_get_status() {
-$VIMSHBIN vmsvc/power.getstate $1 2>/dev/null | awk '/^Powered on/ ||
/^Powered off/ || /^Suspended/'
+$VIMSHBIN $VIMSHBINOPTS vmsvc/power.getstate $1 2>/dev/null | awk
'/^Powered on/ || /^Powered off/ || /^Suspended/'
 }
 
 # Get vid of missing virtual machines
 vmware_get_broken() {
-$VIMSHBIN vmsvc/getallvm 2>&1 | awk -F "'" '/^Skipping/ {print $2}'
+$VIMSHBIN $VIMSHBINOPTS vmsvc/getallvm 2>&1 | awk -F "'" '/^Skipping/
{print $2}'
 }
 
 # Variables depending on the above functions
 #################################################################
 
 # Directory containing the virtual machine
-VMXDIR="`dirname "$VMXPATH"`"
+#VMXDIR="`dirname "$VMXPATH"`"
+VMXDIR=$VMXPATH
 
 # Basename of the configuration file
-RELVMXPATH="`basename "$VMXPATH"`"
+#RELVMXPATH="`basename "$VMXPATH"`"
+RELVMXPATH=`basename "$(ls -1 $VMXPATH/*.vmx 2>/dev/null| head -n1)"
2>/dev/null`
+
+VMXPATH=$VMXDIR/$RELVMXPATH
 
 # Vid of the virtual machine (can be empty if the vm is not registered)
 VMID=`vmware_get_vid "$RELVMXPATH"`
@@ -120,15 +147,6 @@
 # Main functions
 #################################################################
 
-# Print usage summary
-vmware_usage() {
-cat <<END
-usage: $0 {start|stop|status|monitor|meta-data|validate-all}
-
-Expects to have a fully populated OCF RA-compliant environment set.
-END
-}
-
 # Check for mandatory files presence and consistency
 vmware_validate() {
 if [ -z "`pidof vmware-hostd`" ]; then
@@ -182,7 +200,7 @@
 if [ -z "$VMID" ]; then
 # VM is not registered, need to register
 ocf_log info "Virtual machine $VM is not registered"
-ocf_log info "Registering Virtual machine $VM"
+ocf_log info "Registering Virtual machine $VM  >>>> $VMXPATH"
 vmware_register_vm "$VMXPATH"
 VMID=`vmware_get_vid "$RELVMXPATH"`
 if [ -z "$VMID" ]; then
@@ -269,7 +287,7 @@
 
 # Print metadata informations
 meta_data() {
-cat <<END
+cat <<EOF
 <?xml version="1.0"?>
 <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
 <resource-agent name="vmwarevm">
@@ -305,7 +323,7 @@
 <action name="meta-data" timeout="5" />
 </actions>
 </resource-agent>
-END
+EOF
 }
 
 # See how we were called
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems

Reply via email to