polardbxengine/storage/ndb/test/run-test/autotest-run.sh

512 lines
14 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#############################################################
# This script created by Jonas does the following #
# Cleans up clones and pevious builds, pulls new clones, #
# builds, deploys, configures the tests and launches ATRT #
#############################################################
###############
#Script setup #
##############
save_args=$*
VERSION="autotest-run.sh version 1.22"
DATE=`date '+%Y-%m-%d'`
if [ `uname -s` != "SunOS" ]
then
if [ `uname | grep -ic cygwin || true` -ne 0 ]
then
HOST=`hostname`
# Returns windows CRLF
HOST=`echo $HOST | tr -d "\015"`
echo "Host: '$HOST'"
else
HOST=`hostname -s`
fi
else
HOST=`hostname`
fi
export DATE HOST
set -e
ulimit -Sc unlimited
echo "`date` starting: $*"
RSYNC_RSH=ssh
export RSYNC_RSH
verbose=0
report=yes
nolock=
clonename=
RUN="daily-basic"
conf=autotest.conf
LOCK=$HOME/.autotest-lock
############################
# Read command line entries#
############################
while [ "$1" ]
do
case "$1" in
--verbose=*) verbose=`echo $1 | sed s/--verbose=//`;;
--verbose) verbose=`expr $verbose + 1`;;
--conf=*) conf=`echo $1 | sed s/--conf=//`;;
--version) echo $VERSION; exit;;
--suite=*) RUN=`echo $1 | sed s/--suite=//`;;
--suite-suffix=*) suite_suffix=`echo $1 | sed s/--suite-suffix=//`;;
--run-dir=*) run_dir=`echo $1 | sed s/--run-dir=//`;;
--custom-atrt=*) custom_atrt=`echo $1 | sed s/--custom-atrt=//`;;
--custom-cpcc=*) custom_cpcc=`echo $1 | sed s/--custom-cpcc=//`;;
--install-dir=*) install_dir=`echo $1 | sed s/--install-dir=//`;;
--install-dir0=*) install_dir0=`echo $1 | sed s/--install-dir0=//`;;
--install-dir1=*) install_dir1=`echo $1 | sed s/--install-dir1=//`;;
--clone=*) clone0=`echo $1 | sed s/--clone=//`;;
--clone0=*) clone0=`echo $1 | sed s/--clone0=//`;;
--clone1=*) clone1=`echo $1 | sed s/--clone1=//`;;
--nolock) nolock=true;;
--clonename=*) clonename=`echo $1 | sed s/--clonename=//`;;
--baseport=*) baseport_arg="$1";;
--base-dir=*) base_dir=`echo $1 | sed s/--base-dir=//`;;
--clusters=*) clusters_arg="$1";;
--atrt-defaults-group-suffix=*)
atrt_defaults_group_suffix_arg="${1/#--atrt-/--}"
;;
--site=*) site_arg="$1";;
--default-max-retries=*) default_max_retries_arg="$1";;
--default-force-cluster-restart) default_force_cluster_restart_arg="$1";;
--default-behaviour-on-failure=*) default_behaviour_on_failure_arg="$1";;
esac
shift
done
#################################
#Make sure the configfile exists#
#if it does not exit. if it does#
# (.) load it #
#################################
install_dir=${install_dir:-$install_dir0}
install_dir0=${install_dir0:-$install_dir}
install_dir_save=$install_dir0
if [ -f $conf ]
then
. $conf
else
echo "Can't find config file: $conf"
exit
fi
install_dir0=$install_dir_save
if [ -z "$run_dir" ]
then
if [ "$install_dir1" ]
then
echo "--run-dir not specified but install_dir1 specified"
echo "giving up"
exit
fi
run_dir=$install_dir0
fi
###############################
# Validate that all interesting
# variables where set in conf
###############################
vars="target base_dir install_dir0 hosts"
if [ "$report" ]
then
vars="$vars result_host result_path"
fi
for i in $vars
do
t=`echo echo \\$$i`
if [ -z "`eval $t`" ]
then
echo "Invalid config: $conf, variable $i is not set"
exit
fi
done
###############################
#Print out the enviroment vars#
###############################
if [ $verbose -gt 0 ]
then
env
fi
#######################################
# Check to see if the lock file exists#
# If it does exit. #
#######################################
if [ -z "$nolock" ]
then
if [ -f $LOCK ]
then
echo "Lock file exists: $LOCK"
exit 1
fi
echo "$DATE $RUN" > $LOCK
fi
on_exit() {
####################################
# Revert copy of test programs
####################################
if [ -f "${run_dir}/revert_copy_missing_ndbclient_test_programs" ]
then
source "${run_dir}/revert_copy_missing_ndbclient_test_programs"
fi
####################################
# Remove the lock file before exit #
####################################
if [ -z "${nolock}" ] &&
[ -f "${LOCK}" ]
then
rm -f "${LOCK}"
fi
}
trap on_exit EXIT
###############################################
# Check that all interesting files are present#
###############################################
test_dir=$install_dir/mysql-test/ndb
# Check if executables in $install_dir0 is executable at current
# platform, they could be built for another kind of platform
unset NDB_CPCC_HOSTS
if [ -n "$custom_atrt" ];
then
echo "Using custom atrt ${custom_atrt}"
atrt="${custom_atrt}"
elif ${install_dir}/bin/ndb_cpcc 2>/dev/null
then
echo "Using atrt from test build"
atrt="${test_dir}/atrt"
else
echo "Note: Cross platform testing, atrt used from server path" >&2
atrt=`which atrt`
fi
if [ -n "$custom_cpcc" ];
then
echo "Using custom ndb_cpcc ${custom_cpcc}"
ndb_cpcc="${custom_cpcc}"
elif ${install_dir}/bin/ndb_cpcc 2>/dev/null
then
echo "Using ndb_cpcc from test build"
ndb_cpcc="${install_dir}/bin/ndb_cpcc"
else
echo "Note: Cross platform testing, ndb_cpcc used from server path" >&2
ndb_cpcc=`which ndb_cpcc`
fi
if [ -n "${suite_suffix}" ]; then
suite_suffix="--${suite_suffix}"
fi
test_file="${test_dir}/${RUN}${suite_suffix}-tests.txt"
if [ ! -f "$test_file" ]; then
echo "Cant find testfile: $test_file"
exit 1
fi
if [ ! -x "$atrt" ]
then
echo "Cant find atrt binary at $atrt"
exit 1
fi
############################
# check ndb_cpcc fail hosts#
############################
failed=`$ndb_cpcc $hosts | awk '{ if($1=="Failed"){ print;}}'`
if [ "$failed" ]
then
echo "Cant contact cpcd on $failed, exiting"
exit 1
fi
#############################
# Function for replacing the#
# choose host with real host#
# names. Note $$ = PID #
#############################
choose(){
SRC=$1
TMP1=/tmp/choose.$$
TMP2=/tmp/choose.$$.$$
shift
cp $SRC $TMP1
i=1
while [ $# -gt 0 ]
do
sed -e s,"CHOOSE_host$i",$1,g < $TMP1 > $TMP2
mv $TMP2 $TMP1
shift
i=`expr $i + 1`
done
cat $TMP1
rm -f $TMP1
}
choose_conf(){
if [ -f $test_dir/conf-$1-$HOST.cnf ]
then
echo "$test_dir/conf-$1-$HOST.cnf"
elif [ -f $test_dir/conf-$1.cnf ]
then
echo "$test_dir/conf-$1.cnf"
elif [ -f $test_dir/conf-$HOST.cnf ]
then
echo "$test_dir/conf-$HOST.cnf"
else
echo "Unable to find conf file looked for" 1>&2
echo "$test_dir/conf-$1-$HOST.cnf and" 1>&2
echo "$test_dir/conf-$HOST.cnf" 1>&2
echo "$test_dir/conf-$1.cnf" 1>&2
exit
fi
}
#########################################
# Count how many computers we have ready#
#########################################
count_hosts(){
ch="CHOOSE_host"
list=`grep $ch $1 | sed 's!,! !g'`
cnt=`for i in $list; do echo $i; done | grep $ch | sort | uniq | wc -l`
echo $cnt
}
conf=`choose_conf $RUN`
count=`count_hosts $conf`
avail=`echo $hosts | wc -w`
if [ $count -gt $avail ]
then
echo "Not enough hosts"
echo "Needs: $count available: $avail ($avail_hosts)"
exit 1
fi
###
# Make directories needed
p=`pwd`
run_dir=$run_dir/run-$RUN-$clone0-$target
res_dir=$base_dir/result-$RUN-$clone0-$target/$DATE
tar_dir=$base_dir/saved-results
mkdir -p $run_dir $res_dir $tar_dir
rm -rf $res_dir/* $run_dir/*
###
#
# Do sed substitiutions
#
cd $run_dir
mkdir run
if [ `uname | grep -ic cygwin || true` -ne 0 ]
then
run_dir=`cygpath -m $run_dir`
install_dir0=`cygpath -u $install_dir0`
if [ "$install_dir1" ]
then
install_dir1=`cygpath -u $install_dir1`
fi
test_dir=`cygpath -m $test_dir`
fi
choose $conf $hosts > d.tmp.$$
sed -e s,CHOOSE_dir,"$run_dir/run",g < d.tmp.$$ > my.cnf
clusters=`echo ${clusters_arg} | sed s/--clusters=//`
for cluster_name in ${clusters//,/ }; do
conf_base=$(echo "${conf}" | sed 's/\.cnf$//')
config_ini="${conf_base}${cluster_name}.ini"
if [ -f "$config_ini" ]; then
[ -r "$config_ini" ] || (echo "Failed to read ${config_ini}" && exit 1)
choose "$config_ini" $hosts > d.tmp.$$
sed -e s,CHOOSE_dir,"$run_dir/run",g < d.tmp.$$ > "config${cluster_name}.ini"
fi
done
rm -f d.tmp.$$
copy_missing_ndbclient_test_programs() {
(
export LD_LIBRARY_PATH="${1}/bin:${1}/lib"
for prog in testDowngrade testUpgrade
do
if [ -f "${1}/bin/${prog}" ] &&
[ ! -f "${2}/bin/${prog}" ] &&
ldd "${1}/bin/${prog}" | grep -c ndbclient
then
echo "rm -f '$(realpath ${2}/bin/${prog})'" &&
cp -p "${1}/bin/${prog}" "${2}/bin/${prog}"
fi
done
for file in "${1}"/mysql-test/ndb/*grade*
do
f=$(basename "${file}")
if [ -f "${file}" ] &&
[ ! -f "${2}/mysql-test/ndb/${f}" ]
then
echo "rm -f '$(realpath ${2}/mysql-test/ndb/${f})'" &&
cp -p "${file}" "${2}/mysql-test/ndb/${f}"
fi
done
) > revert_copy_missing_ndbclient_test_programs
}
prefix="--prefix=$install_dir --prefix0=$install_dir0"
if [ -n "$install_dir1" ]
then
prefix="$prefix --prefix1=$install_dir1"
copy_missing_ndbclient_test_programs ${install_dir0} ${install_dir1}
copy_missing_ndbclient_test_programs ${install_dir1} ${install_dir0}
fi
# If verbose level 0, use default verbose mode (1) for atrt anyway
# otherwise it will not write test progress to log file
if [ ${verbose} -gt 0 ] ; then
verbose_arg=--verbose=${verbose}
fi
return_code=0
# Setup configuration
$atrt ${atrt_defaults_group_suffix_arg} Cdq \
${site_arg} \
${clusters_arg} \
${verbose_arg} \
$prefix \
my.cnf \
| tee log.txt
atrt_conf_status=${PIPESTATUS[0]}
if [ ${atrt_conf_status} -ne 0 ]; then
return_code=$atrt_conf_status
echo "Setup configuration failure"
else
args="${atrt_defaults_group_suffix_arg}"
args="$args --report-file=report.txt"
args="$args --testcase-file=${test_file}"
args="$args ${baseport_arg}"
args="$args ${site_arg} ${clusters_arg}"
args="$args $prefix"
args="$args ${verbose_arg}"
args="$args ${default_max_retries_arg}"
args="$args ${default_force_cluster_restart_arg}"
args="$args ${default_behaviour_on_failure_arg}"
$atrt $args my.cnf | tee -a log.txt
atrt_test_status=${PIPESTATUS[0]}
if [ $atrt_test_status -ne 0 ]; then
return_code=$atrt_test_status
echo "ERROR: $atrt_test_status: $atrt $args my.cnf"
fi
fi
# Make tar-ball
[ -f my.cnf ] && mv my.cnf $res_dir
[ -f log.txt ] && mv log.txt $res_dir
[ -f report.txt ] && mv report.txt $res_dir
[ "`find . -name 'result*'`" ] && mv result* $res_dir
cd $res_dir
echo "date=$DATE" > info.txt
echo "suite=$RUN" >> info.txt
echo "clone=$clone0" >> info.txt
echo "arch=$target" >> info.txt
echo "host=$HOST" >> info.txt
[ -z "${clusters_arg}" ] || echo "clusters=${clusters_arg/--clusters=/}" >> info.txt
echo "test_hosts='$hosts'" >> info.txt
echo "test_atrt_command='$atrt $args my.cnf'" >> info.txt
if [ "$clone1" ]
then
echo "clone1=$clone1" >> info.txt
[ ! -f $install_dir1/code1.txt ] || cp $install_dir1/code1.txt .
fi
[ ! -f $install_dir0/code0.txt ] || cp $install_dir0/code0.txt .
if [ "$clonename" ]
then
echo "clonename=$clonename" >> info.txt
else
echo "clonename=$clone0" >> info.txt
fi
for f in $(find "${install_dir0}/docs" -name 'INFO_*'); do
cp "${f}" "$(basename ${f}).0"
done
if [ -d "${install_dir1}/docs" ]; then
for f in $(find "${install_dir1}/docs" -name 'INFO_*'); do
cp "${f}" "$(basename ${f}).1"
done
fi
find . | xargs chmod ugo+r
# Try to pack and transfer as much as possible
set +e
cd ..
p2=`pwd`
cd ..
tarfile=res.$RUN.$clone0.$target.$DATE.$HOST.$$.tgz
if [ `uname -s` != "SunOS" ]
then
tar cfz $tar_dir/$tarfile `basename $p2`/$DATE
else
tarfile2=res.$RUN.$clone0.$target.$DATE.$HOST.$$.tar
tar cf $tar_dir/$tarfile2 `basename $p2`/$DATE
gzip -c $tar_dir/$tarfile2 > $tar_dir/$tarfile
rm -f $tar_dir/$tarfile2
fi
if [ "$report" ]
then
scp $tar_dir/$tarfile $result_host:$result_path/${tarfile}.upload
ssh $result_host mv $result_path/${tarfile}.upload $result_path/${tarfile}
fi
cd $p
rm -rf $res_dir $run_dir
exit $return_code