
florian.haas at linbit
Jun 15, 2009, 9:32 AM
Post #1 of 2
(267 views)
Permalink
|
|
[PATCH 1 of 2] Improvements to the iSCSITarget and iSCSILogicalUnit RAs
|
|
# HG changeset patch # User Florian Haas <florian.haas[at]linbit.com> # Date 1245083304 -7200 # Node ID f86cda383abb14cd8ecdce20cc123a202ff13524 # Parent 73e18422f657c37fb2f3585c132d801c20dc90ab Improvements to the iSCSITarget and iSCSILogicalUnit RAs. Add a generic command wrapper to log command, their output, and their exit code (stolen from lmb's original drbd OCF RA). Set a system-dependent default implementation based on the availability of administration utilities. Implement forced connection shutdown on target stop (many thanks to Lars Ellenberg for the sed wizardry). diff -r 73e18422f657 -r f86cda383abb resources/OCF/iSCSILogicalUnit --- a/resources/OCF/iSCSILogicalUnit Mon Jun 15 11:02:33 2009 +0200 +++ b/resources/OCF/iSCSILogicalUnit Mon Jun 15 18:28:24 2009 +0200 @@ -33,6 +33,11 @@ LANG="C" # Defaults +# Set a default implementation based on software installed +if have_binary ietadm; then + OCF_RESKEY_implementation_default="iet" +fi +: ${OCF_RESKEY_implementation=${OCF_RESKEY_implementation_default}} ####################################################################### meta_data() { @@ -49,13 +54,15 @@ <shortdesc lang="en">iSCSI target export agent</shortdesc> <parameters> -<parameter name="implementation" required="1" unique="0"> +<parameter name="implementation" required="0" unique="0"> <longdesc lang="en"> The iSCSI target daemon implementation. Must be one of "iet", "tgt", -or "lio". +or "lio". If unspecified, an implementation is selected based on the +availability of management utilities, with "iet" being tried first, +them "tgt", then "lio". </longdesc> <shortdesc lang="en">iSCSI target daemon implementation</shortdesc> -<content type="string" /> +<content type="string" default="${OCF_RESKEY_implementation_default}"/> </parameter> <parameter name="tid" required="1" unique="0"> @@ -98,6 +105,31 @@ ####################################################################### +do_cmd() { + # Wrap local commands to capture their exit code and output. Some + # implementations (IET, notably) have management commands with + # very terse output. It helps to at least capture exit codes in + # the logs. + local cmd="$*" + ocf_log debug "Calling $cmd" + local cmd_out + cmd_out=$($cmd 2>&1) + ret=$? + + if [ $ret -ne 0 ]; then + ocf_log err "Called \"$cmd\"" + ocf_log err "Exit code $ret" + ocf_log err "Command output: \"$cmd_out\"" + else + ocf_log debug "Exit code $ret" + ocf_log debug "Command output: \"$cmd_out\"" + fi + + echo $cmd_out + return $ret +} + + iSCSILogicalUnit_usage() { cat <<END usage: $0 {start|stop|monitor|validate-all|meta-data} @@ -114,7 +146,7 @@ case $OCF_RESKEY_implementation in iet) - ietadm --op new \ + do_cmd ietadm --op new \ --tid=${OCF_RESKEY_tid} \ --lun=${OCF_RESKEY_lun} \ --params Path=${OCF_RESKEY_path} && return $OCF_SUCCESS @@ -128,7 +160,7 @@ if [ $? = $OCF_SUCCESS ]; then case $OCF_RESKEY_implementation in iet) - ietadm --op delete \ + do_cmd ietadm --op delete \ --tid=${OCF_RESKEY_tid} \ --lun=${OCF_RESKEY_lun} && return $OCF_SUCCESS ;; diff -r 73e18422f657 -r f86cda383abb resources/OCF/iSCSITarget --- a/resources/OCF/iSCSITarget Mon Jun 15 11:02:33 2009 +0200 +++ b/resources/OCF/iSCSITarget Mon Jun 15 18:28:24 2009 +0200 @@ -33,6 +33,11 @@ LANG="C" # Defaults +# Set a default implementation based on software installed +if have_binary ietadm; then + OCF_RESKEY_implementation_default="iet" +fi +: ${OCF_RESKEY_implementation=${OCF_RESKEY_implementation_default}} ####################################################################### meta_data() { @@ -49,13 +54,15 @@ <shortdesc lang="en">iSCSI target export agent</shortdesc> <parameters> -<parameter name="implementation" required="1" unique="0"> +<parameter name="implementation" required="0" unique="0"> <longdesc lang="en"> The iSCSI target daemon implementation. Must be one of "iet", "tgt", -or "lio". +or "lio". If unspecified, an implementation is selected based on the +availability of management utilities, with "iet" being tried first, +them "tgt", then "lio". </longdesc> <shortdesc lang="en">iSCSI target daemon implementation</shortdesc> -<content type="string" /> +<content type="string" default="${OCF_RESKEY_implementation_default}"/> </parameter> <parameter name="tid" required="1" unique="0"> @@ -100,6 +107,31 @@ ####################################################################### +do_cmd() { + # Wrap local commands to capture their exit code and output. Some + # implementations (IET, notably) have management commands with + # very terse output. It helps to at least capture exit codes in + # the logs. + local cmd="$*" + ocf_log debug "Calling $cmd" + local cmd_out + cmd_out=$($cmd 2>&1) + ret=$? + + if [ $ret -ne 0 ]; then + ocf_log err "Called \"$cmd\"" + ocf_log err "Exit code $ret" + ocf_log err "Command output: \"$cmd_out\"" + else + ocf_log debug "Exit code $ret" + ocf_log debug "Command output: \"$cmd_out\"" + fi + + echo $cmd_out + return $ret +} + + iSCSITarget_usage() { cat <<END usage: $0 {start|stop|monitor|validate-all|meta-data} @@ -120,13 +152,13 @@ case $OCF_RESKEY_implementation in iet) - ietadm --op new \ + do_cmd ietadm --op new \ --tid=${OCF_RESKEY_tid} \ --params Name=${OCF_RESKEY_name} || return $OCF_ERR_GENERIC for param in ${OCF_RESKEY_params}; do name=${param%=*} value=${param#*=} - ietadm --op update \ + do_cmd ietadm --op update \ --tid=${OCF_RESKEY_tid} \ --params ${name}=${value} || return $OCF_ERR_GENERIC done @@ -141,7 +173,24 @@ if [ $? = $OCF_SUCCESS ]; then case $OCF_RESKEY_implementation in iet) - ietadm --op delete \ + # Close existing connections. There is no other way to + # do this in IET than to parse the contents of + # /proc/net/iet/session. + local line + sed -ne '/^tid:'${OCF_RESKEY_tid}' /,/^tid/ { + /^[[:space:]]*sid:\([0-9]\+\)/ { + s/^[[:space:]]*sid:\([0-9]*\).*/--sid=\1/; h; + }; + /^[[:space:]]*cid:\([0-9]\+\)/ { + s/^[[:space:]]*cid:\([0-9]*\).*/--cid=\1/; G; s/\n/ /;p; + }; + }' < /proc/net/iet/session \ + | while read line; do + # $line looks like "--sid=X --cid=Y" + do_cmd ietadm --op delete \ + --tid ${OCF_RESKEY_tid} $line + done + do_cmd ietadm --op delete \ --tid=${OCF_RESKEY_tid} && return $OCF_SUCCESS ;; esac _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev[at]lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/
|