Cristian Mammoli - Apra Sistemi wrote:
Cristian Mammoli - Apra Sistemi wrote:
Final (hopefully) touches:
set OCF_RESKEY_vimshbin as optional. $VIMSHBIN will falback to the
standard location (/usr/bin/vmware-vim-cmd) if the var is not declared.
Thanks to Rasto for pointing it out on the Pacemaker list.
--
Cristian Mammoli
APRA SISTEMI srl
Via Brodolini,6 Jesi (AN)
tel dir. 0731 719822
Web www.apra.it
e-mail [email protected]
--- vmware.old 2010-03-01 23:32:26.000000000 +0100
+++ vmware 2010-03-02 16:18:39.000000000 +0100
@@ -2,30 +2,35 @@
#
# VMware OCF resource agent
#
-# Copyright (c) 2008 Apra Sistemi s.r.l.
+# Copyright (c) 2010 Apra Sistemi s.r.l.
# All Rights Reserved.
#
-# Description: Manages a VMware server 2.0 as a High-Availability
-# resource
+# Description: Manages VMware server 2.0 virtual machines
+# as High-Availability resources
#
#
# Author: Cristian Mammoli <c.mammoli AT apra DOT it>
# License: GNU General Public License (GPL)
-# Copyright: (C) 2008 Apra Sistemi s.r.l.
+# Copyright: (C) 2010 Apra Sistemi s.r.l.
#
# See usage() function below for more details...
#
# OCF instance parameters:
-# * OCF_RESKEY_VMXPATH (mandatory, full path to the virtual machine vmx file)
-# * OCF_RESKEY_VIMSHBIN (mandatory, full path to th vmware-vim-cmd executable)
+# * OCF_RESKEY_vmxpath (mandatory: full path to the virtual machine vmx file)
+# * OCF_RESKEY_vimshbin (optional: full path to the vmware-vim-cmd executable,
+# fallback to default location if not declared)
#
# Requirements/caveats:
-# * vmware-server 2.0 RC1 installed and autostarted on all nodes
+# * vmware-server 2.0 installed and autostarted on all nodes
# * vmdk files must be in the same directory of the vmx file
# * vmx filenames must be unique, even if stored in different directories
# * Default_Action_Timeout stock value (20 sec) isn't enough if you are
-# dealing with many virtual machines: raise it to something around 300 secs
+# dealing with many virtual machines: raise it to something around 600 secs
# or use operation attributes with the proposed values
+# * Moving a vm among nodes will cause its mac address to change: if you need
+# to preserve the mac address set it manually in the nic options
+# * The script should be able to deal with paths and filenames with spaces,
+# anyway try to avoid it
# Initialization
#################################################################
@@ -41,9 +46,10 @@
VMXPATH="$OCF_RESKEY_vmxpath"
# Path to the vmware-vim-cmd executable
-VIMSHBIN="$OCF_RESKEY_vimshbin"
+# fallback to the default path if not declared
+VIMSHBIN="${OCF_RESKEY_vimshbin-/usr/bin/vmware-vim-cmd}"
-# global variables
+# Global variables
VMXDIR=
RELVMXPATH=
VMID=
@@ -55,64 +61,64 @@
# Get virtual machine vid
vmware_get_vid() {
- $VIMSHBIN vmsvc/getallvms 2>/dev/null \
+ $VIMSHBIN vmsvc/getallvms \
| awk '/\/'"$1"'/ {print $1}'
}
# Is the vm waiting for input after a migration?
vmware_uuid_alt() {
- $VIMSHBIN vmsvc/message $1 2>/dev/null \
+ $VIMSHBIN vmsvc/message $1 \
| 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 vmsvc/message $1 \
+ | awk '/^Virtual machine message/ {print $4}' \
+ | awk -F : '{print $1}'
}
# Answers message
vmware_answer_msg() {
- $VIMSHBIN vmsvc/message $1 $2 $3 >/dev/null 2>&1
+ $VIMSHBIN vmsvc/message $1 $2 $3 >/dev/null
}
# Register a virtual machine
vmware_register_vm() {
- $VIMSHBIN solo/registervm '"'$1'"' >/dev/null 2>&1
+ $VIMSHBIN solo/registervm '"'$1'"' >/dev/null
}
# Unregister a virtual machine
vmware_unregister_vm() {
- $VIMSHBIN vmsvc/unregister $1 >/dev/null 2>&1
+ $VIMSHBIN vmsvc/unregister $1 >/dev/null
}
# Start a virtual machine
vmware_poweron_vm() {
- $VIMSHBIN vmsvc/power.on $1 >/dev/null 2>&1
+ $VIMSHBIN vmsvc/power.on $1 >/dev/null
}
# Suspend a virtual machine
vmware_suspend_vm() {
- $VIMSHBIN vmsvc/power.suspend $1 >/dev/null 2>&1
+ $VIMSHBIN vmsvc/power.suspend $1 >/dev/null
}
# Get virtual machine power state
vmware_get_status() {
- $VIMSHBIN vmsvc/power.getstate $1 2>/dev/null \
+ $VIMSHBIN vmsvc/power.getstate $1 \
| 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}'
+ | awk -F \' '/^Skipping/ {print $2}'
}
# Variables depending on the above functions
#################################################################
-set_environment() {
+vmware_set_env() {
# Directory containing the virtual machine
VMXDIR="`dirname "$VMXPATH"`"
@@ -126,7 +132,7 @@
VM="`awk -F '"' '/^displayName/ {print $2}' "$VMXPATH"`"
# msg.autoAnswer value in config file
- VMAUTOMSG="`awk -F '"' '/^msg.autoAnswer/ {print $2}' "$VMXPATH"`"
+ VMAUTOMSG="`awk -F '"' '/^msg.autoAnswer/ {print toupper($2)}' "$VMXPATH"`"
}
# Main functions
@@ -141,27 +147,30 @@
END
}
-# Check for dependencies
# Check for mandatory files presence and consistency
vmware_validate() {
if [ -z "`pidof vmware-hostd`" ]; then
- ocf_log warn "vmware-hostd is not running"
- return $OCF_ERR_GENERIC
+ ocf_log err "vmware-hostd is not running"
+ exit $OCF_ERR_GENERIC
fi
if [ ! -x "$VIMSHBIN" ]; then
- ocf_log warn "vmware-vimsh executable missing or not in path ($VIMSHBIN)"
- return $OCF_ERR_INSTALLED
+ ocf_log err "vmware-vim-cmd executable missing or not in path ($VIMSHBIN)"
+ exit $OCF_ERR_ARGS
fi
if [ ! -f "$VMXPATH" ]; then
- ocf_log warn "Specified vmx file ($VMXPATH) does not exist"
- return $OCF_ERR_ARGS
+ ocf_log err "Specified vmx file ($VMXPATH) does not exist"
+ exit $OCF_ERR_ARGS
fi
+ # Now we can safely setup variables...
+ vmware_set_env
+
+ # ... and verify them
if [ -z "$VM" ]; then
- ocf_log warn "Could not find out virtual machine name"
- return $OCF_ERR_ARGS
+ ocf_log err "Could not find out virtual machine name"
+ exit $OCF_ERR_ARGS
fi
if [ "$VMAUTOMSG" != "TRUE" ]; then
@@ -174,6 +183,22 @@
return $OCF_SUCCESS
}
+# More relaxed checking in case of probes
+vmware_validate_probe() {
+ if [ ! -x "$VIMSHBIN" ]; then
+ ocf_log warn "vmware-vim-cmd executable missing or not in path ($VIMSHBIN)"
+ exit $OCF_NOT_RUNNING
+ fi
+
+ if [ ! -f "$VMXPATH" ]; then
+ ocf_log warn "Specified vmx file ($VMXPATH) does not exist"
+ exit $OCF_NOT_RUNNING
+ fi
+
+ # Now we can safely setup variables...
+ vmware_set_env
+}
+
# Start a virtual machine
vmware_start() {
# Don't start a VM if it's already running
@@ -198,7 +223,7 @@
vmware_register_vm "$VMXPATH"
VMID=`vmware_get_vid "$RELVMXPATH"`
if [ -z "$VMID" ]; then
- ocf_log err "Could not register virtual machine $VM: aborting."
+ ocf_log err "Could not register virtual machine $VM"
exit $OCF_ERR_GENERIC
fi
ocf_log info "Virtual machine $VM registered with ID $VMID"
@@ -221,7 +246,7 @@
# Check if the VM is running. We don't bother
# with timeouts: we rely on the CRM for that.
while :; do
- vmware_monitor && break
+ vmware_monitor && break
ocf_log info "Virtual machine $VM is still stopped: delaying 10 seconds"
sleep 10
done
@@ -253,13 +278,17 @@
else
ocf_log info "Virtual machine $VM is already stopped"
fi
+ # VMware randomly fails to unregister VMs,
+ # so we loop until we have success or timeout
ocf_log info "Unregistering virtual machine $VM"
vmware_unregister_vm $VMID
VMID=`vmware_get_vid "$RELVMXPATH"`
- if [ -n "$VMID" ]; then
- ocf_log err "Could not unregister virtual machine $VM: aborting."
- exit $OCF_ERR_GENERIC
- fi
+ while [ -n "$VMID" ]; do
+ ocf_log warn "Could not unregister virtual machine $VM: retrying."
+ sleep 10
+ vmware_unregister_vm $VMID
+ VMID=`vmware_get_vid "$RELVMXPATH"`
+ done
ocf_log info "Virtual machine $VM is stopped"
return $OCF_SUCCESS
fi
@@ -267,7 +296,7 @@
# Monitor a virtual machine
vmware_monitor() {
- if [ "`vmware_get_status $VMID`" = "Powered on" ]; then
+ if [ -n "$VMID" ] && [ "`vmware_get_status $VMID`" = "Powered on" ]; then
ocf_log debug "Virtual machine $VM (ID $VMID) is running..."
return $OCF_SUCCESS
else
@@ -278,11 +307,11 @@
# Print metadata informations
meta_data() {
- cat <<END
+ cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="vmware">
-<version>0.1</version>
+<version>0.2</version>
<longdesc lang="en">
OCF compliant script to control vmware server 2.0 virtual machines.
</longdesc>
@@ -297,19 +326,19 @@
<content type="string"/>
</parameter>
-<parameter name="vimshbin" unique="0" required="1">
+<parameter name="vimshbin" unique="0" required="0">
<longdesc lang="en">
vmware-vim-cmd executable path
</longdesc>
-<shortdesc lang="en">vmware-vimsh path</shortdesc>
+<shortdesc lang="en">vmware-vim-cmd path</shortdesc>
<content type="string" default="/usr/bin/vmware-vim-cmd"/>
</parameter>
</parameters>
<actions>
-<action name="start" timeout="300" />
-<action name="stop" timeout="300" />
-<action name="monitor" timeout="30" interval="300" depth="0" />
+<action name="start" timeout="600" />
+<action name="stop" timeout="600" />
+<action name="monitor" timeout="30" interval="300" depth="0"/>
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
@@ -319,51 +348,41 @@
# See how we were called
#################################################################
-case "$1" in
+case $1 in
meta-data)
meta_data
exit $OCF_SUCCESS
;;
-usage|help)
- vmware_usage
- exit $OCF_SUCCESS
- ;;
-esac
-
-set_environment
-vmware_validate
-rc=$?
-if [ $rc -ne 0 ]; then
- case "$1" in
- stop) ocf_log info "validate failed, vmware considered stopped"
- exit $OCF_SUCCESS;;
- monitor) exit $OCF_NOT_RUNNING;;
- status) exit $LSB_STATUS_STOPPED;;
- *) # it's safe to bail out now
- ocf_log err "vmware_validate failed"
- exit $rc
- ;;
- esac
-elif [ "$1" = "validate-all" ]; then
- exit $OCF_SUCCESS
-fi
-case "$1" in
start)
+ vmware_validate
vmware_start
;;
stop)
+ vmware_validate
vmware_stop
;;
status|monitor)
+ vmware_validate_probe
vmware_monitor
;;
+usage|help)
+ vmware_usage
+ exit $OCF_SUCCESS
+ ;;
+
+validate-all)
+ vmware_validate
+ ;;
+
*)
vmware_usage
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
+
+exit $?
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/