diff options
Diffstat (limited to '')
-rwxr-xr-x | tools/ocf-tester.in | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/tools/ocf-tester.in b/tools/ocf-tester.in new file mode 100755 index 0000000..cfdfd70 --- /dev/null +++ b/tools/ocf-tester.in @@ -0,0 +1,351 @@ +#!/bin/sh +# +# $Id: ocf-tester,v 1.2 2006/08/14 09:38:20 andrew Exp $ +# +# Copyright (c) 2006 Novell Inc, Andrew Beekhof +# 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. +# + +DATADIR=@datadir@ +METADATA_LINT="xmllint --noout --valid -" + +# set some common meta attributes, which are expected to be +# present by resource agents +export OCF_RESKEY_CRM_meta_timeout=20000 # 20 seconds timeout +export OCF_RESKEY_CRM_meta_interval=10000 # reset this for probes + +num_errors=0 + +info() { + [ "$quiet" -eq 1 ] && return + echo "$*" +} +debug() { + [ "$verbose" -eq 0 ] && return + echo "$*" +} +usage() { + # make sure to output errors on stderr + [ "x$1" = "x0" ] || exec >&2 + + echo "Tool for testing if a cluster resource is OCF compliant" + echo "" + echo "Usage: ocf-tester [-hvqdX] -n resource_name [-o name=value]* /full/path/to/resource/agent" + echo "" + echo "Options:" + echo " -h This text" + echo " -v Be verbose while testing" + echo " -q Be quiet while testing" + echo " -d Turn on RA debugging" + echo " -X Turn on RA tracing (expect large output)" + echo " -n name Name of the resource" + echo " -o name=value Name and value of any parameters required by the agent" + exit $1 +} + +assert() { + rc=$1; shift + target=$1; shift + msg=$1; shift + local targetrc matched + + if [ $# = 0 ]; then + exit_code=0 + else + exit_code=$1; shift + fi + + for targetrc in `echo $target | tr ':' ' '`; do + [ $rc -eq $targetrc ] && matched=1 + done + if [ "$matched" != 1 ]; then + num_errors=`expr $num_errors + 1` + echo "* rc=$rc: $msg" + if [ $exit_code != 0 ]; then + [ -n "$command_output" ] && cat<<EOF +$command_output +EOF + echo "Aborting tests" + exit $exit_code + fi + fi + command_output="" +} + +done=0 +ra_args="" +verbose=0 +quiet=0 +while test "$done" = "0"; do + case "$1" in + -n) OCF_RESOURCE_INSTANCE=$2; ra_args="$ra_args OCF_RESOURCE_INSTANCE=$2"; shift; shift;; + -o) name=${2%%=*}; value=${2#*=}; + lrm_ra_args="$lrm_ra_args $2"; + ra_args="$ra_args OCF_RESKEY_$name='$value'"; shift; shift;; + -v) verbose=1; shift;; + -d) export HA_debug=1; shift;; + -X) export OCF_TRACE_RA=1; verbose=1; shift;; + -q) quiet=1; shift;; + -?|--help) usage 0;; + --version) echo "@PACKAGE_VERSION@"; exit 0;; + -*) echo "unknown option: $1" >&2; usage 1;; + *) done=1;; + esac +done + +if [ "x" = "x$OCF_ROOT" ]; then + if [ -d /usr/lib/ocf ]; then + export OCF_ROOT=/usr/lib/ocf + else + echo "You must supply the location of OCF_ROOT (common location is /usr/lib/ocf)" >&2 + usage 1 + fi +fi + +if [ "x" = "x$OCF_RESOURCE_INSTANCE" ]; then + echo "You must give your resource a name, set OCF_RESOURCE_INSTANCE" >&2 + usage 1 +fi + +agent=$1 +if [ ! -e $agent ]; then + echo "You must provide the full path to your resource agent" >&2 + usage 1 +fi +installed_rc=5 +stopped_rc=7 +has_demote=1 +has_promote=1 + +test_permissions() { + action=meta-data + debug ${1:-"Testing permissions with uid nobody"} + su nobody -s /bin/sh -c "$agent $action" > /dev/null +} + +test_metadata() { + action=meta-data + msg=${1:-"Testing: $action"} + debug $msg + $agent $action | (cd $DATADIR/resource-agents && $METADATA_LINT) + rc=$? + #echo rc: $rc + return $rc +} + +test_command() { + action=$1; shift + export __OCF_ACTION=$action + msg=${1:-"Testing: $action"} + #echo Running: "export $ra_args; $agent $action 2>&1 > /dev/null" + if [ $verbose -eq 0 ]; then + command_output=`$agent $action 2>&1` + else + debug $msg + $agent $action + fi + rc=$? + #echo rc: $rc + return $rc +} + +# Begin tests +info "Beginning tests for $agent..." + +if [ ! -f $agent ]; then + assert 7 0 "Could not find file: $agent" +fi + +if [ `id -u` = 0 ]; then + test_permissions + assert $? 0 "Your agent has too restrictive permissions: should be 755" +else + echo "WARN: Can't check agent's permissions because we're not root; they should be 755" +fi + +test_metadata +assert $? 0 "Your agent produces meta-data which does not conform to ra-api-1.dtd" + +OCF_TESTER_FAIL_HAVE_BINARY=1 +export OCF_TESTER_FAIL_HAVE_BINARY +test_command meta-data +rc=$? +if [ $rc -eq 3 ]; then + assert $rc 0 "Your agent does not support the meta-data action" +else + assert $rc 0 "The meta-data action cannot fail and must return 0" +fi +unset OCF_TESTER_FAIL_HAVE_BINARY + +ra_args="export $ra_args" +eval $ra_args +test_command validate-all +rc=$? +if [ $rc -eq 3 ]; then + assert $rc 0 "Your agent does not support the validate-all action" +elif [ $rc -ne 0 ]; then + assert $rc 0 "Validation failed. Did you supply enough options with -o ?" 1 + usage $rc +fi + +test_command monitor "Checking current state" +rc=$? +if [ $rc -eq 3 ]; then + assert $rc 7 "Your agent does not support the monitor action" 1 + +elif [ $rc -eq 8 ]; then + test_command demote "Cleanup, demote" + assert $? 0 "Your agent was promoted and could not be demoted" 1 + + test_command stop "Cleanup, stop" + assert $? 0 "Your agent was promoted and could not be stopped" 1 + +elif [ $rc -ne 7 ]; then + test_command stop + assert $? 0 "Your agent was active and could not be stopped" 1 +fi + +test_command monitor +assert $? $stopped_rc "Monitoring a stopped resource should return $stopped_rc" + +OCF_TESTER_FAIL_HAVE_BINARY=1 +export OCF_TESTER_FAIL_HAVE_BINARY +OCF_RESKEY_CRM_meta_interval=0 +test_command monitor +assert $? $stopped_rc:$installed_rc "The initial probe for a stopped resource should return $stopped_rc or $installed_rc even if all binaries are missing" +unset OCF_TESTER_FAIL_HAVE_BINARY +OCF_RESKEY_CRM_meta_interval=20000 + +test_command start +assert $? 0 "Start failed. Did you supply enough options with -o ?" 1 + +test_command monitor +assert $? 0 "Monitoring an active resource should return 0" + +OCF_RESKEY_CRM_meta_interval=0 +test_command monitor +assert $? 0 "Probing an active resource should return 0" +OCF_RESKEY_CRM_meta_interval=20000 + +test_command notify +rc=$? +if [ $rc -eq 3 ]; then + info "* Your agent does not support the notify action (optional)" +else + assert $rc 0 "The notify action cannot fail and must return 0" +fi + +test_command demote "Checking for demote action" +if [ $? -eq 3 ]; then + has_demote=0 + info "* Your agent does not support the demote action (optional)" +fi + +test_command promote "Checking for promote action" +if [ $? -eq 3 ]; then + has_promote=0 + info "* Your agent does not support the promote action (optional)" +fi + +if [ $has_promote -eq 1 -a $has_demote -eq 1 ]; then + test_command demote "Testing: demotion of started resource" + assert $? 0 "Demoting a start resource should not fail" + + test_command promote + assert $? 0 "Promote failed" + + test_command demote + assert $? 0 "Demote failed" 1 + + test_command demote "Testing: demotion of demoted resource" + assert $? 0 "Demoting a demoted resource should not fail" + + test_command promote "Promoting resource" + assert $? 0 "Promote failed" 1 + + test_command promote "Testing: promotion of promoted resource" + assert $? 0 "Promoting a promoted resource should not fail" + + test_command demote "Demoting resource" + assert $? 0 "Demote failed" 1 + +elif [ $has_promote -eq 0 -a $has_demote -eq 0 ]; then + info "* Your agent does not support promotable clones (optional)" + +else + echo "* Your agent partially supports promotable clones" + num_errors=`expr $num_errors + 1` +fi + +test_command stop +assert $? 0 "Stop failed" 1 + +test_command monitor +assert $? $stopped_rc "Monitoring a stopped resource should return $stopped_rc" + +test_command start "Restarting resource..." +assert $? 0 "Start failed" 1 + +test_command monitor +assert $? 0 "Monitoring an active resource should return 0" + +test_command start "Testing: starting a started resource" +assert $? 0 "Starting a running resource is required to succeed" + +test_command monitor +assert $? 0 "Monitoring an active resource should return 0" + +test_command stop "Stopping resource" +assert $? 0 "Stop could not clean up after multiple starts" 1 + +test_command monitor +assert $? $stopped_rc "Monitoring a stopped resource should return $stopped_rc" + +test_command stop "Testing: stopping a stopped resource" +assert $? 0 "Stopping a stopped resource is required to succeed" + +test_command monitor +assert $? $stopped_rc "Monitoring a stopped resource should return $stopped_rc" + +test_command migrate_to "Checking for migrate_to action" +rc=$? +if [ $rc -ne 3 ]; then + test_command migrate_from "Checking for migrate_from action" +fi +if [ $? -eq 3 ]; then + info "* Your agent does not support the migrate action (optional)" +fi + +test_command reload "Checking for reload action" +if [ $? -eq 3 ]; then + info "* Your agent does not support the reload action (optional)" +fi + +if [ $num_errors -gt 0 ]; then + echo "Tests failed: $agent failed $num_errors tests" >&2 + exit 1 +else + echo $agent passed all tests + exit 0 +fi + +# vim:et:ts=8:sw=4 |