summaryrefslogtreecommitdiffstats
path: root/cts/cluster_test.in
diff options
context:
space:
mode:
Diffstat (limited to 'cts/cluster_test.in')
-rwxr-xr-xcts/cluster_test.in175
1 files changed, 175 insertions, 0 deletions
diff --git a/cts/cluster_test.in b/cts/cluster_test.in
new file mode 100755
index 0000000..f5cb3e8
--- /dev/null
+++ b/cts/cluster_test.in
@@ -0,0 +1,175 @@
+#!@BASH_PATH@
+#
+# Copyright 2008-2020 the Pacemaker project contributors
+#
+# The version control history for this file may have further details.
+#
+# This source code is licensed under the GNU General Public License version 2
+# or later (GPLv2+) WITHOUT ANY WARRANTY.
+#
+if [ -e ~/.cts ]; then
+ . ~/.cts
+fi
+anyAsked=0
+
+[ $# -lt 1 ] || CTS_numtests=$1
+
+die() { echo "$@"; exit 1; }
+
+if [ -z "$CTS_asked_once" ]; then
+ anyAsked=1
+ echo "This script should only be executed on the test exerciser."
+ echo "The test exerciser will remotely execute the actions required by the"
+ echo "tests and should not be part of the cluster itself."
+
+ read -p "Is this host intended to be the test exerciser? (yN) " doUnderstand
+ [ "$doUnderstand" = "y" ] \
+ || die "This script must be executed on the test exerciser"
+fi
+
+if [ -z "$CTS_node_list" ]; then
+ anyAsked=1
+ read -p "Please list your cluster nodes (eg. node1 node2 node3): " CTS_node_list
+else
+ echo "Beginning test of cluster: $CTS_node_list"
+fi
+
+if [ -z "$CTS_stack" ]; then
+ anyAsked=1
+ read -p "Which cluster stack are you using? ([corosync]): " CTS_stack
+ [ -n "$CTS_stack" ] || CTS_stack=corosync
+else
+ echo "Using the $CTS_stack cluster stack"
+fi
+
+[ "${CTS_node_list}" = "${CTS_node_list/$HOSTNAME/}" ] \
+ || die "This script must be executed on the test exerciser, and the test exerciser cannot be part of the cluster"
+
+printf "+ Bootstrapping ssh... "
+if [ -z "$SSH_AUTH_SOCK" ]; then
+ printf "\n + Initializing SSH "
+ eval "$(ssh-agent)"
+ echo " + Adding identities..."
+ ssh-add
+ rc=$?
+ if [ $rc -ne 0 ]; then
+ echo " -- No identities added"
+ printf "\nThe ability to open key-based 'ssh' connections (as the user 'root') is required to use CTS.\n"
+
+ read -p " - Do you want this program to help you create one? (yN) " auto_fix
+ if [ "$auto_fix" = "y" ]; then
+ ssh-keygen -t dsa
+ ssh-add
+ else
+ die "Please run 'ssh-keygen -t dsa' to create a new key"
+ fi
+ fi
+else
+ echo "OK"
+fi
+
+test_ok=1
+printf "+ Testing ssh configuration... "
+for n in $CTS_node_list; do
+ ssh -l root -o PasswordAuthentication=no -o ConnectTimeout=5 "$n" /bin/true
+ rc=$?
+ if [ $rc -ne 0 ]; then
+ echo " - connection to $n failed"
+ test_ok=0
+ fi
+done
+
+if [ $test_ok -eq 0 ]; then
+ printf "\nThe ability to open key-based 'ssh' connections (as the user 'root') is required to use CTS.\n"
+
+ read -p " - Do you want this program to help you with such a setup? (yN) " auto_fix
+ if [ "$auto_fix" = "y" ]; then
+ # XXX are we picking the most suitable identity?
+ privKey=$(ssh-add -L | head -n1 | cut -d" " -f3)
+ sshCopyIdOpts="-o User=root"
+ [ -z "$privKey" ] || sshCopyIdOpts+=" -i \"${privKey}.pub\""
+ for n in $CTS_node_list; do
+ eval "ssh-copy-id $sshCopyIdOpts \"${n}\"" \
+ || die "Attempt to 'ssh-copy-id $sshCopyIdOpts \"$n\"' failed"
+ done
+ else
+ die "Please install one of your SSH public keys to root's account on all cluster nodes"
+ fi
+fi
+echo "OK"
+
+if [ -z "$CTS_logfile" ]; then
+ anyAsked=1
+ read -p " + Where does/should syslog store logs from remote hosts? (/var/log/messages) " CTS_logfile
+ [ -n "$CTS_logfile" ] || CTS_logfile=/var/log/messages
+fi
+
+[ -e "$CTS_logfile" ] || die "$CTS_logfile doesn't exist"
+
+if [ -z "$CTS_logfacility" ]; then
+ anyAsked=1
+ read -p " + Which log facility does the cluster use? (daemon) " CTS_logfacility
+ [ -n "$CTS_logfacility" ] || CTS_logfacility=daemon
+fi
+
+if [ -z "$CTS_boot" ]; then
+ read -p "+ Is the cluster software started automatically when a node boots? [yN] " CTS_boot
+ if [ -z "$CTS_boot" ]; then
+ CTS_boot=0
+ else
+ case $CTS_boot in
+ 1|y|Y) CTS_boot=1;;
+ *) CTS_boot=0;;
+ esac
+ fi
+fi
+
+if [ -z "$CTS_numtests" ]; then
+ read -p "+ How many test iterations should be performed? (500) " CTS_numtests
+ [ -n "$CTS_numtests" ] || CTS_numtests=500
+fi
+
+if [ -z "$CTS_asked_once" ]; then
+ anyAsked=1
+ read -p "+ What type of STONITH agent do you use? (none) " CTS_stonith
+ [ -z "$CTS_stonith" ] \
+ || read -p "+ List any STONITH agent parameters (eq. device_host=switch.power.com): " CTS_stonith_args
+ [ -n "$CTS_adv" ] \
+ || read -p "+ (Advanced) Any extra CTS parameters? (none) " CTS_adv
+fi
+
+[ $anyAsked -eq 0 ] \
+ || read -p "+ Save values to ~/.cts for next time? (yN) " doSave
+
+if [ "$doSave" = "y" ]; then
+ cat > ~/.cts <<-EOF
+ # CTS Test data
+ CTS_stack="$CTS_stack"
+ CTS_node_list="$CTS_node_list"
+ CTS_logfile="$CTS_logfile"
+ CTS_logport="$CTS_logport"
+ CTS_logfacility="$CTS_logfacility"
+ CTS_asked_once=1
+ CTS_adv="$CTS_adv"
+ CTS_stonith="$CTS_stonith"
+ CTS_stonith_args="$CTS_stonith_args"
+ CTS_boot="$CTS_boot"
+EOF
+fi
+
+cts_extra=""
+if [ -n "$CTS_stonith" ]; then
+ cts_extra="$cts_extra --stonith-type $CTS_stonith"
+ [ -z "$CTS_stonith_args" ] \
+ || cts_extra="$cts_extra --stonith-params \"$CTS_stonith_args\""
+else
+ cts_extra="$cts_extra --stonith 0"
+ echo " - Testing a cluster without STONITH is like a blunt pencil... pointless"
+fi
+
+printf "\nAll set to go for %d iterations!\n" "$CTS_numtests"
+[ $anyAsked -ne 0 ] \
+ || echo "+ To use a different configuration, remove ~/.cts and re-run cts (or edit it manually)."
+
+echo Now paste the following command into this shell:
+echo "@PYTHON@ `dirname "$0"`/cts-lab -L \"$CTS_logfile\" --syslog-facility \"$CTS_logfacility\" --no-unsafe-tests --stack \"$CTS_stack\" $CTS_adv --at-boot \"$CTS_boot\" $cts_extra \"$CTS_numtests\" --nodes \"$CTS_node_list\""