Compare commits

...

No commits in common. "c8" and "c8s" have entirely different histories.
c8 ... c8s

7 changed files with 374 additions and 7 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
SOURCES/corosync-qdevice-3.0.2.tar.gz
/corosync-qdevice-3.0.2.tar.gz

View File

@ -11,12 +11,12 @@
Name: corosync-qdevice
Summary: The Corosync Cluster Engine Qdevice
Version: 3.0.2
Release: 2%{?gitver}%{?dist}
Release: 1%{?gitver}%{?dist}.1
License: BSD
URL: https://github.com/corosync/corosync-qdevice
Source0: https://github.com/corosync/corosync-qdevice/releases/download/v%{version}%{?gittarver}/%{name}-%{version}%{?gittarver}.tar.gz
Patch0: bz2181322-1-qdevice-Destroy-non-blocking-client-on-failure.patch
Patch0: bz2178715-1-qdevice-Destroy-non-blocking-client-on-failure.patch
# Runtime bits
Requires: corosync >= 2.4.0
@ -47,7 +47,7 @@ BuildRequires: autoconf automake libtool
%prep
%setup -q -n %{name}-%{version}%{?gittarver}
%patch0 -p1 -b .bz2181322-1
%patch0 -p1 -b .bz2178715-1
%build
%if %{with runautogen}
@ -210,11 +210,11 @@ fi
%{_mandir}/man8/corosync-qnetd.8*
%changelog
* Thu Mar 23 2023 Jan Friesse <jfriesse@redhat.com> - 3.0.2-2
- Resolves: rhbz#2181322
* Thu Mar 23 2023 Jan Friesse <jfriesse@redhat.com> - 3.0.2-1.1
- Resolves: rhbz#2178715
- qdevice: Destroy non blocking client on failure (rhbz#2181322)
- merge upstream commit 4331c7d5650a8bf44c16512419f1954d0ef96df5 (rhbz#2181322)
- qdevice: Destroy non blocking client on failure (rhbz#2178715)
- merge upstream commit 4331c7d5650a8bf44c16512419f1954d0ef96df5 (rhbz#2178715)
* Thu Nov 03 2022 Jan Friesse <jfriesse@redhat.com> - 3.0.2-1
- Resolves: rhbz#2135862

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-8
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (corosync-qdevice-3.0.2.tar.gz) = ca2410b873f872ab40156ccb46ce4504e479db02ab3af56bbbfdb634a474ca9759db09b605356414467b3c22f7baad082613b2bf5d5d017e9fa532baa940c2e2

348
tests/smoke/runtest.sh Normal file
View File

@ -0,0 +1,348 @@
#!/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

11
tests/tests.yml Normal file
View File

@ -0,0 +1,11 @@
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
tests:
- smoke
required_packages:
- iproute
- corosync-qdevice
- corosync-qnetd