summaryrefslogtreecommitdiffstats
path: root/heartbeat/ICP
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/ICP')
-rwxr-xr-xheartbeat/ICP304
1 files changed, 304 insertions, 0 deletions
diff --git a/heartbeat/ICP b/heartbeat/ICP
new file mode 100755
index 0000000..0bf37de
--- /dev/null
+++ b/heartbeat/ICP
@@ -0,0 +1,304 @@
+#!/bin/sh
+#
+#
+# ICP
+#
+# Description: Manages an ICP Vortex clustered host drive as an HA resource
+#
+#
+# Author: Lars Marowsky-Bree <lmb@suse.de>
+# Support: users@clusterlabs.org
+# License: GNU General Public License (GPL)
+# Copyright: (C) 2002 SuSE Linux AG
+#
+#
+# An example usage in /etc/ha.d/haresources:
+# node1 10.0.0.170 LinuxSCSI::0:0 ICP::c0h1::/dev/sdb1 LVM::myvolname
+#
+# Notice that you will need to get the utility "icpclucon" from the ICP
+# support to use this.
+#
+# See usage() function below for more details...
+#
+# OCF parameters are as below:
+# OCF_RESKEY_driveid
+# OCF_RESKEY_device
+
+#######################################################################
+# Initialization:
+
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
+
+# Parameter defaults
+
+OCF_RESKEY_driveid_default=""
+OCF_RESKEY_device_default=""
+
+: ${OCF_RESKEY_driveid=${OCF_RESKEY_driveid_default}}
+: ${OCF_RESKEY_device=${OCF_RESKEY_device_default}}
+
+#######################################################################
+
+#
+ICPCLUCON=/usr/sbin/icpclucon
+#
+
+usage() {
+ methods=`ICP_methods | grep -v methods`
+ methods=`echo $methods | tr ' ' '|'`
+ cat <<-!
+ usage: $0 ($methods)
+
+ $0 manages an ICP Vortex clustered host drive.
+
+ The 'start' operation reserves the given host drive.
+ The 'stop' operation releses the given host drive.
+ The 'status' operation reports whether the host drive is reserved.
+ The 'monitor' operation reports whether the host drive is reserved.
+ The 'validate-all' operation reports whether OCF instance parameters are valid.
+ The 'methods' operation reports on the methods $0 supports
+
+ !
+}
+
+meta_data() {
+ cat <<END
+<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="ICP" version="1.0">
+<version>1.0</version>
+
+<longdesc lang="en">
+Resource script for ICP. It Manages an ICP Vortex clustered host drive as an
+HA resource.
+</longdesc>
+<shortdesc lang="en">Manages an ICP Vortex clustered host drive</shortdesc>
+
+<parameters>
+<parameter name="driveid" unique="0" required="1">
+<longdesc lang="en">
+The ICP cluster drive ID.
+</longdesc>
+<shortdesc lang="en">ICP cluster drive ID</shortdesc>
+<content type="string" default="${OCF_RESKEY_driveid_default}" />
+</parameter>
+
+<parameter name="device" unique="0" required="1">
+<longdesc lang="en">
+The device name.
+</longdesc>
+<shortdesc lang="en">device</shortdesc>
+<content type="string" default="${OCF_RESKEY_device_default}" />
+</parameter>
+</parameters>
+
+<actions>
+<action name="start" timeout="20s" />
+<action name="stop" timeout="20s" />
+<action name="status" depth="0" timeout="20s" interval="10s" />
+<action name="monitor" depth="0" timeout="20s" interval="10s" />
+<action name="validate-all" timeout="5s" />
+<action name="meta-data" timeout="5s" />
+</actions>
+</resource-agent>
+END
+}
+
+#
+# methods: What methods/operations do we support?
+#
+ICP_methods() {
+ cat <<-!
+ start
+ stop
+ status
+ monitor
+ methods
+ validate-all
+ meta-data
+ usage
+ !
+}
+
+ICP_status() {
+ local icp_out
+
+ icp_out=$($ICPCLUCON -v -status $1)
+ if [ $? -ne 0 ]; then
+ ocf_log "err" "Hostdrive not reserved by us."
+ return $OCF_ERR_GENERIC
+ fi
+
+ if expr match "$icp_out" \
+ '.*Drive is reserved by this host.*' >/dev/null 2>&1 ; then
+ ocf_log "info" "Volume $1 is reserved by us."
+ return $OCF_SUCCESS
+ elif expr match "$icp_out" \
+ '.*Drive is not reserved by any host.*' >/dev/null 2>&1 ; then
+ ocf_log "err" "Volume $1 not reserved by any host."
+ return $OCF_NOT_RUNNING
+ else
+ ocf_log "err" "Unknown output from icpclucon. Assuming we do not have a reservation:"
+ ocf_log "err" "$icp_out"
+ return $OCF_NOT_RUNNING
+ fi
+}
+
+ICP_report_status() {
+ if ICP_status $1 ; then
+ echo "$1: running"
+ return $OCF_SUCCESS
+ else
+ echo "$1: not running"
+ return $OCF_NOT_RUNNING
+ fi
+}
+
+
+#
+# Monitor the host drive - does it really seem to be working?
+#
+#
+ICP_monitor() {
+
+ if
+ ICP_status $1
+ then
+ return $?
+ else
+ ocf_log "err" "ICP host drive $1 is offline"
+ return $OCF_NOT_RUNNING
+ fi
+
+}
+
+Clear_bufs() {
+ $BLOCKDEV --flushbufs $1
+}
+
+#
+# Enable ICP host drive
+#
+ICP_start() {
+
+ ocf_log "info" "Activating host drive $1"
+ ocf_run $ICPCLUCON -v -reserve $1
+ if [ $? -ne 0 ]; then
+ ocf_log "info" "Forcing reservation of $1"
+ ocf_run $ICPCLUCON -v -force $1 || return $OCF_ERR_GENERIC
+ fi
+
+ if
+ ICP_status $1
+ then
+ : OK
+ # A reservation isn't as prompt as it should be
+ sleep 3
+ return $OCF_SUCCESS
+ else
+ ocf_log "err" "ICP: $1 was not reserved correctly"
+ return $OCF_ERR_GENERIC
+ fi
+}
+
+#
+# Release the ICP host drive
+#
+ICP_stop() {
+
+ ocf_log "info" "Releasing ICP host drive $1"
+ ocf_run $ICPCLUCON -v -release $1 || return $OCF_ERR_GENERIC
+
+ ocf_log "info" "Verifying reservation"
+ if ICP_status $1 ; then
+ ocf_log "err" "ICP: $1 was not released correctly"
+ return $OCF_ERR_GENERIC
+ fi
+ return $OCF_SUCCESS
+}
+
+ICP_validate_all() {
+ check_binary $BLOCKDEV
+ check_binary $ICPCLUCON
+ $ICPCLUCON -v -status $driveid >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ ocf_log err "Invalid driveid $driveid"
+ exit $OCF_ERR_ARGS
+ fi
+
+ if [ ! -b $device ]; then
+ ocf_log err "Device $device is not a block device"
+ exit $OCF_ERR_ARGS
+ fi
+
+# Do not know how to check the association of $device with $driveid.
+
+ return $OCF_SUCCESS
+}
+
+#
+# 'main' starts here...
+#
+
+if
+ ( [ $# -ne 1 ] )
+then
+ usage
+ exit $OCF_ERR_ARGS
+fi
+
+# These operations do not require OCF instance parameters to be set
+case "$1" in
+
+ meta-data) meta_data
+ exit $OCF_SUCCESS;;
+
+ methods) ICP_methods
+ exit $OCF_SUCCESS;;
+
+ usage) usage
+ exit $OCF_SUCCESS;;
+
+ *) ;;
+esac
+
+if
+ [ -z "$OCF_RESKEY_driveid" ]
+then
+ ocf_log err "Please specify OCF_RESKEY_driveid"
+ exit $OCF_ERR_ARGS
+fi
+
+if [ -z "$OCF_RESKEY_device" ]; then
+ ocf_log err "Please specify OCF_RESKEY_device"
+ exit $OCF_ERR_ARGS
+fi
+
+driveid=$OCF_RESKEY_driveid
+device=$OCF_RESKEY_device
+
+# What kind of method was invoked?
+case "$1" in
+
+ start) ICP_validate_all
+ ICP_start $driveid
+ Clear_bufs $device
+ exit $?;;
+
+ stop) ICP_stop $driveid
+ Clear_bufs $device
+ exit $?;;
+
+ status) ICP_report_status $driveid
+ exit $?;;
+
+ monitor) ICP_monitor $driveid
+ exit $?;;
+
+ validate-all) ICP_validate_all
+ exit $?;;
+
+ *) usage
+ exit $OCF_ERR_UNIMPLEMENTED;;
+esac