#!/bin/sh # # VMware OCF resource agent # # Copyright (c) 2010 Apra Sistemi s.r.l. # All Rights Reserved. # # Description: Manages VMware server 2.0 virtual machines # as High-Availability resources # # # Author: Cristian Mammoli # License: GNU General Public License (GPL) # 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 (optional: full path to the vmware-vim-cmd executable, # fallback to default location if not declared) # # Requirements/caveats: # * 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 # * The default value of operation timeout (20 sec) isn't enough if you are # 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 ################################################################# # Source ocf shell functions : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs # Basic variables configuration OCF_RESKEY_vimshbin_default="/usr/bin/vmware-vim-cmd" : ${OCF_RESKEY_vimshbin=${OCF_RESKEY_vimshbin_default}} ################################################################# # Path to the virtual machine configuration file VMXPATH="$OCF_RESKEY_vmxpath" # Path to the vmware-vim-cmd executable VIMSHBIN="$OCF_RESKEY_vimshbin" # Global variables VMXDIR= RELVMXPATH= VMID= VM= VMAUTOMSG= # vmware-vim-cmd functions ################################################################# # Get virtual machine vid vmware_get_vid() { $VIMSHBIN vmsvc/getallvms \ | awk '/\/'"$1"'/ {print $1}' } # Is the vm waiting for input after a migration? vmware_uuid_alt() { $VIMSHBIN vmsvc/message $1 \ | awk /^msg.uuid.altered/ } # Get message id vmware_get_msgid() { $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 } # Register a virtual machine vmware_register_vm() { $VIMSHBIN solo/registervm '"'$1'"' >/dev/null } # Unregister a virtual machine vmware_unregister_vm() { $VIMSHBIN vmsvc/unregister $1 >/dev/null } # Start a virtual machine vmware_poweron_vm() { $VIMSHBIN vmsvc/power.on $1 >/dev/null } # Suspend a virtual machine vmware_suspend_vm() { $VIMSHBIN vmsvc/power.suspend $1 >/dev/null } # Get virtual machine power state vmware_get_status() { $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}' } # Variables depending on the above functions ################################################################# vmware_set_env() { # Directory containing the virtual machine VMXDIR="`dirname "$VMXPATH"`" # Basename of the configuration file RELVMXPATH="`basename "$VMXPATH"`" # Vid of the virtual machine (can be empty if the vm is not registered) VMID=`vmware_get_vid "$RELVMXPATH"` # Virtual machine name VM="`awk -F '"' '/^displayName/ {print $2}' "$VMXPATH"`" # msg.autoAnswer value in config file VMAUTOMSG="`awk -F '"' '/^msg.autoAnswer/ {print toupper($2)}' "$VMXPATH"`" } # Main functions ################################################################# # Print usage summary vmware_usage() { cat < 0.2 OCF compliant script to control vmware server 2.0 virtual machines. Manages VMWare Server 2.0 virtual machines VMX configuration file path VMX file path vmware-vim-cmd executable path vmware-vim-cmd path END } # See how we were called ################################################################# case $1 in meta-data) meta_data exit $OCF_SUCCESS ;; start) vmware_validate vmware_start ;; stop) vmware_validate vmware_stop ;; status|monitor) if ocf_is_probe; then vmware_validate_probe else vmware_validate fi vmware_monitor ;; usage|help) vmware_usage exit $OCF_SUCCESS ;; validate-all) vmware_validate ;; *) vmware_usage exit $OCF_ERR_UNIMPLEMENTED ;; esac exit $?