summaryrefslogtreecommitdiffstats
path: root/heartbeat/EvmsSCC
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/EvmsSCC')
-rwxr-xr-xheartbeat/EvmsSCC222
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 $?