Page Menu
Home
ClusterLabs Projects
Search
Configure Global Search
Log In
Files
F3153289
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
11 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/heartbeat/iscsi b/heartbeat/iscsi
new file mode 100755
index 000000000..6904ce4f5
--- /dev/null
+++ b/heartbeat/iscsi
@@ -0,0 +1,439 @@
+#!/bin/sh
+#
+# iSCSI OCF resource agent
+# Description: manage iSCSI disks (add/remove) using open-iscsi
+#
+# Copyright Dejan Muhamedagic <dejan@suse.de>
+# (C) 2007 Novell Inc. All Rights Reserved.
+#
+# 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.
+#
+# See usage() and meta_data() below for more details...
+#
+# OCF instance parameters:
+# OCF_RESKEY_portal: the iSCSI portal address or host name (required)
+# OCF_RESKEY_target: the iSCSI target (required)
+# OCF_RESKEY_iscsiadm: iscsiadm program path (optional)
+# OCF_RESKEY_discovery_type: discovery type (optional; default: sendtargets)
+#
+# Initialization:
+
+. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
+
+usage() {
+ methods=`iscsi_methods`
+ methods=`echo $methods | tr ' ' '|'`
+ cat <<-!
+ usage: $0 {$methods}
+
+ $0 manages an iSCSI target
+
+ The 'start' operation starts (adds) the iSCSI target.
+ The 'stop' operation stops (removes) the iSCSI target.
+ The 'status' operation reports whether the iSCSI target is connected
+ The 'monitor' operation reports whether the iSCSI target is connected
+ The 'validate-all' operation reports whether the 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="iscsi">
+<version>1.0</version>
+
+<longdesc lang="en">
+OCF Resource Agent for iSCSI. Add (start) or remove (stop) iSCSI
+targets.
+</longdesc>
+<shortdesc lang="en">iscsi resource agent</shortdesc>
+
+<parameters>
+
+<parameter name="portal" unique="0" required="1">
+<longdesc lang="en">
+The iSCSI portal address in the form: <ip_address|hostname>[":"<port>]
+</longdesc>
+<shortdesc lang="en">portal</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+<parameter name="target" unique="1" required="1">
+<longdesc lang="en">
+The iSCSI target.
+</longdesc>
+<shortdesc lang="en">target</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+<parameter name="discovery_type" unique="0" required="0">
+<longdesc lang="en">
+Discovery type. Currently, with open-iscsi, only the sendtargets
+type is supported.
+</longdesc>
+<shortdesc lang="en">discovery_type</shortdesc>
+<content type="string" default="sendtargets" />
+</parameter>
+
+<parameter name="devattr" unique="0" required="0">
+<longdesc lang="en">
+It is not possible to know in advance which device name will the
+kernel assign to the new iscsi disk. Therefore, the device name
+has to be in some way communicated to the resource which will use
+it. This is done by modifying the CIB.
+
+There are two possible methods: 1) insert an attribute in the
+node's status section and 2) dynamically reconfigure the user
+resource.
+
+1) if devattr is set to 'status_instancename' (default) or
+'status_targetname', a transient attribute
+'iscsidev:$OCF_RESOURCE_INSTANCE' or correspondingly
+'iscsidev:$OCF_RESKEY_target' will be set in the status section.
+In this case, the attribute should be referenced in resources
+where it is needed in this way: 'CIB:iscsidev:...' (to be
+implemented).
+
+2) set devattr attribute to the name of a Filesystem or LVM
+resource and we will fix the appropriate attribute in that
+resource. In this case, set the attribute (device for Filesystem
+or volgrpname for LVM) to '/dev/null', so that the resource agent
+correctly reports the resource as stopped.
+
+</longdesc>
+<shortdesc lang="en">iscsiadm</shortdesc>
+<content type="string" default="status_instancename" />
+</parameter>
+
+<parameter name="iscsiadm" unique="0" required="0">
+<longdesc lang="en">
+iscsiadm program path.
+</longdesc>
+<shortdesc lang="en">iscsiadm</shortdesc>
+<content type="string" default="" />
+</parameter>
+
+</parameters>
+
+<actions>
+<action name="start" timeout="120" />
+<action name="stop" timeout="120" />
+<action name="status" timeout="30" />
+<action name="monitor" depth="0" timeout="30" interval="120" start-delay="10" />
+<action name="validate-all" timeout="5" />
+<action name="methods" timeout="5" />
+<action name="meta-data" timeout="5" />
+</actions>
+</resource-agent>
+END
+}
+
+iscsi_methods() {
+ cat <<-!
+ start
+ stop
+ status
+ monitor
+ validate-all
+ methods
+ meta-data
+ usage
+ !
+}
+
+#
+# open-iscsi interface
+#
+
+open_iscsi_setup() {
+ discovery=open_iscsi_discovery
+ add_disk=open_iscsi_add
+ remove_disk=open_iscsi_remove
+ disk_status=open_iscsi_status
+ iscsiadm=${OCF_RESKEY_iscsiadm:-"iscsiadm"}
+
+ which $iscsiadm >/dev/null || {
+ ocf_log err "iscsiadm not available; please set OCF_RESKEY_iscsiadm"
+ return $OCF_ERR_INSTALLED
+ }
+ ps -e -o cmd | grep -qs '[i]scsid'
+}
+
+#
+# discovery return codes:
+# 0: ok (variable portal set)
+# 1: target not found
+# 2: target found but can't connect it unambigously
+# 3: iscsiadm returned error
+
+open_iscsi_discovery() {
+ output=`$iscsiadm -m discovery -p $OCF_RESKEY_portal -t $discovery_type`
+ if [ $? -ne 0 -o x = "x$output" ]; then
+ [ x != "x$output" ] && echo "$output"
+ return 3
+ fi
+ portal=`echo "$output" |
+ awk -v target="$OCF_RESKEY_target" '
+ $NF==target{sub(",.*","",$1);print $1}'`
+
+ case `echo "$portal" | wc -w` in
+ 0) #target not found
+ echo "$output"
+ ocf_log err "target $OCF_RESKEY_target not found at portal $OCF_RESKEY_portal"
+ return 1
+ ;;
+ 1) #we're ok
+ return 0
+ ;;
+ *) # handle multihome hosts reporting multiple portals
+ for p in $portal; do
+ if [ "$OCF_RESKEY_portal" = "$p" ]; then
+ portal="$OCF_RESKEY_portal"
+ return 0
+ fi
+ done
+ echo "$output"
+ ocf_log err "sorry, can't handle multihomed hosts unless you specify exact portal"
+ return 2
+ ;;
+ esac
+}
+open_iscsi_add() {
+ $iscsiadm -m node -p $1 -T $2 -l
+}
+open_iscsi_remove() {
+ $iscsiadm -m node -p $1 -T $2 -u
+}
+open_iscsi_status() {
+ $iscsiadm -m session | grep -qs "$2$"
+}
+
+iscsi_status() {
+ if $disk_status $portal $OCF_RESKEY_target; then
+ return $OCF_SUCCESS
+ else
+ return $OCF_NOT_RUNNING
+ fi
+}
+iscsi_start() {
+ if iscsi_status; then
+ ocf_log info "iscsi $portal $OCF_RESKEY_target already running"
+ return $OCF_SUCCESS
+ else
+ $add_disk $portal $OCF_RESKEY_target ||
+ return $OCF_ERR_GENERIC
+ if iscsi_status && insert_dev; then
+ return $OCF_SUCCESS
+ else
+ return $OCF_ERR_GENERIC
+ fi
+ fi
+}
+iscsi_stop() {
+ if iscsi_status; then
+ $remove_disk $portal $OCF_RESKEY_target ||
+ return $OCF_ERR_GENERIC
+ if iscsi_status; then
+ return $OCF_ERR_GENERIC
+ else
+ remove_dev
+ return $OCF_SUCCESS
+ fi
+ else
+ ocf_log info "iscsi $portal $OCF_RESKEY_target already stopped"
+ return $OCF_SUCCESS
+ fi
+}
+
+iscsi_monitor() {
+ if $disk_status $portal $OCF_RESKEY_target; then
+ return $OCF_SUCCESS
+ else
+ return $OCF_NOT_RUNNING
+ fi
+}
+
+#
+# communicate the new device name to other resources through CIB
+#
+getrsctype() {
+ crm_resource -x -r "$1" |
+ awk '/class=/ && /type=/ {
+ for( i=1; i<=NF; i++ )
+ if( $i ~ /type=/ ) {
+ sub("type=","",$i);
+ gsub("[\"<>]","",$i);
+ print $i;
+ }
+ }'
+}
+devattrname() {
+ case "$1" in
+ status_instancename)
+ echo "iscsidev:$OCF_RESOURCE_INSTANCE" ;;
+ status_targetname)
+ echo "iscsidev:$OCF_RESKEY_target" ;;
+ *)
+ type=`getrsctype "$1"`
+ case "$type" in
+ Filesystem) echo device;;
+ LVM) echo volgrpname;;
+ *)
+ ocf_log err "unsupported resource type $type"
+ return 1
+ ;;
+ esac
+ esac
+ return 0
+}
+iscsi_getdev() {
+ case `uname` in
+ Linux)
+ for session in /sys/class/iscsi_session/session*; do
+ if [ -f $session/targetname ] &&
+ [ `cat $session/targetname` = $2 ]
+ then
+ echo /dev/$(basename `readlink $session/device/target*/*:0:*/block*`)
+ return
+ fi
+ done
+ ;;
+ *)
+ ;;
+ esac
+}
+insert_dev() {
+ dev=`iscsi_getdev $portal $OCF_RESKEY_target`
+ if [ -z "$dev" ]; then
+ ocf_log err "could not find device name for target $OCF_RESKEY_target"
+ return 1
+ fi
+ attr=`devattrname $devattr` || return 1
+ case "$devattr" in
+ status_instancename|status_targetname)
+ echo crm_attribute -t status -U `uname -n` -n "$attr" -v "$dev"
+ ;;
+ *)
+ crm_resource -r "$devattr" -p "$attr" -v "$dev"
+ esac
+}
+remove_dev() {
+ attr=`devattrname $devattr` || return 1
+ case "$devattr" in
+ status_instancename|status_targetname)
+ echo crm_attribute -t status -U `uname -n` -n "$attr" -D
+ ;;
+ *)
+ crm_resource -r "$devattr" -p "$attr" -v "/dev/null"
+ esac
+}
+
+#
+# 'main' starts here...
+#
+
+if [ $# -ne 1 ]; then
+ usage
+ exit $OCF_ERR_ARGS
+fi
+
+# These operations don't require OCF instance parameters to be set
+case "$1" in
+ meta-data) meta_data
+ exit $OCF_SUCCESS;;
+ usage) usage
+ exit $OCF_SUCCESS;;
+ methods) iscsi_methods
+ exit $OCF_SUCCESS;;
+esac
+
+if [ x = "x$OCF_RESKEY_target" ]; then
+ ocf_log err "Please set the target attribute"
+ exit $OCF_ERR_ARGS
+fi
+
+case `uname` in
+Linux) setup=open_iscsi_setup
+;;
+*) ocf_log info "platform `uname` may not be supported"
+ setup=open_iscsi_setup
+;;
+esac
+
+LSB_STATUS_STOPPED=3
+if ! $setup; then
+ ocf_log info "iscsi initiator utilities not installed or not setup"
+ case "$1" in
+ stop) exit $OCF_SUCCESS;;
+ monitor) exit $OCF_NOT_RUNNING;;
+ status) exit $LSB_STATUS_STOPPED;;
+ *) exit $OCF_ERR_ARGS;;
+ esac
+fi
+
+if [ `id -u` != 0 ]; then
+ ocf_log err "$0 must be run as root"
+ exit $OCF_ERR_PERM
+fi
+
+devattr=${OCF_RESKEY_devattr:-"status_instancename"}
+discovery_type=${OCF_RESKEY_discovery_type:-"sendtargets"}
+$discovery # discover and setup the real portal string (address)
+case $? in
+0) ;;
+1) [ "$1" = stop ] && exit $OCF_SUCCESS
+ [ "$1" = monitor ] && exit $OCF_NOT_RUNNING
+ [ "$1" = status ] && exit $LSB_STATUS_STOPPED
+ exit $OCF_ERR_GENERIC
+;;
+[23]) exit $OCF_ERR_GENERIC;;
+esac
+
+# What kind of method was invoked?
+case "$1" in
+ start) iscsi_start
+ exit $?;;
+ stop) iscsi_stop
+ exit $?;;
+ status) if iscsi_status
+ then
+ echo iscsi target $OCF_RESKEY_target running
+ exit $OCF_SUCCESS
+ else
+ echo iscsi target $OCF_RESKEY_target stopped
+ exit $OCF_NOT_RUNNING
+ fi
+ ;;
+ monitor) iscsi_status
+ exit $?;;
+
+ validate-all) # OCF_RESKEY_sid was already checked by testoraenv(),
+ # just exit successfully here.
+ exit $OCF_SUCCESS;;
+
+ *) iscsi_methods
+ exit $OCF_ERR_UNIMPLEMENTED;;
+esac
+
+#
+# vim:tabstop=4:shiftwidth=4:textwidth=0:wrapmargin=0
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Feb 25, 4:08 PM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1464884
Default Alt Text
(11 KB)
Attached To
Mode
rR Resource Agents
Attached
Detach File
Event Timeline
Log In to Comment