#!/bin/bash
set -e
if [[ $VERBOSE ]] ; then
set -x
exec 50>&2
else
exec 50>/dev/null
fi
bridges_started=( )
# need privileges with virsh
export VIRSH_DEFAULT_CONNECT_URI=${VIRSH_DEFAULT_CONNECT_URI:-qemu:///system}
prefix=rhbz491010
kernels=( $PWD/kernel/boot/vmlinuz-* )
function array-contains() {
local target="$1"; shift
while (( $# > 0 )) ; do
if [[ $1 = $target ]] ; then
return 0
fi
shift
done
return 1
}
function log_pipe() {
if [[ $VERBOSE ]] ; then
if (( $# == 0 )) ; then
local tee_args=( "/dev/stderr" )
else
local tee_args=( "$@" )
fi
tee "$@"
else
cat
fi
}
function setup-net() {
if (( ( $# % 2 ) == 1 )); then
echo "ERROR: Odd number of arguments given to setup-net" >&2
return 1
fi
while (( $# >= 2 )); do
local purpose="$1" bridge="$2"
local name="${prefix}.${purpose}"
virsh --quiet net-define <(cat <<-EOF
${name}
EOF
) >&50 2>&1
virsh --quiet net-start "${name}" >&50 2>&1
usleep 500
if ! /sbin/ip -o link list "${bridge}" | grep -q UP ; then
bridges_started+=( "${bridge}" )
sudo /sbin/ip link set "${bridge}" up
fi
shift 2
done
}
function build_mac() {
printf "00:16:3e:%02x:%02x:%02x" $(( $RANDOM % 256 )) $(( $RANDOM % 256 )) $(( $RANDOM % 256 ))
}
function define() {
local purpose="$1"
local mac_address=( $(build_mac) $(build_mac) $(build_mac) )
local extra_args=
if [[ $DEBUG ]] ; then
extra_args="DEBUG=1"
fi
virsh --quiet define <(cat <
${prefix}.${purpose}
768000
768000
1
hvm
${kernels[0]}
$PWD/initramfs.gz
root=/dev/ram0 rdinit=/init console=ttyS0 panic=1 noapic clocksource=acpi_pm MODE=${purpose} ${extra_args}
destroy
destroy
destroy
EOF
) >&50 2>&1
}
function run() {
local purpose="$1"
local vm="${prefix}.${purpose}"
local success_noted=0
define "$purpose"
rm -f "$PWD/logs/$purpose.status"
touch "$PWD/logs/$purpose.status"
virsh --quiet start "$vm" >&50 2>&1
echo "Waiting for $vm" >&2
sleep 1
while virsh list | grep -q "$vm"; do
if egrep -q "^(SETUP-DONE|TEST-SUCCEEDED)" "$PWD/logs/$purpose.status" ; then
success_noted=1
break
fi
echo -n . >&2
sleep 1
done
echo >&2
if (( success_noted > 0 )) ; then
return 0
fi
if [[ $DEBUG ]] ; then
tail "$PWD/logs/$purpose.status"
fi
return 1
}
function cleanup-vm() {
while (( $# )) ; do
virsh --quiet destroy "${prefix}.$1" >&50 2>&1 || :
virsh --quiet undefine "${prefix}.$1" >&50 2>&1 || :
shift
done
}
function cleanup-net() {
if (( ( $# % 2 ) == 1 )); then
echo "ERROR: Odd number of arguments given to cleanup-net" >&2
return 1
fi
while (( $# >= 2 )) ; do
local purpose="$1" bridge="$2"
local name="${prefix}.${purpose}"
if array-contains "${bridge}" "${bridges_started[@]}" ; then
sudo /sbin/ip link set "${bridge}" down
fi
virsh --quiet net-destroy "$name" >&50 2>&1 || :
virsh --quiet net-undefine "$name" >&50 2>&1 || :
shift 2
done
}
function cleanup-all() {
cleanup-vm "${guests[@]}"
cleanup-net \
client virtest1 \
server virtest2
virsh list --all | gawk '/rhbz491010/ { print "destroy " $2; print "undefine " $2 }' | log_pipe | virsh --quiet - >&50 2>&1
virsh net-list --all | gawk '/rhbz491010/ { print "net-destroy " $1; print "net-undefine " $1 }' | log_pipe | virsh --quiet - >&50 2>&1
}
trap "if [[ -z \$DEBUG ]] ; then cleanup-all; fi" 0
guests=( server lb client )
cleanup-all || :
setup-net \
client virtest1 \
server virtest2
run server
run lb
run client || :
if grep -q -e 'TEST-SUCCEEDED' logs/client.status ; then
echo "PASS ($(rpm -qp kernel.rpm))"
exit 0
else
echo "FAIL ($(rpm -qp kernel.rpm))"
exit 1
fi