diff options
Diffstat (limited to 'heartbeat/EvmsSCC')
-rwxr-xr-x | heartbeat/EvmsSCC | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/heartbeat/EvmsSCC b/heartbeat/EvmsSCC new file mode 100755 index 0000000..a691138 --- /dev/null +++ b/heartbeat/EvmsSCC @@ -0,0 +1,222 @@ +#!/bin/sh +# +# Support: users@clusterlabs.org +# License: GNU General Public License (GPL) +# +# EvmsSCC +# Description: Runs evms_activate in a heartbeat cluster to activate a +# EVMS shared cluster container in the cluster. +# Original Author: Jo De Baer (jdebaer@novell.com) +# Original Release: 06 Nov 2006 +# +# usage: ./EvmsSCC {start|stop|status|monitor|meta-data} +# +# The goal of this resource agent is to provoke the creation of device file +# in /dev/emvs which correspond to EVMS2 volumes that reside in a EVMS2 shared +# cluster container. As such it should be run as a clone resource in the +# cluster. Logic inside the resource agent will make sure that "evms_activate" +# is run on only one node in the cluster, both at cluster startup time as well +# as when a node joins the cluster. +# +# Typically, resources that need to mount EVMS2 volumes should run after this +# resource agent has finished it's run. As such those resources should be made +# "dependent" on this resource agent by the cluster administrator. An example +# of resources that should depend on this resource agent are Filesystem resource +# agent that mount OCFS2 volumes that reside on EVMS2 volumes in a shared +# EVMS2 cluster container. +# +# For this resource agent to do it's job correctly, evmsd must be running on +# the node where the agent is started. Usually evmsd is started by the cluster +# software via a respawn statement in /etc/ha.d/ha.cf. If you encounter timing +# issues where evmsd is not yet started but where the cluster already starts +# the EvmsSCC clone, then you should comment out the evmsd respawn statement +# in /etc/ha.d/ha.cf and start evmsd on each node in the cluster via a separate +# clone resource agent. The EvmsSCC resource agent cloneset should then be made +# dependent to this evmsd cloneset. This will guarantee that emvsd is running +# before EvmsSCC is started, on each node in the cluster. +# + +####################################################################### +# Initialization: + +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Parameter defaults + +OCF_RESKEY_ignore_deprecation_default="false" + +: ${OCF_RESKEY_ignore_deprecation=${OCF_RESKEY_ignore_deprecation_default}} + +####################################################################### + + +# Utilities used by this script +CUT=cut +EVMSACTIVATE=evms_activate + +usage() { + cat <<-EOT + usage: $0 {start|stop|status|monitor|meta-data} + EOT +} + +meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="EvmsSCC" version="1.0"> +<version>1.0</version> + +<longdesc lang="en"> +Deprecation warning: EVMS is no longer actively maintained and should not be used. This agent is deprecated and may be removed from a future release. -- +Resource script for EVMS shared cluster container. It runs evms_activate on one node in the cluster. +</longdesc> +<shortdesc lang="en">Manages EVMS Shared Cluster Containers (SCCs) (deprecated)</shortdesc> + +<parameters> +<parameter name="ignore_deprecation"> +<longdesc lang="en"> +If set to true, suppresses the deprecation warning for this agent. +</longdesc> +<shortdesc lang="en">Suppress deprecation warning</shortdesc> +<content type="boolean" default="${OCF_RESKEY_ignore_deprecation_default}" /> +</parameter> +</parameters> + +<actions> +<action name="start" timeout="60s" /> +<action name="stop" timeout="60s" /> +<action name="notify" timeout="60s" /> +<action name="status" depth="0" timeout="10s" interval="10s" /> +<action name="monitor" depth="0" timeout="10s" interval="10s" /> +<action name="meta-data" timeout="5s" /> +</actions> +</resource-agent> +END +} + +EvmsSCC_status() +{ + # At the moment we don't support monitoring EVMS activations. We just return "not running" to cope with the pre-start monitor call. + return $OCF_NOT_RUNNING +} + +EvmsSCC_notify() +{ + local n_type="$OCF_RESKEY_CRM_meta_notify_type" + local n_op="$OCF_RESKEY_CRM_meta_notify_operation" + local n_active="$OCF_RESKEY_CRM_meta_notify_active_uname" + local n_stop="$OCF_RESKEY_CRM_meta_notify_stop_uname" + local n_start="$OCF_RESKEY_CRM_meta_notify_start_uname" + + case "$n_type" in + pre) + case "$n_op" in + start) ocf_log debug "EvmsSCC: Notify: Starting node(s): $n_start." + EvmsSCC_start_notify_common + ;; + esac + ;; + esac + + + return $OCF_SUCCESS +} + +EvmsSCC_start() +{ + local n_type="$OCF_RESKEY_CRM_meta_notify_type" + local n_op="$OCF_RESKEY_CRM_meta_notify_operation" + local n_active="$OCF_RESKEY_CRM_meta_notify_active_uname" + local n_stop="$OCF_RESKEY_CRM_meta_notify_stop_uname" + local n_start="$OCF_RESKEY_CRM_meta_notify_start_uname" + + ocf_log debug "EvmsSCC: Start: starting node(s): $n_start." + + EvmsSCC_start_notify_common + + return $OCF_SUCCESS +} + +EvmsSCC_stop() +{ + return $OCF_SUCCESS +} + +EvmsSCC_start_notify_common() +{ + local n_myself=${HA_CURHOST:-$(uname -n | tr A-Z a-z)} + ocf_log debug "EvmsSCC: Start_Notify: I am node $n_myself." + + n_active="$n_active $n_start" + case " $n_active " in + *" $n_myself "*) ;; + *) ocf_log err "EvmsSCC: $n_myself (local) not on active list!" + return $OCF_ERR_GENERIC + ;; + esac + + #pick the first node from the starting list + #when the cluster boots this will be one of the many booting nodes + #when a node later joins the cluster, this will be the joining node + local n_first=$(echo $n_start | cut -d ' ' -f 1) + ocf_log debug "EvmsSCC: Start_Notify: First node in starting list is $n_first." + + if [ "$n_myself" = "$n_first" ] ; then + ocf_log debug "EvmsSCC: Start_Notify: I am running ${EVMSACTIVATE}." + while true ; do + if ! ${EVMSACTIVATE} -q 2> /dev/null ; then + SLEEP_TIME=$(($(ocf_maybe_random) % 40)) + ocf_log info "EvmsSCC: Evms call failed - sleeping for $SLEEP_TIME seconds and then trying again." + sleep $SLEEP_TIME + else + break + fi + done + + fi + + return $OCF_SUCCESS +} + +# Check the arguments passed to this script +if + [ $# -ne 1 ] +then + usage + exit $OCF_ERR_ARGS +fi + +OP=$1 + +case $OP in + meta-data) meta_data + exit $OCF_SUCCESS + ;; + usage) usage + exit $OCF_SUCCESS + ;; +esac + +# Be obnoxious, log deprecation warning on every invocation (unless +# suppressed by resource configuration). +ocf_deprecated + +check_binary $CUT +check_binary $EVMSACTIVATE + +case $OP in + start) EvmsSCC_start + ;; + notify) EvmsSCC_notify + ;; + stop) EvmsSCC_stop + ;; + status|monitor) EvmsSCC_status + ;; + *) usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac +exit $? |