# BEGIN_ICS_COPYRIGHT8 **************************************** # # Copyright (c) 2015, Intel Corporation # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # END_ICS_COPYRIGHT8 **************************************** # [ICS VERSION STRING: unknown] # This is an expect (tcl) library of procedures to aid install testing ## tcl procedures to support testing of install: ## ============================================= proc install_cleanup { } { ## ## install_cleanup ## ------------------- ## cleanup temp files and logs in preparation for a new install scenario ## during an rlogin session ## ## Usage: ## install_cleanup ## Additional Information: ## Must have run target_rlogin and target_su before this ## Returns: ## 0 - success ## -code error on failure unix_cmd 60 0 "rm -f /var/log/ics_ib.log" unix_cmd 60 0 "rm -f /var/log/opa.log" unix_cmd 60 0 "rm -f /var/log/opamon" unix_cmd 200 0 "rm -rf IntelOPA-Basic.*" unix_cmd 200 0 "rm -rf IntelOPA-IFS.*" unix_cmd 200 0 "rm -rf IntelOPA-Tools*" unix_cmd 200 0 "rm -rf IntelOPA-Tests.*" unix_cmd 60 0 "rm -rf /tmp/opa.log.len /tmp/ics_ib.log.len" return 0 } proc install_saveloglen { } { ## ## install_saveloglen ## ------------------- ## save log length for use to verify install results ## ## Usage: ## install_saveloglen ## Additional Information: ## Must have run target_rlogin and target_su before this ## Returns: ## 0 - success ## -code error on failure foreach log {/var/log/opa.log /var/log/ics_ib.log} { set log_len "/tmp/[exec basename $log].len" # use sed to get rid of white space unix_cmd 60 0 "cat $log 2>/dev/null|wc -l | sed -e 's/\[ \\t]//g' > $log_len" } return 0 } proc install_rmloglen { } { ## ## install_rmloglen ## ------------------- ## remove log length files created by install_saveloglen ## ## Usage: ## install_rmloglen ## Additional Information: ## Must have run target_rlogin and target_su before this ## Returns: ## 0 - success ## -code error on failure unix_cmd 60 0 "rm -f /tmp/opa.log.len" unix_cmd 60 0 "rm -f /tmp/ics_ib.log.len" return 0 } proc install_expect_drivers { driver_list { skip_done 0 }} { ## ## install_expect_drivers ## ---------------------- ## Check the proper drivers are loaded during an rlogin session ## ## Usage: ## install_expect_drivers driver_list [skip_done] ## Arguments: ## driver_list - list of drivers/ULP names ## skip_done - skip wait for 'Done Installing IB' message ## 0=wait for message ## 1=don't wait for message, default is 0 ## Returns: ## 0 - success ## -code error on failure ## Additional Information: ## Does not care what order the drivers are loaded in expect_progress 600 { "Preparing" "Building" } { "Installing" {OPA Software} } { "Unable" "Error" "Failure" "invalid" "Usage" } set list {} foreach driver $driver_list { lappend list "Installing $driver" } if { "$list" != "" } { # allow 5 minutes per Driver expect_progress_orderless 300 { "Preparing" "Building" "installing" "Updating" "Copying" } 0 $list { "Unable" "Error" "Failure" "invalid" } } if { ! $skip_done } { # "Unable" message could occur if A0 HCA being installed # allow some extra time for depmod and firmware update # firmware update can be slow on MAC or if pciconf1 device is used expect_progress 300 { {[0-9]} "---" "Updating" "Copying" "installing" } { {Done Installing OPA} } { "Error" "Failure" "invalid" } } return 0 } proc install_uninstall { {uninstall 1} {remove_config 0} { dir "" } } { ## ## install_uninstall ## ----------------- ## uninstall any existing version of IB software on the system during an rlogin session ## ## Usage: ## install_uninstall [ uninstall [remove_config [dir]] ] ## Arguments: ## uninstall - should existing installation be uninstalled, default is yes ## remove_config - should existing config files be removed, default is no ## dir - directory to find uninstall in (default is to only use ## opaconfig/ics_ib) ## Returns: ## 0 - success ## -code error on failure set toolsdir /usr/lib/opa/tools if { $uninstall } { # use ics_ib to remove if possible unix_cmd 240 "" {if [ -f /sbin/opaconfig ]; then /sbin/opaconfig -u; elif [ -f /sbin/ics_ib ]; then /sbin/ics_ib -u; fi } } if { $uninstall && "$dir" != "" } { unix_cmd 240 "" "test -d $dir && (cd $dir; ./INSTALL -u )" } if { $remove_config } { set target_os_type [target_get_os_type] unix_cmd 60 "" {rm -rf /etc/opa /etc/sysconfig/ipoib.cfg /etc/sysconfig/ics_srp.cfg /etc/sysconfig/ics_inic.cfg /etc/sysconfig/mpi.param /etc/sysconfig/mpi.param.safe /etc/sysconfig/mpi.param.microbench $toolsdir/opafastfabric.conf /etc/dat.conf} unix_cmd 60 "" {rm -rf /etc/opa-fm/opafm.xml /etc/infiniband/openib.conf /etc/opamon.conf} unix_cmd 60 "" {rm -rf /etc/sysconfig/network-scripts/ifcfg-eioc[0-9]* /etc/sysconfig/network-scripts/ifcfg-ib[0-9]*} unix_cmd 60 "" {rm -rf /etc/sysconfig/network/ifcfg-eioc[0-9]* /etc/sysconfig/network/ifcfg-ib[0-9]*} unix_cmd 60 "" {rm -rf /etc/dapl} } return 0 } proc install_getready { target {uninstall 1} { remove_config 0 } { cleanup 1 } { dir "" }} { ## ## install_getready ## ---------------- ## prepare for an install test by login'ing ## cleaning up from any prior install, uninstalling any prior software ## ## Usage: ## install_getready target [uninstall [remove_config [cleanup [dir] ]]] ## ## Arguments: ## target - hostname to rlogin to ## uninstall - should existing installation be uninstalled, default is yes ## remove_config - should existing config files be removed, default is no ## cleanup - should existing installation files and install logs be removed, default is yes ## dir - directory to find uninstall in (default is to only use ## opaconfig/ics_ib) ## Returns: ## 0 - success ## -code error om failure ## Additional Information: ## setup file is sent to /tmp/mysetup.stp global env # become root user on target system target_root_sh $target install_uninstall $uninstall $remove_config $dir if { $cleanup } { install_cleanup } else { install_saveloglen } return 0 } proc install_all { target drivers {uninstall 1} {remove_config 0 } {cleanup 1} {cd_device ""} {release ""} { install_opt "-a" } { from_dir "." } {product "IntelOPA-Basic"}} { ## ## install_all ## ----------------- ## perform a basic installation of all drivers ## ## Usage: ## install_all target drivers [uninstall [remove_config [cleanup [cd_device [release [install_opt [from_dir]]]]]]] ## Arguments: ## target - hostname to rlogin to ## drivers - list of driver names expected to be installed ## uninstall - should existing installation be uninstalled, default is yes ## remove_config - should existing config files be removed, default is no ## cleanup - should existing installation files and install logs be removed, default is yes ## cd_device - CD device to load from, default is ftp from get_ftp_dir ## release - if ! "", scp $product.$release.tgz to target and install ## install_opt - install options, default is "-a" ## from_dir - where to get $product.*.tgz for scp install ## Returns: ## 0 - success ## -code error on failure ## Additional Information: ## This establishes and closes an rlogin session global env if { "$cd_device" == "" && "$release" == "" } { # will untar below into this directory set dir [get_install_dir "$product"] } elseif { "$cd_device" != "" } { set dir $cd_device } else { log_message "scp $from_dir/$product.$release.tgz root@\[$target\]:" if { [ catch { exec scp $from_dir/$product.$release.tgz root@\[$target\]: } err_str2 ] != 0 } { error "scp $from_dir/$product.$release.tgz root@\[$target\]: failed: $err_str2" } set dir $product.$release # can't cleanup, will remove the file we just copied set cleanup 0 } install_getready $target $uninstall $remove_config $cleanup $dir if { "$cd_device" == "" && "$release" == "" } { if { ! [ info exists env(CFG_FTP_SERVER) ] || "$env(CFG_FTP_SERVER)" == ""} { fail_test "Release version not specified" } # Fast Fabric always sets release and sets CFG_FTP_SERVER="" # hence for fast fabric we never use ftp set release [get_release] scp_get_file "$env(CFG_SCP_SERVER)" "$env(CFG_SCP_USERID)" "[get_ftp_dir $target]/$product.$release.tgz" "$product.$release.tgz" send_unix_cmd "tar xvfz $product.$release.tgz; echo DONE" expect_progress 120 { "doc" "include" "config" "bin" "lib" } { "echo DONE" "DONE" } { "Error " "No such" } check_exit_status 360 0 } elseif { "$cd_device" == "" && "$release" != "" } { unix_cmd 200 0 "rm -rf $product.$release" send_unix_cmd "tar xvfz $product.$release.tgz; echo DONE" expect_progress 120 { "doc" "include" "config" "bin" "lib" } { "echo DONE" "DONE" } { "Error " "No such" } check_exit_status 360 0 } unix_cmd 60 0 "cd $dir" send_unix_cmd "./INSTALL $install_opt" set_timeout 60 install_expect_drivers "$drivers" check_exit_status 60 0 install_check_logs install_rmloglen child_cleanup return 0 } proc install_check_logs { { log_list { /var/log/ics_ib.log /var/log/opa.log } } { retcode "1" } } { ## ## install_check_logs ## ----------------- ## check there are no errors or warnings in the installation log ## during an rlogin session ## ## Usage: ## install_check_logs [log_list] [retcode] ## Arguments: ## log_list - list of log filenames to get, default is opa.log ics_ib.log ## retcode - expected return code from egrep, 0=errors/warnings in log ## 1=no errors/warnings in log, defaults to 1 ## Returns: ## 0 - success ## -code error on failure foreach log $log_list { send_unix_cmd "\[ -f $log \];" if { [ get_exit_status 60 ] == 0 } { set log_len "/tmp/[exec basename $log].len" send_unix_cmd "\[ -s $log_len \];" if { [ get_exit_status 60 ] == 0 } { # allow Unable due to message for A0 HCA unix_cmd 60 $retcode "tail -n +`cat $log_len` $log|egrep 'Abort|corrupted|Can not'" } else { unix_cmd 60 $retcode "egrep 'Abort|corrupted|Can not' $log" } } } return 0 } proc install_getready2 { target } { ## ## install_getready2 ## ---------------- ## prepare for an install test by login'ing ## cleaning up from any prior install ## ## Usage: ## install_getready2 target ## ## Arguments: ## target - hostname to rlogin to ## Returns: ## 0 - success ## -code error om failure # become root user on target system target_root_sh $target $usercode $password $root_password install_cleanup return 0 } proc install_get_logs { target { log_list { ics_ib.log opa.log } } { log_dir /var/log } } { ## ## install_get_logs ## ------------------------ ## Get the various installation log file ## ## Usage: ## install_get_logs target [log_list] [log_dir] ## Arguments: ## target - hostname to rlogin to ## log_list - list of log filenames to get, default is opa.log ics_ib.log ## log_dir - directory to get log files from, default is /var/log ## Additional Information: ## The login session to the target system is terminated to allow an ## ftp to occur to transfer the file ## This is intended for use as a failure_code handler for test cases ## Errors in getting the log files are ignored (in case the logs don't ## exist) ## The log files gotten are of the form: ## $log_dir/$log ## where $log is an individual entry in log_list ## They are transfered to: ## $test_tmp/$log global env global test_tmp # ignore errors in case the log doesn't exist foreach log $log_list { # cleanup any previous sessions catch { child_cleanup } #catch { ftp_mget_files $target $env(CFG_USERNAME) $env(CFG_PASSWORD) $log_dir $log $test_tmp ascii } catch { exec scp root@\[$target\]:$log_dir/$log $test_tmp/ } } # cleanup any previous sessions catch { child_cleanup } }