#!/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