corosync-qdevice/tests/smoke/runtest.sh
DistroBaker 0b4128d52b Merged update from upstream sources
This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/corosync-qdevice.git#7282512e9c41c4defcada2e1e95960fa3be1bf21
2020-11-02 16:48:36 +01:00

349 lines
8.5 KiB
Bash

#!/bin/bash
# This file was autogenerated at 2019-05-13T13:43:38+02:00 from 90bd97ada89befa1a63133335a419ad7311c3d75
# Copyright (c) 2019, Red Hat, Inc.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND RED HAT, INC. DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RED HAT, INC. BE LIABLE
# FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Author: Jan Friesse <jfriesse@redhat.com>
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!! Script overwrites corosync.conf, authkey and qdevice/qnetd certificates !!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Home https://github.com/jfriesse/csts/tree/master/smoke
# -e is really important
set -xe
set -o pipefail
# Variables changing test behavior
PREFIX="/"
COROSYNC_SYSCONFD="${PREFIX}etc/corosync"
COROSYNC_CONF="${COROSYNC_SYSCONFD}/corosync.conf"
COROSYNC_AUTHKEY="${COROSYNC_SYSCONFD}/authkey"
COROSYNC_CLUSTER_NAME="smoketestcluster"
TOKEN_TIMEOUT=1000
MAX_REPEATS=60
####################
# Helper functions #
####################
get_ip() {
ip_res=$(ip route get 8.8.8.8)
# Format is "8.8.8.8 via ROUTE_IPADDR dev DEV src IPADDR uid NUMBER"
# Remove everything up to "src " and then everything after " "
addr=${ip_res##*src }
addr=${addr%% *}
echo "$addr"
}
# generate_corosync_conf crypto [token] [qdevice]
# crypto can be on or off
# when token is defined it is used for token timeout
# when qdevice is set to on qdevice section is created and second node is added
generate_corosync_conf() {
case "$1" in
"on")
cipher="aes256"
hash="sha256"
;;
"off")
cipher="none"
hash="none"
;;
*)
# Unknown crypto
exit 1
esac
token=$TOKEN_TIMEOUT
if [ ! -z "$2" ];then
token="$2"
fi
qdevice="$3"
true_command=`which true`
cat << _EOF_
totem {
version: 2
cluster_name: $COROSYNC_CLUSTER_NAME
transport: knet
crypto_cipher: $cipher
crypto_hash: $hash
token: $token
}
logging {
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: yes
}
quorum {
provider: corosync_votequorum
_EOF_
if [ "$qdevice" == "on" ];then
cat << _EOF_
device {
votes: 1
model: net
net {
host: $LOCAL_IP
algorithm: ffsplit
}
heuristics {
mode: sync
exec_true: $true_command
}
}
_EOF_
fi
cat << _EOF_
}
nodelist {
node {
nodeid: 1
ring0_addr: $LOCAL_IP
}
_EOF_
if [ "$qdevice" == "on" ];then
cat << _EOF_
node {
nodeid: 2
ring0_addr: 192.0.2.2
}
_EOF_
fi
cat << _EOF_
}
_EOF_
}
# service_start service
service_start() {
# service service must be inactive
systemctl is-active "$1" && exit 1 || true
systemctl start "$1"
systemctl is-active "$1"
}
# service_stop service
service_stop() {
systemctl is-active "$1" || exit 1
systemctl stop "$1"
systemctl is-active "$1" && exit 1 || true
}
######################
# Computed variables #
######################
LOCAL_IP=$(get_ip)
##################
# C test sources #
##################
# Test sources are encoded as a base64 string and piped to base64 to store them in /tmp
##################
# Test functions #
##################
test_corosync_qdevice_h() {
# Check that corosync-qdevice(-tool) binary exists and -h returns help text
res=`corosync-qdevice -h || true`
[ "$res" != "${res/usage/}" ]
res=`corosync-qdevice-tool -h || true`
[ "$res" != "${res/usage/}" ]
}
test_corosync_qnetd_h() {
# Check that corosync-qnetd(-tool) binary exists and -h returns help text
res=`corosync-qnetd -h || true`
[ "$res" != "${res/usage/}" ]
res=`corosync-qnetd-tool -h || true`
[ "$res" != "${res/usage/}" ]
}
test_crt_creation() {
# Erase old certificates
rm -rf "$COROSYNC_SYSCONFD/qdevice/net/nssdb"
rm -rf "$COROSYNC_SYSCONFD/qnetd/nssdb"
corosync-qnetd-certutil -i
corosync-qdevice-net-certutil -i -c "$COROSYNC_SYSCONFD/qnetd/nssdb/qnetd-cacert.crt"
corosync-qdevice-net-certutil -r -n "$COROSYNC_CLUSTER_NAME"
corosync-qnetd-certutil -s -c "$COROSYNC_SYSCONFD/qdevice/net/nssdb/qdevice-net-node.crq" -n "$COROSYNC_CLUSTER_NAME"
corosync-qdevice-net-certutil -M -c "$COROSYNC_SYSCONFD/qnetd/nssdb/cluster-$COROSYNC_CLUSTER_NAME.crt"
}
test_qnetd_start() {
service_start "corosync-qnetd"
}
test_qdevice_start() {
service_start "corosync-qdevice"
}
test_corosync_start() {
generate_corosync_conf "off" "" "on" > "$COROSYNC_CONF"
cat "$COROSYNC_CONF"
service_start "corosync"
}
test_qdevice_stop() {
service_stop "corosync-qdevice"
}
test_qnetd_stop() {
service_stop "corosync-qnetd"
}
test_corosync_stop() {
service_stop "corosync"
}
# test_corosync_quorumtool quorate
# quorate can be yes or no
test_corosync_quorumtool() {
quorumtool_res_file=`mktemp`
# This is already fixed in upstream db38e3958c4f88d5d06e8f7c83d6d90334d9fbd2
(corosync-quorumtool -ips || true) | tee "$quorumtool_res_file"
# Ensure this is single node cluster
grep -qi '^Nodes:.*1$' "$quorumtool_res_file"
# Current node id is 1
grep -qi '^Node ID:.*1$' "$quorumtool_res_file"
# Is quorate (libquorum)
if [ "$1" == "yes" ];then
grep -qi '^Quorate:.*Yes$' "$quorumtool_res_file"
else
grep -qi '^Quorate:.*No$' "$quorumtool_res_file"
fi
# Quorum is 2
grep -qi '^Quorum:.*2' "$quorumtool_res_file"
# Is quorate (libvotequorum)
if [ "$1" == "yes" ];then
grep -qi '^Flags:.*Quorate' "$quorumtool_res_file"
fi
rm -f "$quorumtool_res_file"
}
# Test corosync-qdevice-tool by waiting for connected state and
# checking heuristics results
test_qdevice_tool() {
qdevice_tool_res_file=`mktemp`
cont=true
repeats=0
while $cont;do
corosync-qdevice-tool -s | tee "$qdevice_tool_res_file"
if grep -qi '^State:.*Connected' "$qdevice_tool_res_file";then
cont=false
else
repeats=$((repeats+1))
[ "$repeats" -le "$MAX_REPEATS" ]
sleep 1
fi
done
corosync-qdevice-tool -sv | tee "$qdevice_tool_res_file"
grep -qi '^Heuristics result:.*Pass ' "$qdevice_tool_res_file"
rm -f "$qdevice_tool_res_file"
}
# Test qnetd tool -s (check connected clients/clusters) and -l
# (check node id, membership and heuristics)
test_qnetd_tool() {
qnetd_tool_res_file=`mktemp`
corosync-qnetd-tool -s | tee "$qnetd_tool_res_file"
grep -qi '^Connected clients:.*1$' "$qnetd_tool_res_file"
grep -qi '^Connected clusters:.*1$' "$qnetd_tool_res_file"
corosync-qnetd-tool -sv | tee "$qnetd_tool_res_file"
corosync-qnetd-tool -l | tee "$qnetd_tool_res_file"
grep -qi "^Cluster \"$COROSYNC_CLUSTER_NAME\":\$" "$qnetd_tool_res_file"
grep -qi 'Node ID 1:$' "$qnetd_tool_res_file"
grep -qi 'Membership node list:.*1$' "$qnetd_tool_res_file"
grep -qi 'Heuristics:.*Pass$' "$qnetd_tool_res_file"
corosync-qnetd-tool -lv | tee "$qnetd_tool_res_file"
rm -f "$qnetd_tool_res_file" "$qnetd_tool_res_file"
}
test_qdevice_qnetd_man_pages() {
# At least these man pages should be installed
expected_mp="corosync-qnetd corosync-qnetd-certutil corosync-qnetd-tool
corosync-qdevice corosync-qdevice-net-certutil corosync-qdevice-tool"
for mp in $expected_mp;do
man -w "$mp"
done
}
########
# main #
########
if [ -z "$PREFIX" ];then
echo "PREFIX not defined. Do not run *.inc.sh directly"
exit 1
fi
test_corosync_qdevice_h
test_corosync_qnetd_h
test_qdevice_qnetd_man_pages
test_crt_creation
test_qnetd_start
test_corosync_start
test_corosync_quorumtool "no"
test_qdevice_start
test_qdevice_tool
test_qnetd_tool
test_corosync_quorumtool "yes"
test_qdevice_stop
test_corosync_stop
test_qnetd_stop