diff options
Diffstat (limited to 'heartbeat/ManageVE.in')
-rw-r--r-- | heartbeat/ManageVE.in | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/heartbeat/ManageVE.in b/heartbeat/ManageVE.in new file mode 100644 index 0000000..f07ca5b --- /dev/null +++ b/heartbeat/ManageVE.in @@ -0,0 +1,320 @@ +#!@BASH_SHELL@ +# +# ManageVE OCF RA. Manages OpenVZ Virtual Environments (VEs) +# +# (c) 2006-2010 Matthias Dahl, Florian Haas, +# and Linux-HA contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of version 2 of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Further, this software is distributed without any warranty that it is +# free of the rightful claim of any third person regarding infringement +# or the like. Any license provided herein, whether implied or +# otherwise, applies only to this software file. Patent licenses, if +# any, provided herein do not apply to combinations of this program with +# other software, or any other product whatsoever. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. +# +# +# This OCF compliant resource agent manages OpenVZ VEs and thus requires +# a proper OpenVZ installation including a recent vzctl util. +# +# rev. 1.00.4 +# +# Changelog +# +# 21/Oct/10 1.00.4 implement migrate_from/migrate_to +# 12/Sep/06 1.00.3 more cleanup +# 12/Sep/06 1.00.2 fixed some logic in start_ve +# general cleanup all over the place +# 11/Sep/06 1.00.1 fixed some typos +# 07/Sep/06 1.00.0 it's alive... muahaha... ALIVE... :-) +# + +### +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Parameter defaults + +OCF_RESKEY_veid_default="" + +: ${OCF_RESKEY_veid=${OCF_RESKEY_veid_default}} + +### + +# required utilities +VZCTL=/usr/sbin/vzctl + +# +# usage() +# +usage() +{ + cat <<-EOF + usage: $0 {start|stop|status|monitor|migrate_from|migrate_to|validate-all|usage|meta-data} + EOF +} + +# +# meta_data() +# +meta_data() +{ + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="ManageVE" version="1.00.4"> + <version>1.0</version> + + <longdesc lang="en"> + This OCF compliant resource agent manages OpenVZ VEs and thus requires + a proper OpenVZ installation including a recent vzctl util. + </longdesc> + + <shortdesc lang="en">Manages an OpenVZ Virtual Environment (VE)</shortdesc> + + <parameters> + <parameter name="veid" unique="0" required="1"> + <longdesc lang="en"> + OpenVZ ID of virtual environment (see output of vzlist -a for all assigned IDs) + </longdesc> + <shortdesc lang="en">OpenVZ ID of VE</shortdesc> + <content type="integer" default="${OCF_RESKEY_veid_default}" /> + </parameter> + </parameters> + + <actions> + <action name="start" timeout="75s" /> + <action name="stop" timeout="75s" /> + <action name="status" depth="0" timeout="10s" interval="10s" /> + <action name="monitor" depth="0" timeout="10s" interval="10s" /> + <action name="migrate_to" timeout="75s" /> + <action name="migrate_from" timeout="75s" /> + <action name="validate-all" timeout="5s" /> + <action name="meta-data" timeout="5s" /> + </actions> +</resource-agent> +END +} + +# +# start_ve() +# +# Starts a VE, or simply logs a message if the VE is already running. +# +start_ve() +{ + if status_ve; then + ocf_log info "VE $VEID already running." + return $OCF_SUCCESS + fi + + ocf_run $VZCTL start $VEID || exit $OCF_ERR_GENERIC + + return $OCF_SUCCESS +} + +# +# stop_ve() +# +# ATTENTION: The following code relies on vzctl's exit codes, especially: +# +# 0 : success +# +# In case any of those exit codes change, this function will need fixing. +# +stop_ve() +{ + status_ve + if [ $? -eq $OCF_NOT_RUNNING ]; then + ocf_log info "VE $VEID already stopped." + return $OCF_SUCCESS + fi + + ocf_run $VZCTL stop $VEID || exit $OCF_ERR_GENERIC + + return $OCF_SUCCESS +} + +# +# migrate_to_ve() +# +# In the process of a resource migration, checkpoints the VE. For this +# to work, vzctl must obviously create the dump file in a place which +# the migration target has access to (an NFS mount, a DRBD device, +# etc.). +# +migrate_to_ve() +{ + if ! status_ve; then + ocf_log err "VE $VEID is not running, aborting" + exit $OCF_ERR_GENERIC + fi + ocf_run $VZCTL chkpnt $VEID || exit $OCF_ERR_GENERIC + return $OCF_SUCCESS +} + +# +# migrate_to_ve() +# +# In the process of a resource migration, restores the VE. For this to +# work, vzctl must obviously have access to the dump file which was +# created on the migration source (on an NFS mount, a DRBD device, +# etc.). +# +migrate_from_ve() +{ + ocf_run $VZCTL restore $VEID || exit $OCF_ERR_GENERIC + return $OCF_SUCCESS +} + +# +# status_ve() +# +# ATTENTION: The following code relies on vzctl's status output. The fifth +# column is interpreted as the VE status (either up or down). +# +# In case the output format should change, this function will need fixing. +# +status_ve() +{ + declare -i retcode + + veexists=`$VZCTL status $VEID 2>/dev/null | $AWK '{print $3}'` + vestatus=`$VZCTL status $VEID 2>/dev/null | $AWK '{print $5}'` + retcode=$? + + if [[ $retcode != 0 ]]; then + # log error only if expected to find running + if [ "$__OCF_ACTION" = "monitor" ] && ! ocf_is_probe; then + ocf_log err "vzctl status $VEID returned: $retcode" + fi + exit $OCF_ERR_GENERIC + fi + + if [[ $veexists != "exist" ]]; then + ocf_log err "vzctl status $VEID returned: $VEID does not exist." + return $OCF_NOT_RUNNING + fi + + case "$vestatus" in + running) + return $OCF_SUCCESS + ;; + down) + return $OCF_NOT_RUNNING + ;; + *) + ocf_log err "vzctl status $VEID, wrong output format. (5th column: $vestatus)" + exit $OCF_ERR_GENERIC + ;; + esac +} + +# +# validate_all_ve() +# +# ATTENTION: The following code relies on vzctl's status output. The fifth +# column is interpreted as the VE status (either up or down). +# +# In case the output format should change, this function will need fixing. +# +validate_all_ve() +{ + declare -i retcode + + # VEID should be a valid VE + `status_ve` + retcode=$? + + if [[ $retcode != $OCF_SUCCESS && $retcode != $OCF_NOT_RUNNING ]]; then + return $retcode + fi + + return $OCF_SUCCESS +} + + +if [[ $# != 1 ]]; then + usage + exit $OCF_ERR_ARGS +fi + +case "$1" in + meta-data) + meta_data + exit $OCF_SUCCESS + ;; + usage) + usage + exit $OCF_SUCCESS + ;; + *) + ;; +esac + +# +# check relevant environment variables for sanity and security +# + +# empty string? +`test -z "$OCF_RESKEY_veid"` + +declare -i veidtest1=$? + +# really a number? +`echo "$OCF_RESKEY_veid" | egrep -q '^[[:digit:]]+$'` + +if [[ $veidtest1 != 1 || $? != 0 ]]; then + ocf_log err "OCF_RESKEY_veid not set or not a number." + exit $OCF_ERR_ARGS +fi + +declare -i VEID=$OCF_RESKEY_veid + +# +# check that all relevant utilities are available +# +check_binary $VZCTL +check_binary $AWK + +# +# finally... let's see what we are ordered to do :-) +# +case "$1" in + start) + start_ve + ;; + stop) + stop_ve + ;; + status|monitor) + status_ve + ;; + migrate_to) + migrate_to_ve + ;; + migrate_from) + migrate_from_ve + ;; + validate-all) + validate_all_ve + ;; + *) + usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac + +exit $? + |