summaryrefslogtreecommitdiffstats
path: root/heartbeat/AoEtarget.in
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--heartbeat/AoEtarget.in245
1 files changed, 245 insertions, 0 deletions
diff --git a/heartbeat/AoEtarget.in b/heartbeat/AoEtarget.in
new file mode 100644
index 0000000..5a14c1e
--- /dev/null
+++ b/heartbeat/AoEtarget.in
@@ -0,0 +1,245 @@
+#!@BASH_SHELL@
+#
+#
+# AoEtarget OCF RA.
+# Manages an ATA-over-Ethernet (AoE) target utilizing the vblade utility.
+#
+# (c) 2009-2010 Florian Haas, Dejan Muhamedagic,
+# 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.
+#
+
+######################################################################
+# Initialization:
+
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
+
+# Defaults
+OCF_RESKEY_nic_default="eth0"
+OCF_RESKEY_pid_default="${HA_RSCTMP}/AoEtarget-${OCF_RESOURCE_INSTANCE}.pid"
+OCF_RESKEY_binary_default="/usr/sbin/vblade"
+
+: ${OCF_RESKEY_nic=${OCF_RESKEY_nic_default}}
+: ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
+: ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
+
+#######################################################################
+
+meta_data() {
+ cat <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="AoEtarget" version="1.0">
+ <version>1.0</version>
+ <longdesc lang="en">
+This resource agent manages an ATA-over-Ethernet (AoE) target using vblade.
+It exports any block device, or file, as an AoE target using the
+specified Ethernet device, shelf, and slot number.
+</longdesc>
+ <shortdesc lang="en">Manages ATA-over-Ethernet (AoE) target exports</shortdesc>
+ <parameters>
+ <parameter name="device" required="1">
+ <longdesc lang="en">
+The local block device (or file) to export as an AoE target.
+</longdesc>
+ <shortdesc lang="en">Device to export</shortdesc>
+ <content type="string"/>
+ </parameter>
+ <parameter name="nic" required="1">
+ <longdesc lang="en">
+The local Ethernet interface to use for exporting this AoE target.
+</longdesc>
+ <shortdesc lang="en">Ethernet interface</shortdesc>
+ <content type="string" default="${OCF_RESKEY_nic_default}"/>
+ </parameter>
+ <parameter name="shelf" required="0">
+ <longdesc lang="en">
+The AoE shelf number to use when exporting this target.
+</longdesc>
+ <shortdesc lang="en">AoE shelf number</shortdesc>
+ <content type="integer"/>
+ </parameter>
+ <parameter name="slot" required="1">
+ <longdesc lang="en">
+The AoE slot number to use when exporting this target.
+</longdesc>
+ <shortdesc lang="en">AoE slot number</shortdesc>
+ <content type="integer"/>
+ </parameter>
+ <parameter name="pid" required="0" unique="1">
+ <longdesc lang="en">
+The file to record the daemon pid to.
+</longdesc>
+ <shortdesc lang="en">Daemon pid file</shortdesc>
+ <content type="string" default="${OCF_RESKEY_pid_default}"/>
+ </parameter>
+ <parameter name="binary" required="0">
+ <longdesc lang="en">
+Location of the vblade binary.
+</longdesc>
+ <shortdesc lang="en">vblade binary</shortdesc>
+ <content type="string" default="${OCF_RESKEY_binary_default}"/>
+ </parameter>
+ </parameters>
+ <actions>
+ <action name="start" timeout="15s"/>
+ <action name="stop" timeout="15s"/>
+ <action name="monitor" timeout="15s" interval="10s" depth="0"/>
+ <action name="reload" timeout="15s"/>
+ <action name="meta-data" timeout="5s"/>
+ <action name="validate-all" timeout="15s"/>
+ </actions>
+</resource-agent>
+EOF
+}
+
+#######################################################################
+
+AoEtarget_usage() {
+ cat <<END
+usage: $0 {start|stop|status|monitor|validate-all|meta-data}
+
+Expects to have a fully populated OCF RA-compliant environment set.
+END
+}
+
+AoEtarget_start() {
+ AoEtarget_monitor
+ if [ $? = $OCF_SUCCESS ]; then
+ return $OCF_SUCCESS
+ fi
+ ocf_log info "Exporting device ${OCF_RESKEY_device} on ${OCF_RESKEY_nic} as shelf ${OCF_RESKEY_shelf}, slot ${OCF_RESKEY_slot}"
+ ${OCF_RESKEY_binary} ${OCF_RESKEY_shelf} ${OCF_RESKEY_slot} \
+ ${OCF_RESKEY_nic} ${OCF_RESKEY_device} 2>&1 &
+ rc=$?
+ pid=$!
+ if [ $rc -ne 0 ]; then
+ return $OCF_ERR_GENERIC
+ fi
+ echo $pid > ${OCF_RESKEY_pid} && return $OCF_SUCCESS
+ return $OCF_ERR_GENERIC
+}
+
+AoEtarget_stop() {
+ AoEtarget_monitor
+ if [ $? -eq $OCF_SUCCESS ]; then
+ ocf_log info "Unxporting device ${OCF_RESKEY_device} on ${OCF_RESKEY_nic} as shelf ${OCF_RESKEY_shelf}, slot ${OCF_RESKEY_slot}"
+ pid=$(cat ${OCF_RESKEY_pid})
+ kill -TERM $pid
+ # loop until we're really stopped, wait for the LRM to time us
+ # out if not
+ while AoEtarget_monitor; do
+ sleep 1
+ done
+ fi
+ # Clean up pid file
+ rm -f ${OCF_RESKEY_pid}
+ return $OCF_SUCCESS
+}
+
+AoEtarget_monitor() {
+ ocf_pidfile_status ${OCF_RESKEY_pid} >/dev/null 2>&1
+ rc=$?
+ if [ $rc -eq 2 ]; then
+ # no pid file, must assume we're not running
+ return $OCF_NOT_RUNNING
+ elif [ $rc -eq 1 ]; then
+ # stale pid file, assume something went wrong
+ return $OCF_ERR_GENERIC
+ fi
+ return $OCF_SUCCESS
+}
+
+AoEtarget_validate() {
+ # Is our binary executable?
+ if [ ! -x ${OCF_RESKEY_binary} ]; then
+ ocf_log error "${OCF_RESKEY_binary} not found or not executable"
+ return $OCF_ERR_INSTALLED
+ fi
+
+ # Do we have all required variables?
+ for var in device nic shelf slot pid; do
+ param="OCF_RESKEY_${var}"
+ if [ -z "${!param}" ]; then
+ ocf_log error "Missing resource parameter \"$var\"!"
+ return $OCF_ERR_CONFIGURED
+ fi
+ done
+
+ # Is the pid file directory writable?
+ pid_dir=`dirname "$OCF_RESKEY_pid"`
+ touch "$pid_dir/$$"
+ if [ $? != 0 ]; then
+ ocf_log error "Cannot create pid file in $pid_dir -- check directory permissions"
+ return $OCF_ERR_INSTALLED
+ fi
+ rm "$pid_dir/$$"
+
+ # Does the device we are trying to export exist?
+ if [ ! -e ${OCF_RESKEY_device} ]; then
+ ocf_log error "${OCF_RESKEY_device} does not exist"
+ return $OCF_ERR_INSTALLED
+ fi
+ return $OCF_SUCCESS
+}
+
+case $1 in
+ meta-data)
+ meta_data
+ exit $OCF_SUCCESS
+ ;;
+ usage|help)
+ AoEtarget_usage
+ exit $OCF_SUCCESS
+ ;;
+esac
+
+# Everything except usage and meta-data must pass the validate test
+AoEtarget_validate || exit $?
+
+case $__OCF_ACTION in
+ start)
+ AoEtarget_start
+ ;;
+ stop)
+ AoEtarget_stop
+ ;;
+ status|monitor)
+ AoEtarget_monitor
+ ;;
+ reload)
+ ocf_log err "Reloading..."
+ AoEtarget_start
+ ;;
+ validate-all)
+ AoEtarget_validate
+ ;;
+ *)
+ AoEtarget_usage
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+
+rc=$?
+ocf_log debug "${OCF_RESOURCE_INSTANCE} $__OCF_ACTION : $rc"
+exit $rc
+