# 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 integration testing # These functions provide support for pre-built test cases which can be # provided arguments to indicate the ulp to be tested ## tcl procedures to support testing: ## ============================================= global os_type set os_type [ exec uname -s ] proc get_num_hosts {} { global env set num_hosts [ llength $env(CFG_HOSTS) ] } proc reboot_host { host } { ## ## reboot_host ## ------------------- ## reboot a host ## ## Usage: ## reboot_host host ## Arguments: ## host - host to reboot ## Returns: ## None ## Additional Information: ## None global env target_root_sh "$host" send_unix_cmd "reboot" # wait for host login shell to go down expect_eof 60 1 sleep 10 # now wait for host to come online log_message "Waiting for Host $host to come online" set online 0 for { set i 0 } { $i < 100 } { incr i } { if { $i != 0 } { log_message "Retrying: Host $host is not yet up" # wait before we try again sleep [ calc_timeout 5 ] } if { [ catch { target_root_sh $host } res ] != 0 } { # send escape sequence to close timed out ssh sessions catch { exp_send "~.\n" } } else { # we got in target_root_sh_exit set online 1 break } } if { ! $online } { set info "Host did not come online within timeout limit" return -code error -errorinfo $info $info } # network can be up before rest of host, allow a little more time sleep 20 } proc test_case_reboot { host {iterations 1}} { ## ## test_case_reboot ## ------------------- ## test_case to reboot host ## ## Usage: ## test_case_reboot host [iterations] ## Arguments: ## host - host to reboot ## iterations - number of reboot iterations, default is 1 ## Returns: ## None ## Additional Information: ## must be used within a test_suite's body, performs test_case calls ## uses case_setup and case_cleanup provided by caller ## no item_setup nor item_cleanup used global env test_case "$host.reboot" "$host reboot" "test reboot of $host confirm host goes down and comes back up File: TestTools/basic.exp" case_setup case_cleanup { upvar host host upvar iterations iterations for { set i 0 } { $i < $iterations } { incr i } { reboot_host $host } } } proc chassis_cmd_reboot_all { } { ## ## chassis_cmd_reboot_all ## ------------------- ## issue reboot command to chassis, support older models which don't support ## "reboot now all" command, in which case "reboot now" is used ## Arguments: ## None ## Returns: ## None ## Additional Information: global spawn_id expect_out spawn_out timeout global expecting set_timeout 60 set expecting "reboot command response" send_chassis_cmd "reboot now all" # if we get a usage message indicating the command is not supported # we will try "reboot now" command instead expect { "Goodbye" return "sage" noop "upported" noop } expect_chassis_prompt 60 send_chassis_cmd "reboot now" expect_list 60 { "Goodbye" } } proc chassis_wait_reboot_done { chassis } { ## ## chassis_wait_reboot_done ## ------------------- ## wait for the reboot command which was just issued to the chassis to complete ## and for the chassis to come back online ## Arguments: ## chassis - chassis being rebooted ## Returns: ## None ## Additional Information: global spawn_id expect_out spawn_out timeout global expecting global env # make sure chassis has time to go down (its usually immediate) sleep 10 # use a local shell for ping to verify chassis comes back # it reboots too fast for us to observe it go away local_sh if { [ auto_execok /usr/lib/opa/tools/opagetipaddrtype ] != "" } { send_unix_cmd "/usr/lib/opa/tools/opagetipaddrtype $chassis" set out [expect_any 60 {"ipv6" "ipv4" } {"Error:" "Usage:"}] regexp {([ip]+)([A-Za-z0-9]+)} $out iptype } else { set iptype "ipv4" } if { $iptype == "ipv4" } { send_unix_cmd "ping -i 1 $chassis" } else { send_unix_cmd "ping6 -i 1 $chassis" } # allow 3 minutes for chassis to complete reboot expect_list 180 {bytes from} local_sh_exit # give it a few seconds to boot sleep 5 # now wait for CLI to come online # 12800 can take 650 seconds = 130 * 5 log_message "Waiting for Chassis $chassis CLI to come online" set online 0 for { set i 0 } { $i < 130 } { incr i } { if { $i != 0 } { log_message "Retrying: Chassis $chassis CLI is not yet up" # wait before we try again sleep [ calc_timeout 5 ] } if { [ catch { target_chassis_admin_sh $chassis } res ] != 0 } { # send escape sequence to close timed out ssh sessions catch { exp_send "~.\n" } } else { # we got in target_chassis_admin_sh_exit set online 1 break } } if { ! $online } { set info "Chassis CLI did not come online within timeout limit" return -code error -errorinfo $info $info } } proc test_case_chassis_reboot { chassis {iterations 1}} { ## ## test_case_chassis_reboot ## ------------------- ## test_case to reboot chassis ## ## Usage: ## test_case_chassis_reboot chassis [iterations] ## Arguments: ## chassis - chassis to reboot ## iterations - number of reboot iterations, default is 1 ## Returns: ## None ## Additional Information: ## must be used within a test_suite's body, performs test_case calls ## uses case_setup and case_cleanup provided by caller ## no item_setup nor item_cleanup used global env test_case "$chassis.reboot" "$chassis reboot" "test reboot of $chassis use ping to confirm comes back up File: TestTools/basic.exp" case_setup case_cleanup { upvar chassis chassis upvar iterations iterations for { set i 0 } { $i < $iterations } { incr i } { # chassis CLI shell for reboot command target_chassis_admin_sh $chassis chassis_cmd_reboot_all # may not be able to send logout command, so just get out of dodge expect_eof 60 1 chassis_wait_reboot_done $chassis } } }