|
Packit |
857059 |
# BEGIN_ICS_COPYRIGHT8 ****************************************
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Copyright (c) 2015, Intel Corporation
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# Redistribution and use in source and binary forms, with or without
|
|
Packit |
857059 |
# modification, are permitted provided that the following conditions are met:
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
857059 |
# this list of conditions and the following disclaimer.
|
|
Packit |
857059 |
# * Redistributions in binary form must reproduce the above copyright
|
|
Packit |
857059 |
# notice, this list of conditions and the following disclaimer in the
|
|
Packit |
857059 |
# documentation and/or other materials provided with the distribution.
|
|
Packit |
857059 |
# * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
857059 |
# may be used to endorse or promote products derived from this software
|
|
Packit |
857059 |
# without specific prior written permission.
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
857059 |
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
857059 |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit |
857059 |
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit |
857059 |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit |
857059 |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit |
857059 |
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit |
857059 |
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
857059 |
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
857059 |
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
857059 |
#
|
|
Packit |
857059 |
# END_ICS_COPYRIGHT8 ****************************************
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# [ICS VERSION STRING: unknown]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# assumptions:
|
|
Packit |
857059 |
# slot numbers are alphanumeric: A-Za-z0-9 (actually are numeric in <=3.1)
|
|
Packit |
857059 |
# card types are alphanumeric with dot, dash, underscore: A-Za-z0-9._-
|
|
Packit |
857059 |
# versions are alphanumeric with dot, dash, underscore: A-Za-z0-9._-
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# This is an expect (tcl) library of procedures to aid testing
|
|
Packit |
857059 |
# These functions provide support for chassis operations
|
|
Packit |
857059 |
# against a test target chassis
|
|
Packit |
857059 |
|
|
Packit |
857059 |
## tcl procedures to support testing:
|
|
Packit |
857059 |
## =============================================
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global os_type
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_chassis_sftp_status { slot {wait_done 1 }} {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_chassis_sftp_status
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the exit status of the last sftp executed against the given slot
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_chassis_sftp_status slot [wait_done]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## slot - slot number to get status for
|
|
Packit |
857059 |
## wait_done - if status is "In Progress", loop until changes to another value
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## "success"
|
|
Packit |
857059 |
## "skipped" - transfer unnecessary
|
|
Packit |
857059 |
## "invalid" - invalid firmware image for card type
|
|
Packit |
857059 |
## "inprogress" - transfer still in progress, but wait_done not set
|
|
Packit |
857059 |
## "error" - other errors or timeouts
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
while { 1 } {
|
|
Packit |
857059 |
send_chassis_cmd "showLastScpRetCode $slot"
|
|
Packit |
857059 |
set out [expect_list 60 { "Code: [0-9]+:" } { "usage" "Invalid" "Error" "Failed" "roblem" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {[0-9]+} $out ret
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $ret == 0 } {
|
|
Packit |
857059 |
return "success"
|
|
Packit |
857059 |
} elseif { $ret == 1 } {
|
|
Packit |
857059 |
# unneeded
|
|
Packit |
857059 |
return "skipped"
|
|
Packit |
857059 |
} elseif { $ret == 2 } {
|
|
Packit |
857059 |
# wrong card type
|
|
Packit |
857059 |
return "invalid"
|
|
Packit |
857059 |
} elseif { $ret == 3 } {
|
|
Packit |
857059 |
if { ! $wait_done } {
|
|
Packit |
857059 |
# transfer in progress internal to chassis
|
|
Packit |
857059 |
return "inprogress"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# can be a few minutes, so lets be a little patient
|
|
Packit |
857059 |
sleep 20
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# other errors
|
|
Packit |
857059 |
return "error"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc check_chassis_capability { capability } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## check_chassis_capability
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return level of support for the given capability by the current chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## check_chassis_capability capability
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## capability - the capability name to check
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 - capability not supported
|
|
Packit |
857059 |
## >0 - version of capability supported
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "showCapability -key $capability"
|
|
Packit |
857059 |
# the [:space:] bounds the + so we get all the data on the line
|
|
Packit |
857059 |
set out [expect_list 60 "{$capability: \[0-9A-Za-z\]+\[\[:space:\]\]}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
#log_message "out=$out"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# throw away the \r\n, there may be trailing spaces, TCL lists will ignore
|
|
Packit |
857059 |
regexp {: ([A-Za-z0-9]+)[[:space:]]} $out line ret
|
|
Packit |
857059 |
#log_message "ret=$ret"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal -nocase "$ret" "unavailable" ] } {
|
|
Packit |
857059 |
set ret 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_chassis_slots { { card_type "" } } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_chassis_type_slots
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the list of slots in the given chassis of the given card type
|
|
Packit |
857059 |
## if no card type is specified, a list of all slots in the chassis is returned
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_chassis_type_slots [card_type]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## card_type - card type, default is "" (eg. all slots)
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## list of slots in chassis
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! [ string equal "$card_type" "" ] } {
|
|
Packit |
857059 |
send_chassis_cmd "chassisQuery -ignoreInvalidType -type $card_type"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
send_chassis_cmd "chassisQuery"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# this could return no slots, in which case "none" is output
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
set out [expect_list 60 "{slot\[s\]*: \[0-9A-Za-z \]+\[\r\n\]}" { "usage" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
#log_message "out=$out"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
# there may be trailing spaces, TCL lists will ignore
|
|
Packit |
857059 |
regexp {: ([0-9A-Za-z ]+)[\r\n]+} $out line ret
|
|
Packit |
857059 |
#log_message "ret=$ret"
|
|
Packit |
857059 |
if { [ regexp -nocase "none" "$ret" ] } {
|
|
Packit |
857059 |
set ret ""
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc list_esm_security_files { } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## list_esm_security_files
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the list of FM security files in the given chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## list_esm_security_files
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## none
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## list of .pem files in chassis
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "smListSecurityFiles -showSingleLine"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# this could return no *.pem files, in which case "none" is output
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
set out [expect_list 60 "{files: \[0-9A-Za-z._ \]+\[\r\n\]}" { "usage" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
#log_message "out=$out"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
# there may be trailing spaces, TCL lists will ignore
|
|
Packit |
857059 |
regexp {: ([0-9A-Za-z._ ]+)[\r\n]+} $out line ret
|
|
Packit |
857059 |
#log_message "ret=$ret"
|
|
Packit |
857059 |
if { [ regexp -nocase "none" "$ret" ] } {
|
|
Packit |
857059 |
set ret ""
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_chassis_card_type { slot } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_chassis_card_type
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the card type of the given slot in the given chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_chassis_card_type slot
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## slot - slot to query
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## card type of given slot
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DONE
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "chassisQuery -showType $slot"
|
|
Packit |
857059 |
# require trailing whitespace to anchor end of string
|
|
Packit |
857059 |
set out [expect_list 60 "{type: \[a-zA-Z0-9._-\]+\[\[:space:\]\]+}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
# just get the card type field
|
|
Packit |
857059 |
regexp {: ([a-zA-Z0-9._-]+)[[:space:]]+} $out line ret
|
|
Packit |
857059 |
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc is_management_card_type { card_type } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## is_management_card_type
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## is the given card_type a management card for the current chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## is_management_card_type card_type
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## card_type - card type to test
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0-> this card type is not the management card type for this chassis
|
|
Packit |
857059 |
## 1-> this card type is the management card type for this chassis
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Our best way to do this is to query slot 0 for its card type. Slot 0
|
|
Packit |
857059 |
## is always the management card
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
return [string equal [ get_chassis_card_type $my_slot] "$card_type" ]
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_this_slot_number { } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_this_slot_number
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the slot number of the management card we are logged into
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_this_slot_number
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## slot number
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "chassisQuery -master"
|
|
Packit |
857059 |
# this could return no slots, in which case "none" is output
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
set out [expect_list 60 "{master: \[0-9A-Za-z \]+\[\r\n\]}" { "usage" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
#log_message "out=$out"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# The \r\n is needed to bound the + so we get all the data on the line
|
|
Packit |
857059 |
# there may be trailing spaces, TCL lists will ignore
|
|
Packit |
857059 |
regexp {: ([0-9A-Za-z ]+)[\r\n]+} $out line ret
|
|
Packit |
857059 |
#log_message "ret=$ret"
|
|
Packit |
857059 |
if { [ regexp -nocase "none" "$ret" ] } {
|
|
Packit |
857059 |
set ret ""
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_chassis_active_firmware_version { slot } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_chassis_active_firmware_version
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the presently running firmware_version of the given slot
|
|
Packit |
857059 |
## in the given chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_chassis_active_firmware_version slot
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## slot - slot to query
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## firmware version of given slot
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "fwVersion $slot"
|
|
Packit |
857059 |
# echo of command
|
|
Packit |
857059 |
set out [expect_list 60 { "fwVersion" "Firmware Version: [a-zA-Z0-9.]+[[:space:]]" } { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {: ([a-zA-Z0-9._-]+)[[:space:]]} $out line ret
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_file_firmware_version { fw_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_file_firmware_version
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the firmware version of the given local file
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_file_firmware_version fw_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## fw_file - local pathname of file
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## firmware version of given file
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "opafirmware --showVersion $fw_file\n"
|
|
Packit |
857059 |
set fw_version [exec /usr/sbin/opafirmware --showVersion $fw_file]
|
|
Packit |
857059 |
log_message "Version: $fw_version\n"
|
|
Packit |
857059 |
return "$fw_version"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_file_firmware_type { fw_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_file_firmware_type
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the firmware type of the given local file
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_file_firmware_type fw_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## fw_file - local pathname of file
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## firmware card type of given file
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "opafirmware --showType $fw_file"
|
|
Packit |
857059 |
set card_type [exec /usr/sbin/opafirmware --showType $fw_file]
|
|
Packit |
857059 |
log_message "Card Type: $card_type\n"
|
|
Packit |
857059 |
return "$card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_chassis_firmware_version { slot {location "act"} } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_chassis_firmware_version
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return the firmware version of the given slot in the chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_chassis_firmware_version slot [alternate]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## slot - slot to query
|
|
Packit |
857059 |
## location - location to query
|
|
Packit |
857059 |
## "pri" -> primary
|
|
Packit |
857059 |
## "alt" -> alternate
|
|
Packit |
857059 |
## "act" -> active (running) (default)
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## firmware version of given slot
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$location" "act"] } {
|
|
Packit |
857059 |
return [get_chassis_active_firmware_version $slot]
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$location" "alt"] } {
|
|
Packit |
857059 |
#set cmd "bootQuery $slot -showVersion -alternate"
|
|
Packit |
857059 |
set cmd "bootQuery $slot -alternate"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
#set cmd "bootQuery $slot -showVersion"
|
|
Packit |
857059 |
set cmd "bootQuery $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
send_chassis_cmd "$cmd"
|
|
Packit |
857059 |
set out [expect_list 60 "{version: \[a-zA-Z0-9._-\]+\[\[:space:\]\]}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {: ([a-zA-Z0-9._-]+)[[:space:]]} $out line ret
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc select_chassis_firmware_version { slot fw_version } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## select_chassis_firmware_version
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## select the given firmware version for the given slot in the chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## select_chassis_firmware_version slot fw_version
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## slot - slot to act on
|
|
Packit |
857059 |
## fw_version - firmware version to select
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_cmd 60 0 "bootSelect $slot -version $fw_version"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc sftp_chassis_firmware { chassis fw_file {select 0} {slot "all"} } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## sftp_chassis_firmware
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given firmware file to the specified slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## sftp_chassis_firmware chassis fw_file [select [slot]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp to
|
|
Packit |
857059 |
## fw_file - local pathname of file to push
|
|
Packit |
857059 |
## select - should image be selected (0->no (default), 1->yes)
|
|
Packit |
857059 |
## slot - slot to push to, default is "all" of given card type
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $select } {
|
|
Packit |
857059 |
set nopt ""
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
set nopt "n"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# Create a basename for the firmware on the server
|
|
Packit |
857059 |
set base [ exec basename $fw_file ]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal "$slot" "all" ] } {
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "put $fw_file A$nopt:/firmware/$base"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "put $fw_file $nopt$slot:/firmware/$base"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc push_chassis_firmware { chassis fw_file fw_version card_type {action "push"} { slots "all" } } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## push_chassis_firmware
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given firmware file to the specified slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## push_chassis_firmware chassis fw_file fw_version card_type [action [slots]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp and telnet to
|
|
Packit |
857059 |
## fw_file - local pathname of file to push
|
|
Packit |
857059 |
## fw_version - firmware version of fw_file
|
|
Packit |
857059 |
## card_type - card type of fw_file
|
|
Packit |
857059 |
## action - action after pushing firmware:
|
|
Packit |
857059 |
## push - do not reboot, do not change as primary
|
|
Packit |
857059 |
## is already primary, no change
|
|
Packit |
857059 |
## select - select as primary, but do not reboot
|
|
Packit |
857059 |
## run - select as primary and reboot to activate firmware
|
|
Packit |
857059 |
## slots - list of slot numbers to push to, default is "all" of given card type
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Any slots which are not of a card type which matches that
|
|
Packit |
857059 |
## of the firmware file, are quietly skipped. This allows multi-file
|
|
Packit |
857059 |
## push to work with a slot list.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## If the sftp fails for some slots but succeeds for others. The failed slots
|
|
Packit |
857059 |
## are logged and an exception will be thrown, however the good slots
|
|
Packit |
857059 |
## are processed to completion [except for the reboot] (if possible)
|
|
Packit |
857059 |
## so that they are not left in an odd state
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# caller has already done this
|
|
Packit |
857059 |
#set fw_version [get_file_firmware_version $fw_file]
|
|
Packit |
857059 |
#set card_type [get_file_firmware_type $fw_file]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# variables:
|
|
Packit |
857059 |
# select - do we want to select the image as primary
|
|
Packit |
857059 |
# active - do we want to select the image as primary and activate it
|
|
Packit |
857059 |
if { [ string equal "$action" "push"] } {
|
|
Packit |
857059 |
set select 0
|
|
Packit |
857059 |
set active 0
|
|
Packit |
857059 |
} elseif { [string equal "$action" "select"] } {
|
|
Packit |
857059 |
set select 1
|
|
Packit |
857059 |
set active 0
|
|
Packit |
857059 |
} elseif { [string equal "$action" "run"] } {
|
|
Packit |
857059 |
set select 1
|
|
Packit |
857059 |
set active 1
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
fail_test "Invalid firmware push action: $action"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Seeing if $chassis present running firmware supports firmware push ...\n"
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "fwPush"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
fail_test "Chassis $chassis present running firmware does not support fwPush:\n$res"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
log_message "\nTest: Getting Slot list from $chassis ...\n"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$slots" "all"] } {
|
|
Packit |
857059 |
# push to all slots of matching card type
|
|
Packit |
857059 |
set push_slots [get_chassis_slots $card_type]
|
|
Packit |
857059 |
set num_slots [llength $push_slots]
|
|
Packit |
857059 |
#set push_all 0
|
|
Packit |
857059 |
set push_all 1
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# push to a specific set of slots
|
|
Packit |
857059 |
set push_slots "$slots"
|
|
Packit |
857059 |
set push_all 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set num_slots [llength $push_slots]
|
|
Packit |
857059 |
if { $num_slots == 0 } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
skip_case "No cards of type $card_type"
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set is_mgmt [ is_management_card_type $card_type]
|
|
Packit |
857059 |
set use_rebootall 0
|
|
Packit |
857059 |
if { $is_mgmt } {
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "redundantMgmtCapable"] } res ] == 0
|
|
Packit |
857059 |
&& $cap >= 1 } {
|
|
Packit |
857059 |
set use_rebootall 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Getting present installed firmware from $chassis ...\n"
|
|
Packit |
857059 |
# first get present firmware versions for each of the slots
|
|
Packit |
857059 |
set act_fw_versions ""
|
|
Packit |
857059 |
set pri_fw_versions ""
|
|
Packit |
857059 |
set alt_fw_versions ""
|
|
Packit |
857059 |
set card_types ""
|
|
Packit |
857059 |
foreach slot $push_slots {
|
|
Packit |
857059 |
lappend card_types [get_chassis_card_type $slot]
|
|
Packit |
857059 |
lappend act_fw_versions [get_chassis_firmware_version $slot "act"]
|
|
Packit |
857059 |
lappend pri_fw_versions [get_chassis_firmware_version $slot "pri"]
|
|
Packit |
857059 |
lappend alt_fw_versions [get_chassis_firmware_version $slot "alt"]
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "push_slots: $push_slots"
|
|
Packit |
857059 |
#log_message "num_slots: $num_slots"
|
|
Packit |
857059 |
#log_message "card_types: $card_types"
|
|
Packit |
857059 |
#log_message "act_fw_versions: $act_fw_versions"
|
|
Packit |
857059 |
#log_message "pri_fw_versions: $pri_fw_versions"
|
|
Packit |
857059 |
#log_message "alt_fw_versions: $alt_fw_versions"
|
|
Packit |
857059 |
#log_message "is_mgmt: $is_mgmt"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Determining operations needed to upgrade to $fw_file for $chassis ..."
|
|
Packit |
857059 |
# now check that card types match and determine if we need to push firmware
|
|
Packit |
857059 |
set need_push ""
|
|
Packit |
857059 |
set need_select ""
|
|
Packit |
857059 |
set need_reboot ""
|
|
Packit |
857059 |
set have_card 0
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
if { ! [ string equal "$card_type" [lindex $card_types $i] ] } {
|
|
Packit |
857059 |
# if this happens card type is inconsistent with original
|
|
Packit |
857059 |
# query for slots of given card type (hot swap during update?)
|
|
Packit |
857059 |
# or user has explicitly specified slots and picked one of
|
|
Packit |
857059 |
# wrong card type
|
|
Packit |
857059 |
# quiety ignore this slot
|
|
Packit |
857059 |
lappend need_push 0
|
|
Packit |
857059 |
lappend need_select 0
|
|
Packit |
857059 |
lappend need_reboot 0
|
|
Packit |
857059 |
log_message "Test: Skipping slot $slot: is of type [lindex $card_types $i], $fw_file is for $card_type"
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set have_card 1
|
|
Packit |
857059 |
set in_pri [ string equal "$fw_version" [lindex $pri_fw_versions $i] ]
|
|
Packit |
857059 |
set in_alt [ string equal "$fw_version" [lindex $alt_fw_versions $i] ]
|
|
Packit |
857059 |
set booted [string equal "$fw_version" [lindex $act_fw_versions $i]]
|
|
Packit |
857059 |
if { ! $in_pri && ! $in_alt } {
|
|
Packit |
857059 |
# firmware is not in slot, need to push and possibly select/reboot
|
|
Packit |
857059 |
lappend need_push 1
|
|
Packit |
857059 |
set s $select
|
|
Packit |
857059 |
log_message "Test: Will need to push firmware to slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# firmware is in one of the images
|
|
Packit |
857059 |
#set push_all 0
|
|
Packit |
857059 |
lappend need_push 0
|
|
Packit |
857059 |
# only need to select if not already the primary image
|
|
Packit |
857059 |
set s [ expr $select && ! $in_pri]
|
|
Packit |
857059 |
log_message "Test: Do Not need to push firmware to slot $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# could be running something not on chassis but matching pushed version
|
|
Packit |
857059 |
# only need to reboot if not the active image
|
|
Packit |
857059 |
set a [ expr $active && ! $booted]
|
|
Packit |
857059 |
lappend need_select $s
|
|
Packit |
857059 |
lappend need_reboot $a
|
|
Packit |
857059 |
if { $s && $a } {
|
|
Packit |
857059 |
log_message "Test: Need to select firmware and reboot slot $slot\n"
|
|
Packit |
857059 |
} elseif { $a } {
|
|
Packit |
857059 |
log_message "Test: Firmware already selected, Need to reboot slot $slot\n"
|
|
Packit |
857059 |
} elseif { $s } {
|
|
Packit |
857059 |
log_message "Test: Firmware already booted, but need to select firmware for slot $slot\n"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "Test: No need to select firmware nor reboot slot $slot\n"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# only need do a step if applicable to at least 1 slot
|
|
Packit |
857059 |
set do_push [ expr [lsearch -exact $need_push 1] != -1 ]
|
|
Packit |
857059 |
set do_select [ expr [lsearch -exact $need_select 1] != -1 ]
|
|
Packit |
857059 |
set do_reboot [ expr [lsearch -exact $need_reboot 1] != -1 ]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "push_all: $push_all"
|
|
Packit |
857059 |
#log_message "do_push: $do_push"
|
|
Packit |
857059 |
#log_message "do_select: $do_select"
|
|
Packit |
857059 |
#log_message "do_reboot: $do_reboot"
|
|
Packit |
857059 |
#log_message "need_push: $need_push"
|
|
Packit |
857059 |
#log_message "need_select: $need_select"
|
|
Packit |
857059 |
#log_message "need_reboot: $need_reboot"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! ( $do_push || $do_select || $do_reboot ) } {
|
|
Packit |
857059 |
# we are done, everything is already the way we want it
|
|
Packit |
857059 |
if { $have_card } {
|
|
Packit |
857059 |
skip_case "No action required"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
skip_case "No selected slots of type $card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set fail 0
|
|
Packit |
857059 |
set pushed 0
|
|
Packit |
857059 |
set sftp_failures ""
|
|
Packit |
857059 |
set sftp_statuses ""
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_push && $push_all } {
|
|
Packit |
857059 |
# push to all applicable slots at once
|
|
Packit |
857059 |
log_message "Test: sftp $fw_file to all applicable slots\n"
|
|
Packit |
857059 |
sftp_chassis_firmware $chassis $fw_file $select "all"
|
|
Packit |
857059 |
# will check status of sftp operations for slots we care about below
|
|
Packit |
857059 |
log_message "\nTest: Verifying firmware was pushed to $chassis ...\n"
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
if { $do_push && ( $push_all || [lindex $need_push $i] ) } {
|
|
Packit |
857059 |
if { ! $push_all } {
|
|
Packit |
857059 |
# push one slot at a time
|
|
Packit |
857059 |
log_message "\nTest: sftp $fw_file to slot $slot\n"
|
|
Packit |
857059 |
sftp_chassis_firmware $chassis $fw_file $select $slot
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# check status, must do immediately after sftp
|
|
Packit |
857059 |
set status [get_chassis_sftp_status $slot 1]
|
|
Packit |
857059 |
if { [ string equal "$status" "success" ] || [ string equal "$status" "skipped" ] } {
|
|
Packit |
857059 |
set pushed 1
|
|
Packit |
857059 |
lappend sftp_failures 0
|
|
Packit |
857059 |
lappend sftp_statuses "$status"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "\nFAILURE: Failed to sftp firmware to chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
lappend sftp_failures 1
|
|
Packit |
857059 |
lappend sftp_statuses "$status"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { ! $push_all } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# we never sftp'ed to this slot
|
|
Packit |
857059 |
lappend sftp_failures 0
|
|
Packit |
857059 |
lappend sftp_statuses "skipped"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# make sure we are logged in for operations below
|
|
Packit |
857059 |
if { ! ( $do_push && $push_all ) } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "pushed: $pushed"
|
|
Packit |
857059 |
#log_message "sftp_statuses: $sftp_statuses"
|
|
Packit |
857059 |
#log_message "sftp_failures: $sftp_failures"
|
|
Packit |
857059 |
#log_message "fail: $fail"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $pushed } {
|
|
Packit |
857059 |
# we pushed firmware to some or all of the requested slots
|
|
Packit |
857059 |
# now check firmware versions
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
if { [lindex $sftp_failures $i] } {
|
|
Packit |
857059 |
# it failed, no further checks necessary
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { ! $push_all && ! [lindex $need_push $i] } {
|
|
Packit |
857059 |
# we never sftp'ed to this slot
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# if we get here, status was success or skipped
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check what is in the slot after the sftp
|
|
Packit |
857059 |
set pri_fw_version [get_chassis_firmware_version $slot "pri"]
|
|
Packit |
857059 |
set alt_fw_version [get_chassis_firmware_version $slot "alt"]
|
|
Packit |
857059 |
set in_pri [ string equal "$fw_version" "$pri_fw_version" ]
|
|
Packit |
857059 |
set in_alt [ string equal "$fw_version" "$alt_fw_version" ]
|
|
Packit |
857059 |
if { $push_all && ! [lindex $need_push $i] } {
|
|
Packit |
857059 |
# sftp should have skipped this slot
|
|
Packit |
857059 |
if { ! [ string equal [lindex $sftp_statuses $i] "skipped" ] } {
|
|
Packit |
857059 |
set sftp_failures [lreplace $sftp_failures $i $i 1]
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
log_message "\nFAILURE: Unexpected sftp transfer for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
} elseif { ! $in_pri && ! $in_alt } {
|
|
Packit |
857059 |
# the version disappeared
|
|
Packit |
857059 |
set sftp_failures [lreplace $sftp_failures $i $i 1]
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
log_message "\nFAILURE: Unexpected removal of $fw_version for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
} elseif { $select && ! $in_pri } {
|
|
Packit |
857059 |
# the primary changed?
|
|
Packit |
857059 |
# we can recover
|
|
Packit |
857059 |
log_message "\nWARNING: Unexpected change of primary for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
set need_select [lreplace $need_select $i $i 1]
|
|
Packit |
857059 |
set do_select 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# if we get here, we needed to push to this slot
|
|
Packit |
857059 |
# hence the slot should not have been skipped
|
|
Packit |
857059 |
if { ! [ string equal [lindex $sftp_statuses $i] "success" ] } {
|
|
Packit |
857059 |
# it was skipped for no reason
|
|
Packit |
857059 |
set sftp_failures [lreplace $sftp_failures $i $i 1]
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
log_message "\nFAILURE: Unexpected skip of sftp transfer for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
} elseif { ! $in_pri && ! $in_alt } {
|
|
Packit |
857059 |
# the version never appeared
|
|
Packit |
857059 |
set sftp_failures [lreplace $sftp_failures $i $i 1]
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
log_message "\nFAILURE: $fw_version did not transfer to chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
} elseif { $select && ! $in_pri } {
|
|
Packit |
857059 |
# the image is there but was not selected
|
|
Packit |
857059 |
# we can recover
|
|
Packit |
857059 |
log_message "\nWARNING: sftp transfered to wrong image for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
set need_select [lreplace $need_select $i $i 1]
|
|
Packit |
857059 |
set do_select 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "sftp_failures: $sftp_failures"
|
|
Packit |
857059 |
#log_message "do_select: $do_select"
|
|
Packit |
857059 |
#log_message "need_select: $need_select"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_select } {
|
|
Packit |
857059 |
# now select the firmware as primary for the necessary slots
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
if { [lindex $sftp_failures $i] } {
|
|
Packit |
857059 |
# it failed, no further ops necessary
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { ! [lindex $need_select $i] } {
|
|
Packit |
857059 |
# does not need select
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
select_chassis_firmware_version $slot $fw_version
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# if any of the above failed, do not activate or reboot it could
|
|
Packit |
857059 |
# make things worse
|
|
Packit |
857059 |
if { $fail } {
|
|
Packit |
857059 |
fail_test "Unable to sftp firmware to requested slots in $chassis"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "do_reboot: $do_reboot"
|
|
Packit |
857059 |
#log_message "need_reboot: $need_reboot"
|
|
Packit |
857059 |
#log_message "is_mgmt: $is_mgmt"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# now activate the firmware for the necessary slots
|
|
Packit |
857059 |
if { $do_reboot} {
|
|
Packit |
857059 |
if { $is_mgmt } {
|
|
Packit |
857059 |
# we can't tell which slot is the active mgmt slot, so just reboot
|
|
Packit |
857059 |
# the whole chassis
|
|
Packit |
857059 |
if { $use_rebootall } {
|
|
Packit |
857059 |
chassis_cmd_reboot_all
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
send_chassis_cmd "reboot now"
|
|
Packit |
857059 |
expect_list 60 { "Goodbye" }
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# may not be able to send logout command, so just get out of dodge
|
|
Packit |
857059 |
ignore_rest
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_wait_reboot_done $chassis
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
if { [lindex $need_reboot $i] } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
chassis_cmd 60 0 "resetCard $slot now"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# TBD - is there a way to poll via CLI if card has finished reboot?
|
|
Packit |
857059 |
# allow 60 seconds for it to come fully on line
|
|
Packit |
857059 |
sleep 60
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_push_chassis_firmware { chassis fw_file fw_version card_type {action "push"} { slots "all" } } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_push_chassis_firmware
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to push the given firmware file to the specified slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_push_chassis_firmware chassis fw_file fw_version card_type [action [slots]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp and telnet to
|
|
Packit |
857059 |
## fw_file - local pathname of file to push
|
|
Packit |
857059 |
## fw_version - firmware version of fw_file
|
|
Packit |
857059 |
## card_type - card type of fw_file
|
|
Packit |
857059 |
## action - action after pushing firmware:
|
|
Packit |
857059 |
## push - do not reboot, do not change as primary
|
|
Packit |
857059 |
## is already primary, no change
|
|
Packit |
857059 |
## select - select as primary, but do not reboot
|
|
Packit |
857059 |
## run - select as primary and reboot to activate firmware
|
|
Packit |
857059 |
## slots - list of slot numbers to push to, default is "all" of given card type
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## see push_chassis_firmware for error handling summary
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set base [exec basename $fw_file .pkg]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.$base" "upgrade $chassis $base" "upgrade firmware on $chassis
|
|
Packit |
857059 |
selected slots: $slots
|
|
Packit |
857059 |
Firmware File: $fw_file
|
|
Packit |
857059 |
card type: $card_type
|
|
Packit |
857059 |
Firmware Version: $fw_version
|
|
Packit |
857059 |
Action: $action
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar fw_file fw_file
|
|
Packit |
857059 |
upvar fw_version fw_version
|
|
Packit |
857059 |
upvar card_type card_type
|
|
Packit |
857059 |
upvar action action
|
|
Packit |
857059 |
upvar slots slots
|
|
Packit |
857059 |
|
|
Packit |
857059 |
push_chassis_firmware "$chassis" "$fw_file" "$fw_version" "$card_type" "$action" "$slots"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc sftp_chassis_security_file { chassis sec_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## sftp_chassis_security_file
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given FM security file to the specified chassis the
|
|
Packit |
857059 |
# given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## sftp_chassis_security_file chassis sec_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp to
|
|
Packit |
857059 |
## sec_file - local pathname of file to push
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "put $sec_file /firmware"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc push_chassis_security_file { chassis sec_file {action "push"} { slots "all" } } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## push_chassis_security_file
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given FM security file to the specified slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## push_chassis_security_file chassis sec_file [action [slots]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp and telnet to
|
|
Packit |
857059 |
## sec_file - local pathname of file to push
|
|
Packit |
857059 |
## action - action after pushing FM security files:
|
|
Packit |
857059 |
## push - push, do not restart SM
|
|
Packit |
857059 |
## run - make sure FM running on master, not on slave
|
|
Packit |
857059 |
## runall - make sure FM running on master and slave
|
|
Packit |
857059 |
## restart - restart FM on master, make sure not running on slave
|
|
Packit |
857059 |
## restartall - restart FM on master and slave
|
|
Packit |
857059 |
## stop - stop FM on master and slave
|
|
Packit |
857059 |
## slots - list of slot numbers to push to, default is "all" to all
|
|
Packit |
857059 |
# management cards
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Any slots which are not of a management card, are quietly skipped.
|
|
Packit |
857059 |
## This allows multi-file push to work with a slot list.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## If the sftp fails for some slots but succeeds for others. The failed slots
|
|
Packit |
857059 |
## are logged and an exception will be thrown, however the good slots
|
|
Packit |
857059 |
## are processed to completion.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# variables:
|
|
Packit |
857059 |
# runstate: 0=no change, 1=running, 2=restart, -1=stop
|
|
Packit |
857059 |
if { "$action" == "push" } {
|
|
Packit |
857059 |
set push 1
|
|
Packit |
857059 |
set master_runstate 0
|
|
Packit |
857059 |
set slave_runstate 0
|
|
Packit |
857059 |
} elseif { "$action" == "stop" } {
|
|
Packit |
857059 |
set push 0
|
|
Packit |
857059 |
set master_runstate -1
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "run" } {
|
|
Packit |
857059 |
set push 0
|
|
Packit |
857059 |
set master_runstate 1
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "runall" } {
|
|
Packit |
857059 |
set push 0
|
|
Packit |
857059 |
set master_runstate 1
|
|
Packit |
857059 |
set slave_runstate 1
|
|
Packit |
857059 |
} elseif { "$action" == "restart" } {
|
|
Packit |
857059 |
set push 0
|
|
Packit |
857059 |
set master_runstate 2
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "restartall" } {
|
|
Packit |
857059 |
set push 0
|
|
Packit |
857059 |
set master_runstate 2
|
|
Packit |
857059 |
set slave_runstate 2
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
fail_test "Invalid FM security file push action: $action"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Seeing if $chassis present running firmware supports FM security file push ...\n"
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "fwPush"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
fail_test "Chassis $chassis present running firmware does not support push:\n$res"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Getting card type of management card from $chassis ...\n"
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
set mgmt_card_type [get_chassis_card_type $my_slot]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Getting Slot list from $chassis ...\n"
|
|
Packit |
857059 |
if { [string equal "$slots" "all"] } {
|
|
Packit |
857059 |
# push to all slots of matching card type
|
|
Packit |
857059 |
set push_slots [get_chassis_slots $mgmt_card_type]
|
|
Packit |
857059 |
set num_slots [llength $push_slots]
|
|
Packit |
857059 |
#set push_all 0
|
|
Packit |
857059 |
set push_all 1
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# push to a specific set of slots
|
|
Packit |
857059 |
set push_slots "$slots"
|
|
Packit |
857059 |
set push_all 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set num_slots [llength $push_slots]
|
|
Packit |
857059 |
if { $num_slots == 0 } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
skip_case "No management cards of type $mgmt_card_type"
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Getting present installed firmware from $chassis ...\n"
|
|
Packit |
857059 |
# first get present card types for each of the slots
|
|
Packit |
857059 |
set card_types ""
|
|
Packit |
857059 |
|
|
Packit |
857059 |
foreach slot $push_slots {
|
|
Packit |
857059 |
lappend card_types [get_chassis_card_type $slot]
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "push_slots: $push_slots"
|
|
Packit |
857059 |
#log_message "num_slots: $num_slots"
|
|
Packit |
857059 |
#log_message "card_types: $card_types"
|
|
Packit |
857059 |
#log_message "mgmt_card_type: $mgmt_card_type"
|
|
Packit |
857059 |
#log_message "my_slot: $my_slot"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Determining operations needed to upgrade to $sec_file for $chassis ..."
|
|
Packit |
857059 |
# now check that card types match and determine if we need to push security file
|
|
Packit |
857059 |
set need_push ""
|
|
Packit |
857059 |
set have_card 0
|
|
Packit |
857059 |
set mgmt_slot ""
|
|
Packit |
857059 |
set fm_running ""
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
if { ! [ string equal "$mgmt_card_type" [lindex $card_types $i] ] } {
|
|
Packit |
857059 |
# if this happens card type is inconsistent with original
|
|
Packit |
857059 |
# query for slots of given card type (hot swap during update?)
|
|
Packit |
857059 |
# or user has explicitly specified slots and picked one of
|
|
Packit |
857059 |
# wrong card type
|
|
Packit |
857059 |
# quiety ignore this slot
|
|
Packit |
857059 |
lappend need_push 0
|
|
Packit |
857059 |
log_message "Test: Skipping slot $slot: is of type [lindex $card_types $i], $sec_file is for $mgmt_card_type"
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check whether the slot support running the ESM
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "smConfig"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
# slot will be skipped, doesn't support smConfig
|
|
Packit |
857059 |
lappend card_capabilities 0
|
|
Packit |
857059 |
lappend fm_running 0
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend card_capabilities 1
|
|
Packit |
857059 |
lappend fm_running [ is_esm_running ]
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" ""] || [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
set mgmt_slot "$slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set have_card 1
|
|
Packit |
857059 |
# valid slot so push security file to this slot
|
|
Packit |
857059 |
lappend need_push $push
|
|
Packit |
857059 |
if { $push } {
|
|
Packit |
857059 |
log_message "Test: Will need to push FM security file to slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "Test: No need to push FM security files slot $slot\n"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# only need do a step if applicable to at least 1 slot
|
|
Packit |
857059 |
set do_push [ expr [lsearch -exact $need_push 1] != -1 ]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "mgmt_slot: $mgmt_slot"
|
|
Packit |
857059 |
#log_message "card_capabilities: $card_capabilities"
|
|
Packit |
857059 |
#log_message "fm_running: $fm_running"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" "" ] } {
|
|
Packit |
857059 |
skip_case "chassis does not have an ESM license key or does not support smConfig"
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "push_all: $push_all"
|
|
Packit |
857059 |
#log_message "do_push: $do_push"
|
|
Packit |
857059 |
#log_message "need_push: $need_push"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set fail 0
|
|
Packit |
857059 |
set pushed 0
|
|
Packit |
857059 |
set sftp_failures ""
|
|
Packit |
857059 |
set sftp_statuses ""
|
|
Packit |
857059 |
set need_runstate ""
|
|
Packit |
857059 |
set do_runstate 0
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
if { ! [lindex $card_capabilities $i] } {
|
|
Packit |
857059 |
# if this happens card is not capable of smConfig ignore this slot
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: Skipping slot $slot: does not support smConfig"
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set running [ lindex $fm_running $i]
|
|
Packit |
857059 |
if { ! [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
# slave MM
|
|
Packit |
857059 |
if { ( $slave_runstate < 0 && $running )
|
|
Packit |
857059 |
|| ($slave_runstate == 1 && ! $running )
|
|
Packit |
857059 |
|| $slave_runstate == 2 } {
|
|
Packit |
857059 |
lappend need_runstate $slave_runstate
|
|
Packit |
857059 |
set do_runstate 1
|
|
Packit |
857059 |
log_message "Test: Need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: No need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# master MM
|
|
Packit |
857059 |
if { ( $master_runstate < 0 && $running )
|
|
Packit |
857059 |
|| ($master_runstate == 1 && ! $running )
|
|
Packit |
857059 |
|| $master_runstate == 2 } {
|
|
Packit |
857059 |
lappend need_runstate $master_runstate
|
|
Packit |
857059 |
set do_runstate 1
|
|
Packit |
857059 |
log_message "Test: Need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: No need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_push && ( $push_all || [lindex $need_push $i] ) } {
|
|
Packit |
857059 |
# push one slot at a time
|
|
Packit |
857059 |
log_message "\nTest: sftp $sec_file to slot $slot\n"
|
|
Packit |
857059 |
sftp_chassis_security_file $chassis $sec_file
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check status, must do immediately after sftp
|
|
Packit |
857059 |
set status [get_chassis_sftp_status $slot 1]
|
|
Packit |
857059 |
if { [ string equal "$status" "success" ] || [ string equal "$status" "skipped" ] } {
|
|
Packit |
857059 |
set pushed 1
|
|
Packit |
857059 |
lappend sftp_failures 0
|
|
Packit |
857059 |
lappend sftp_statuses "$status"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "\nFAILURE: Failed to sftp FM security file to chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
lappend sftp_failures 1
|
|
Packit |
857059 |
lappend sftp_statuses "$status"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { ! $push_all } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# we never sftp'ed to this slot
|
|
Packit |
857059 |
lappend sftp_failures 0
|
|
Packit |
857059 |
lappend sftp_statuses "skipped"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# make sure we are logged in for operations below
|
|
Packit |
857059 |
if { ! ( $do_push && $push_all ) } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "pushed: $pushed"
|
|
Packit |
857059 |
#log_message "sftp_statuses: $sftp_statuses"
|
|
Packit |
857059 |
#log_message "sftp_failures: $sftp_failures"
|
|
Packit |
857059 |
#log_message "fail: $fail"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $fail } {
|
|
Packit |
857059 |
fail_test "Unable to sftp FM security file to requested slots in $chassis"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "do_runstate: $do_runstate"
|
|
Packit |
857059 |
#log_message "need_runstate: $need_runstate"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_runstate} {
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $push_slots $i]
|
|
Packit |
857059 |
set new_runstate [lindex $need_runstate $i]
|
|
Packit |
857059 |
if { $new_runstate != 0 } {
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { $new_runstate > 0 } {
|
|
Packit |
857059 |
# easier to restart, will start if not already running
|
|
Packit |
857059 |
chassis_cmd 60 0 "smControl restart"
|
|
Packit |
857059 |
# don't wait, it would risk having mismatched esm configs
|
|
Packit |
857059 |
} elseif { $new_runstate < 0 } {
|
|
Packit |
857059 |
chassis_cmd 60 0 "smControl stop"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! ( $do_push || $do_runstate ) } {
|
|
Packit |
857059 |
# we are done, everything is already the way we want it
|
|
Packit |
857059 |
if { $have_card } {
|
|
Packit |
857059 |
skip_case "No action required"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
skip_case "No selected slots of type $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_push_chassis_security_file { chassis sec_file {action "push"} { slots "all" } } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_push_chassis_security_file
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to push the given FM security file to the specified slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_push_chassis_security_file chassis sec_file [action [slots]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to sftp and telnet to
|
|
Packit |
857059 |
## sec_file - local pathname of file to push
|
|
Packit |
857059 |
## action - action after pushing firmware:
|
|
Packit |
857059 |
## push - do not reboot, do not change as primary
|
|
Packit |
857059 |
## is already primary, no change
|
|
Packit |
857059 |
## slots - list of slot numbers to push to, default is "all" of given card type
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## see push_chassis_security_file for error handling summary
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set base [exec basename $sec_file .pem]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.$base" "upgrade $chassis $base" "upgrade FM security file on $chassis
|
|
Packit |
857059 |
Selected slots: $slots
|
|
Packit |
857059 |
Security File: $sec_file
|
|
Packit |
857059 |
Action: $action
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar sec_file sec_file
|
|
Packit |
857059 |
upvar action action
|
|
Packit |
857059 |
upvar slots slots
|
|
Packit |
857059 |
|
|
Packit |
857059 |
push_chassis_security_file "$chassis" "$sec_file" "$action" "$slots"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_chassis_configure { chassis chassisIP} {
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global tools_case_status
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.emb.configure" "Chassis $chassis configure" "Configure $chassis
|
|
Packit |
857059 |
File: TestOnly/chassis.exp" case_setup case_cleanup {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar chassisIP chassisIP
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set syslogServer $env(SYSLOG_SERVER)
|
|
Packit |
857059 |
set syslogPort $env(SYSLOG_PORT)
|
|
Packit |
857059 |
set syslogFacility $env(SYSLOG_FACILITY)
|
|
Packit |
857059 |
set ntpServer $env(NTP_SERVER)
|
|
Packit |
857059 |
set tzOffset $env(TZ_OFFSET)
|
|
Packit |
857059 |
set dstStart $env(DST_START)
|
|
Packit |
857059 |
set dstEnd $env(DST_END)
|
|
Packit |
857059 |
set linkWidthSelection $env(LINKWIDTH_SETTING)
|
|
Packit |
857059 |
set setname $env(SET_NAME)
|
|
Packit |
857059 |
set linkCRCMode $env(LINKCRCMODE)
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set chassis_cmd_string "logSyslogConfig"
|
|
Packit |
857059 |
set setSyslog 0
|
|
Packit |
857059 |
if { [string equal "$syslogServer" "0.0.0.0"] == 0 } {
|
|
Packit |
857059 |
append chassis_cmd_string " -h $syslogServer"
|
|
Packit |
857059 |
set setSyslog 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [string equal "$syslogPort" "-1"] == 0 } {
|
|
Packit |
857059 |
append chassis_cmd_string " -p $syslogPort"
|
|
Packit |
857059 |
set setSyslog 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [string equal "$syslogFacility" "-1"] == 0 } {
|
|
Packit |
857059 |
append chassis_cmd_string " -f $syslogFacility"
|
|
Packit |
857059 |
set setSyslog 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { $setSyslog } {
|
|
Packit |
857059 |
send_chassis_cmd $chassis_cmd_string
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "Successfully" "facility" } { "Invalid" "usage" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$ntpServer" "0.0.0.0"] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "time -S $ntpServer"
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "Configured" "NTP" } { "not" "valid" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$tzOffset" "100"] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "timeZoneConf $tzOffset"
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "successfully" "configured" } { "invalid" "not found" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$dstStart" "0 0 0"] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "timeDstConf $dstStart $dstEnd"
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "Timezone" "DST" } { "bounds" "not found" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$linkWidthSelection" "0"] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "ismChassisSetWidth $linkWidthSelection"
|
|
Packit |
857059 |
send_chassis_cmd "showLastRetCode"
|
|
Packit |
857059 |
set out [expect_list 60 { "Last Exit Code: [0-9]+" } { "Error" }]
|
|
Packit |
857059 |
regexp {([0-9]+)} $out ret
|
|
Packit |
857059 |
if { ! [ string equal "$ret" "0"] } {
|
|
Packit |
857059 |
if { [ string equal "$ret" "5"] } {
|
|
Packit |
857059 |
skip_case "\n$chassis: Skipped changing chassis link width: ismChassisSetWidth command not supported"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
fail_test "\n$chassis: Failed changing chassis link width: ismChassisSetWidth command failed with return code $ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$chassisIP" "0.0.0.0"] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "setChassisIpAddr -h $chassisIP"
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "reconnect" "updated" } { "valid" "usage" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# $setname is y or n
|
|
Packit |
857059 |
if { [string equal "$setname" "y"] } {
|
|
Packit |
857059 |
send_chassis_cmd "setNodeDesc \"$chassis\""
|
|
Packit |
857059 |
expect_progress 60 {[\r\n]} { "success" "changed" } { "usage:" "not found" }
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [string equal "$linkCRCMode" "-1" ] == 0 } {
|
|
Packit |
857059 |
send_chassis_cmd "ismChassisSetCrcMode $linkCRCMode"
|
|
Packit |
857059 |
send_chassis_cmd "showLastRetCode"
|
|
Packit |
857059 |
set out [expect_list 60 { "Last Exit Code: [0-9]+" } { "Error" }]
|
|
Packit |
857059 |
regexp {([0-9]+)} $out ret
|
|
Packit |
857059 |
if { ! [ string equal "$ret" "0"] } {
|
|
Packit |
857059 |
if { [ string equal "$ret" "5" ] } {
|
|
Packit |
857059 |
skip_case "\n$chassis: Skipped changing chassis link CRC mode: ismChassisSetCrcMode command not supported"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
fail_test "\n$chassis: Failed changing chassis link CRC mode: ismChassisSetCrcMode command failed with return code $ret"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc check_esm_config { config_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## check_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## check the syntax of the given esm config file
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## check_esm_config config_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## config_file - local pathname of file
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ file exists "/usr/lib/opa/fm_tools/config_check" ] } {
|
|
Packit |
857059 |
set env(IFS_FM_BASE) ""
|
|
Packit |
857059 |
set tooldir "/usr/lib/opa/fm_tools"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
set env(IFS_FM_BASE) "/usr/lib/opa-fm"
|
|
Packit |
857059 |
set tooldir "$env(IFS_FM_BASE)/bin"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
log_message "IFS_FM_BASE=$env(IFS_FM_BASE)"
|
|
Packit |
857059 |
log_message "tooldir=$tooldir"
|
|
Packit |
857059 |
log_message ""
|
|
Packit |
857059 |
if { [ file exists "$tooldir/config_check" ] } {
|
|
Packit |
857059 |
log_message "$tooldir/config_check -c $config_file"
|
|
Packit |
857059 |
if { [ catch { exec "$tooldir/config_check" -c "$config_file" } err_str ] != 0 } {
|
|
Packit |
857059 |
puts "$tooldir/config_check -c $config_file"
|
|
Packit |
857059 |
show_message "$err_str"
|
|
Packit |
857059 |
error "$tooldir/config_check -c $config_file: failed: $err_str"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
skip_case "Unable to pre-check config file, Intel OPA FM not installed on this server"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc sftp_esm_config { chassis config_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## sftp_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given SM config file to the specified chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## sftp_esm_config chassis config_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to push
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "put $config_file /firmware/opafm.xml"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_esm_config { chassis config_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## get esm config file from the chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_esm_config config_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to get to
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 1 - match, 0 - no match
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "get /firmware/opafm.xml $config_file" 0
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc compare_esm_config { chassis config_file mgmt_card_type } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## compare_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return if the config_file matches esm config in the chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## compare_esm_config chassis config_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to push
|
|
Packit |
857059 |
## mgmt_card_type - Name of management card type
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 1 - match, 0 - no match
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
global test_tmp
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nComparing $config_file to FM config...\n"
|
|
Packit |
857059 |
set temp_file "$test_tmp/get_opafm.xml"
|
|
Packit |
857059 |
get_esm_config "$chassis" "$test_tmp/get_opafm.xml"
|
|
Packit |
857059 |
if { [catch { run_cmd "exec cmp -s $config_file $temp_file"} ] == 0 } {
|
|
Packit |
857059 |
# match
|
|
Packit |
857059 |
log_message "Test: Matches\n"
|
|
Packit |
857059 |
return 1
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "Test: Does not Match\n"
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc is_esm_running { } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## is_esm_running
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## check the esm status for the current slot in the current chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## is_esm_running
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## esm status
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DONE
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "smControl status"
|
|
Packit |
857059 |
# require trailing whitespace to anchor end of string
|
|
Packit |
857059 |
set out [expect_list 60 "{Subnet manager is \[a-zA-Z0-9_ -\]+\\\.}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
set ret ""
|
|
Packit |
857059 |
regexp {is ([a-zA-Z0-9_ -]+)\.} $out line ret
|
|
Packit |
857059 |
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return [ string equal "$ret" "running"]
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc chassis_get_sm_boot_options { } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## chassis_get_sm_boot_options
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## return SM boot options
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## chassis_get_sm_boot_options
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## { startAtBoot startOnSlaveCmu }
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
send_chassis_cmd "smConfig query"
|
|
Packit |
857059 |
# the [:space:] bounds the + so we get all the data on the line
|
|
Packit |
857059 |
set out1 [expect_list 60 "{startAtBoot: \[0-9A-Za-z\]+\[\[:space:\]\]}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
set out2 [expect_list 60 "{startOnSlaveCmu: \[0-9A-Za-z/\]+\[\[:space:\]\]}" { "usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
check_chassis_exit_status 60 0
|
|
Packit |
857059 |
#log_message "out1=$out1"
|
|
Packit |
857059 |
#log_message "out2=$out2"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set ret1 ""
|
|
Packit |
857059 |
set ret2 ""
|
|
Packit |
857059 |
# throw away the \r\n, there may be trailing spaces, TCL lists will ignore
|
|
Packit |
857059 |
regexp {startAtBoot: ([A-Za-z0-9]+)[[:space:]]} $out1 line ret1
|
|
Packit |
857059 |
regexp {startOnSlaveCmu: ([A-Za-z0-9/]+)[[:space:]]} $out2 line ret2
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return "$ret1 $ret2"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc push_esm_config { chassis config_file {action "push"} {bootstate ""} } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## push_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## push the given ESM config file to all the applicable slots in the
|
|
Packit |
857059 |
## given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## push_esm_config chassis config_file [action [bootstate]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to push
|
|
Packit |
857059 |
## if "", no file push will occur
|
|
Packit |
857059 |
## action - action after pushing config_file:
|
|
Packit |
857059 |
## push - push, do not restart SM
|
|
Packit |
857059 |
## select - same as push
|
|
Packit |
857059 |
## run - make sure FM running on master, not on slave
|
|
Packit |
857059 |
## runall - make sure FM running on master and slave
|
|
Packit |
857059 |
## restart - restart FM on master, make sure not running on slave
|
|
Packit |
857059 |
## restartall - restart FM on master and slave
|
|
Packit |
857059 |
## stop - stop FM on master and slave
|
|
Packit |
857059 |
## bootstate - optional selection for FM bootstate
|
|
Packit |
857059 |
## "" - no change to FM start at boot options
|
|
Packit |
857059 |
## disable - disable FM start on all MM on boot
|
|
Packit |
857059 |
## enable - enable FM start on master MM on boot, disable on slave MM
|
|
Packit |
857059 |
## enableall - enable FM start on all MM on boot
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## If the scp fails for some slots but succeeds for others. The failed slots
|
|
Packit |
857059 |
## are logged and an exception will be thrown, however the good slots
|
|
Packit |
857059 |
## are processed to completion [except for the restart] (if possible)
|
|
Packit |
857059 |
## so that they are not left in an odd state
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# variables:
|
|
Packit |
857059 |
# restart_only - no push, just restart FM
|
|
Packit |
857059 |
set restart_only [string equal "$config_file" ""]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# runstate: 0=no change, 1=running, 2=restart, -1=stop
|
|
Packit |
857059 |
if { "$action" == "push" || "$action" == "select" } {
|
|
Packit |
857059 |
set master_runstate 0
|
|
Packit |
857059 |
set slave_runstate 0
|
|
Packit |
857059 |
} elseif { "$action" == "stop" } {
|
|
Packit |
857059 |
set master_runstate -1
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "run" } {
|
|
Packit |
857059 |
set master_runstate 1
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "runall" } {
|
|
Packit |
857059 |
set master_runstate 1
|
|
Packit |
857059 |
set slave_runstate 1
|
|
Packit |
857059 |
} elseif { "$action" == "restart" } {
|
|
Packit |
857059 |
set master_runstate 2
|
|
Packit |
857059 |
set slave_runstate -1
|
|
Packit |
857059 |
} elseif { "$action" == "restartall" } {
|
|
Packit |
857059 |
set master_runstate 2
|
|
Packit |
857059 |
set slave_runstate 2
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
fail_test "Invalid FM config file action: $action"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { "$bootstate" != "" && "$bootstate" != "disable"
|
|
Packit |
857059 |
&& "$bootstate" != "enable" && "$bootstate" != "enableall" } {
|
|
Packit |
857059 |
fail_test "Invalid FM config bootstate: $bootstate"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "action: $action"
|
|
Packit |
857059 |
#log_message "restart_only: $restart_only"
|
|
Packit |
857059 |
#log_message "bootstate: $bootstate"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
# check if chassis supports slaveCli, if not then skip chassis, older FW
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "slaveCli"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
skip_case "chassis does not support FM config via FastFabric"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Getting Slot list from $chassis ...\n"
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
# get management card type for this chassis model
|
|
Packit |
857059 |
set mgmt_card_type [ get_chassis_card_type $my_slot ]
|
|
Packit |
857059 |
# all slots of matching card type (eg. all management cards)
|
|
Packit |
857059 |
set mgmt_slots [get_chassis_slots $mgmt_card_type]
|
|
Packit |
857059 |
set num_slots [llength $mgmt_slots]
|
|
Packit |
857059 |
if { $num_slots == 0 } {
|
|
Packit |
857059 |
# this should not happen, we should at least find card 0
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "No cards of type $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# lets be paranoid
|
|
Packit |
857059 |
if { ! [ string equal [get_chassis_card_type $my_slot] "$mgmt_card_type" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "IP address given is not for chassis mgmt card $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Checking FM capabilities and status of $chassis ...\n"
|
|
Packit |
857059 |
# flag per slot indicating if slot has smConfig capability
|
|
Packit |
857059 |
# may not have smConfig on all cards, esp if ESM license key lacking
|
|
Packit |
857059 |
set card_capabilities ""
|
|
Packit |
857059 |
# flag per slot indicating if slot has FM currently running
|
|
Packit |
857059 |
set fm_running ""
|
|
Packit |
857059 |
# slot which supports sm CLI. Prefer active mgmt card otherwise its
|
|
Packit |
857059 |
# secondary mgmt card
|
|
Packit |
857059 |
set mgmt_slot ""
|
|
Packit |
857059 |
# see if any slots in chassis support smConfig, if so check FM status
|
|
Packit |
857059 |
foreach slot $mgmt_slots {
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "smConfig"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
# slot will be skipped, doesn't support smConfig
|
|
Packit |
857059 |
lappend card_capabilities 0
|
|
Packit |
857059 |
lappend fm_running 0
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend card_capabilities 1
|
|
Packit |
857059 |
lappend fm_running [ is_esm_running ]
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" ""] || [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
set mgmt_slot "$slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "mgmt_slots: $mgmt_slots"
|
|
Packit |
857059 |
#log_message "mgmt_slot: $mgmt_slot"
|
|
Packit |
857059 |
#log_message "num_slots: $num_slots"
|
|
Packit |
857059 |
#log_message "card_capabilities: $card_capabilities"
|
|
Packit |
857059 |
#log_message "fm_running: $fm_running"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" "" ] } {
|
|
Packit |
857059 |
skip_case "chassis does not have an ESM license key or does not support smConfig"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
set do_push 0
|
|
Packit |
857059 |
if { ! $restart_only } {
|
|
Packit |
857059 |
log_message "\nTest: Checking FM config in $chassis ...\n"
|
|
Packit |
857059 |
# we trust that secondary management cards will be synced with primary
|
|
Packit |
857059 |
# so only need to upload this once
|
|
Packit |
857059 |
set config_matches [compare_esm_config $chassis $config_file $mgmt_card_type ]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "config_matches: $config_matches"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Determining operations needed to update to $config_file for $chassis ..."
|
|
Packit |
857059 |
## now check that card is capable and determine if we need to push config
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! $config_matches } {
|
|
Packit |
857059 |
# config is not in chassis, need to push and possibly restart
|
|
Packit |
857059 |
set do_push 1
|
|
Packit |
857059 |
log_message "Test: Will need to push config to chassis"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# config is in chassis, can skip push
|
|
Packit |
857059 |
set do_push 0
|
|
Packit |
857059 |
log_message "Test: No need to push config to chassis"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# we are assuming we can trust that primary mgmt card's config files
|
|
Packit |
857059 |
# match those of secondary. So FM runstate is only card specific aspect.
|
|
Packit |
857059 |
set need_runstate ""
|
|
Packit |
857059 |
set do_runstate 0
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $mgmt_slots $i]
|
|
Packit |
857059 |
if { ! [lindex $card_capabilities $i] } {
|
|
Packit |
857059 |
# if this happens card is not capable of smConfig ignore this slot
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: Skipping slot $slot: does not support smConfig"
|
|
Packit |
857059 |
continue
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
set running [ lindex $fm_running $i]
|
|
Packit |
857059 |
if { ! [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
# slave MM
|
|
Packit |
857059 |
if { ( $slave_runstate < 0 && $running )
|
|
Packit |
857059 |
|| ($slave_runstate == 1 && ! $running )
|
|
Packit |
857059 |
|| $slave_runstate == 2 } {
|
|
Packit |
857059 |
lappend need_runstate $slave_runstate
|
|
Packit |
857059 |
set do_runstate 1
|
|
Packit |
857059 |
log_message "Test: Need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: No need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
# master MM
|
|
Packit |
857059 |
if { ( $master_runstate < 0 && $running )
|
|
Packit |
857059 |
|| ($master_runstate == 1 && ! $running )
|
|
Packit |
857059 |
|| $master_runstate == 2 } {
|
|
Packit |
857059 |
lappend need_runstate $master_runstate
|
|
Packit |
857059 |
set do_runstate 1
|
|
Packit |
857059 |
log_message "Test: Need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
lappend need_runstate 0
|
|
Packit |
857059 |
log_message "Test: No need to change runstate for FM in slot $slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
log_message "\n"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "do_push: $do_push"
|
|
Packit |
857059 |
#log_message "do_runstate: $do_runstate"
|
|
Packit |
857059 |
#log_message "need_runstate: $need_runstate"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_push } {
|
|
Packit |
857059 |
set fail 0
|
|
Packit |
857059 |
set scp_statuses ""
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# push is done once to chassis and automatically synced to all
|
|
Packit |
857059 |
# mgmt cards
|
|
Packit |
857059 |
log_message "Test: sftp $config_file to all applicable slots\n"
|
|
Packit |
857059 |
sftp_esm_config $chassis $config_file
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# will check status of scp operations for slots we care about below
|
|
Packit |
857059 |
log_message "\nTest: Verifying config was pushed to $chassis ...\n"
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check status, must do immediately after scp for each slot
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $mgmt_slots $i]
|
|
Packit |
857059 |
# do not expect "skipped" status
|
|
Packit |
857059 |
set status [get_chassis_sftp_status $slot 1]
|
|
Packit |
857059 |
if { [ string equal "$status" "success" ] } {
|
|
Packit |
857059 |
lappend scp_statuses "$status"
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "\nFAILURE: Failed to scp config to chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
lappend scp_statuses "$status"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "scp_statuses: $scp_statuses"
|
|
Packit |
857059 |
#log_message "fail: $fail"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! $fail } {
|
|
Packit |
857059 |
# we trust that secondary management cards will be synced with
|
|
Packit |
857059 |
# primary so only need to upload this once
|
|
Packit |
857059 |
if { ! [compare_esm_config $chassis $config_file $mgmt_card_type ] } {
|
|
Packit |
857059 |
# the config disappeared
|
|
Packit |
857059 |
set fail 1
|
|
Packit |
857059 |
log_message "\nFAILURE: Unexpected mismatch of config for chassis $chassis slot $slot\n"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# if any of the above failed, do not change runstate it could make things worse
|
|
Packit |
857059 |
if { $fail } {
|
|
Packit |
857059 |
fail_test "Unable to scp config to required slots in $chassis"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# DEBUG
|
|
Packit |
857059 |
#log_message "do_runstate: $do_runstate"
|
|
Packit |
857059 |
#log_message "need_runstate: $need_runstate"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { $do_runstate} {
|
|
Packit |
857059 |
for { set i 0 } { $i < $num_slots } { incr i } {
|
|
Packit |
857059 |
set slot [lindex $mgmt_slots $i]
|
|
Packit |
857059 |
set new_runstate [lindex $need_runstate $i]
|
|
Packit |
857059 |
if { $new_runstate != 0 } {
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { $new_runstate > 0 } {
|
|
Packit |
857059 |
# easier to restart, will start if not already running
|
|
Packit |
857059 |
chassis_cmd 60 0 "smControl restart"
|
|
Packit |
857059 |
# don't wait, it would risk having mismatched esm configs
|
|
Packit |
857059 |
} elseif { $new_runstate < 0 } {
|
|
Packit |
857059 |
chassis_cmd 60 0 "smControl stop"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# adjust start at boot options
|
|
Packit |
857059 |
set do_boot 0
|
|
Packit |
857059 |
if { "$bootstate" != "" } {
|
|
Packit |
857059 |
if { ! [ string equal "$mgmt_slot" "$my_slot" ] } {
|
|
Packit |
857059 |
fail_test "Master MM does not have SM license key, unable to configure start options in $chassis"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
log_message "\nTest: Checking FM Start At Boot Options for $chassis ...\n"
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
# get present options to old_startAtBootArg and old_startOnSlaveCmuArg
|
|
Packit |
857059 |
set boot_options [ chassis_get_sm_boot_options ]
|
|
Packit |
857059 |
set old_startAtBootArg [lindex $boot_options 0 ]
|
|
Packit |
857059 |
set old_startOnSlaveCmuArg [lindex $boot_options 1 ]
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# determine desired settings
|
|
Packit |
857059 |
if { "$bootstate" == "disable" } {
|
|
Packit |
857059 |
set startAtBootArg "no"
|
|
Packit |
857059 |
set startOnSlaveCmuArg "no"
|
|
Packit |
857059 |
} elseif { "$bootstate" == "enable" } {
|
|
Packit |
857059 |
set startAtBootArg "yes"
|
|
Packit |
857059 |
set startOnSlaveCmuArg "no"
|
|
Packit |
857059 |
} elseif { "$bootstate" == "enableall" } {
|
|
Packit |
857059 |
set startAtBootArg "yes"
|
|
Packit |
857059 |
set startOnSlaveCmuArg "yes"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# do what is needed
|
|
Packit |
857059 |
set arg1 ""
|
|
Packit |
857059 |
set arg2 ""
|
|
Packit |
857059 |
if { "$startAtBootArg" != "$old_startAtBootArg" } {
|
|
Packit |
857059 |
set arg1 "startAtBoot $startAtBootArg"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { "$startOnSlaveCmuArg" != "$old_startOnSlaveCmuArg"
|
|
Packit |
857059 |
&& "$old_startOnSlaveCmuArg" != "N/A" } {
|
|
Packit |
857059 |
set arg2 "startOnSlaveCmu $startOnSlaveCmuArg"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { "$arg1" != "" || "$arg2" != "" } {
|
|
Packit |
857059 |
log_message "\nTest: Changing FM Start At Boot Options for $chassis ...\n"
|
|
Packit |
857059 |
chassis_cmd 60 0 "smConfig $arg1 $arg2"
|
|
Packit |
857059 |
set do_boot 1
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
log_message "\nTest: No Change to FM Start At Boot Options for $chassis ...\n"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { ! $do_push && ! $do_runstate && ! $do_boot } {
|
|
Packit |
857059 |
# we are done, everything is already the way we want it
|
|
Packit |
857059 |
# report skip so user knows we didn't change anything on this chassis
|
|
Packit |
857059 |
skip_case "No action required"
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_push_esm_config { chassis config_file {action "push"} {bootstate ""} } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_push_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to push the given config file to all applicable slots in
|
|
Packit |
857059 |
## the given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_push_esm_config chassis config_file [action [bootstate]]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to push
|
|
Packit |
857059 |
## action - action after pushing firmware:
|
|
Packit |
857059 |
## push - push, do not restart SM
|
|
Packit |
857059 |
## select - same as push
|
|
Packit |
857059 |
## run - restart FM on master, make sure not running on slave
|
|
Packit |
857059 |
## runall - restart FM on master and slave
|
|
Packit |
857059 |
## stop - stop FM on master and slave
|
|
Packit |
857059 |
## bootstate - optional selection for FM bootstate
|
|
Packit |
857059 |
## "" - no change to FM start at boot options
|
|
Packit |
857059 |
## disable - disable FM start on all MM on boot
|
|
Packit |
857059 |
## enable - enable FM start on master MM on boot, disable on slave MM
|
|
Packit |
857059 |
## enableall - enable FM start on all MM on boot
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## see push_esm_config for error handling summary
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.fmconfig" "update $chassis $config_file" "update FM config file on $chassis
|
|
Packit |
857059 |
Config File: $config_file
|
|
Packit |
857059 |
Action: $action
|
|
Packit |
857059 |
BootState: $bootstate
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar config_file config_file
|
|
Packit |
857059 |
upvar action action
|
|
Packit |
857059 |
upvar bootstate bootstate
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# translate action, when pushing config file we want to use restart
|
|
Packit |
857059 |
# so that the new file ends up "running"
|
|
Packit |
857059 |
if { "$action" == "run" } {
|
|
Packit |
857059 |
set action "restart"
|
|
Packit |
857059 |
} elseif { "$action" == "runall" } {
|
|
Packit |
857059 |
set action "restartall"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
push_esm_config "$chassis" "$config_file" "$action" "$bootstate"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_get_esm_config { chassis config_file } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_get_esm_config
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to get the given config file from the given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_get_esm_config chassis config_file
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## config_file - local pathname of file to fetch to
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## see push_esm_config for error handling summary
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.fm_get_config" "get $chassis $config_file" "get FM config file from $chassis
|
|
Packit |
857059 |
To Config File: $config_file
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar config_file config_file
|
|
Packit |
857059 |
upvar action action
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check if chassis supports slaveCli, if not then skip chassis, older FW
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "slaveCli"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
skip_case "chassis does not support FM config via FastFabric"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# TBD - make this common code with fmconfig
|
|
Packit |
857059 |
log_message "\nTest: Getting Slot list from $chassis ...\n"
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
# get management card type for this chassis model
|
|
Packit |
857059 |
set mgmt_card_type [ get_chassis_card_type $my_slot]
|
|
Packit |
857059 |
# all slots of matching card type (eg. all management cards)
|
|
Packit |
857059 |
set mgmt_slots [get_chassis_slots $mgmt_card_type]
|
|
Packit |
857059 |
set num_slots [llength $mgmt_slots]
|
|
Packit |
857059 |
if { $num_slots == 0 } {
|
|
Packit |
857059 |
# this should not happen, we should at least find card 0
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "No cards of type $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# lets be paranoid
|
|
Packit |
857059 |
if { ! [ string equal [get_chassis_card_type $my_slot] "$mgmt_card_type" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "IP address given is not for chassis mgmt card $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Checking FM capabilities and status of $chassis ...\n"
|
|
Packit |
857059 |
# slot which supports sm CLI. Prefer active mgmt card otherwise its
|
|
Packit |
857059 |
# secondary mgmt card
|
|
Packit |
857059 |
set mgmt_slot ""
|
|
Packit |
857059 |
# see if any slots in chassis support smConfig
|
|
Packit |
857059 |
foreach slot $mgmt_slots {
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "smConfig"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
# slot will be skipped, doesn't support smConfig
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" ""] || [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
set mgmt_slot "$slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" "" ] } {
|
|
Packit |
857059 |
skip_case "chassis does not have an ESM license key or does not support smConfig"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "mkdir -p [exec dirname $config_file]"
|
|
Packit |
857059 |
exec mkdir -p "[exec dirname $config_file]"
|
|
Packit |
857059 |
get_esm_config "$chassis" "$config_file"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_chassis_getconfig { chassis {fd ""}} {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_chassis_getconfig
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to get basic config from the given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_chassis_getconfig chassis [fd]
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## fd - file to write config info to
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.getconfig" "get $chassis" "get basic configuration from $chassis
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar fd fd
|
|
Packit |
857059 |
set ntpVal ""
|
|
Packit |
857059 |
set sysLogVal ""
|
|
Packit |
857059 |
set timeZone ""
|
|
Packit |
857059 |
set out ""
|
|
Packit |
857059 |
set linkWidth ""
|
|
Packit |
857059 |
set nodeDesc ""
|
|
Packit |
857059 |
set act_fw_version ""
|
|
Packit |
857059 |
set pri_fw_version ""
|
|
Packit |
857059 |
set linkCRCmode ""
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check if chassis supports slaveCli, if not then skip chassis, older FW
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
# slot 0 is alias for mgmt card in all chassis models
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
set act_fw_version [get_chassis_firmware_version $my_slot "act"]
|
|
Packit |
857059 |
set pri_fw_version [get_chassis_firmware_version $my_slot "pri"]
|
|
Packit |
857059 |
send_chassis_cmd "time"
|
|
Packit |
857059 |
set out [expect_list 240 { "[Cc]onfigured.+\n" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {([A-Za-z0-9:. ]+)} $out tmp ntpVal
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
send_chassis_cmd "logSyslogConfig"
|
|
Packit |
857059 |
set out [expect_list 240 { "logSyslogConfig" "[Ss]yslog.+\n" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {([A-Za-z0-9:. ]+)} $out tmp sysLogVal
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
send_chassis_cmd "timeZoneConf"
|
|
Packit |
857059 |
set out [expect_list 240 { "timeZoneConf" ".+[tT]ime.+\n" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {([-A-Za-z0-9:. ]+)} $out tmp timeZone
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
send_chassis_cmd "ismChassisSetWidth"
|
|
Packit |
857059 |
set out [expect_list 240 { "ismChassisSetWidth" "link width supported: [^\r\n]*[\r\n]" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
# "4X" or "4X/8X" or "UNKNOWN" or similar
|
|
Packit |
857059 |
regexp {supported: ([^\r\n]+)[\r\n]} $out tmp linkWidth
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
send_chassis_cmd "showNodeDesc"
|
|
Packit |
857059 |
set out [expect_list 240 { "showNodeDesc" "Node" "\(SMA\)" "Description.+[\r\n]" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found"} ]
|
|
Packit |
857059 |
regexp {.+= (.+)[\r\n]} $out tmp nodeDesc
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
send_chassis_cmd "ismChassisSetCrcMode"
|
|
Packit |
857059 |
set out [expect_list 240 { "ismChassisSetCrcMode" "CRC_MODE: [^\r\n]*[\r\n]" } { "Usage" "Invalid" "Error" "Failed" "roblem" "not found" } ]
|
|
Packit |
857059 |
regexp {CRC_MODE: ([^\r\n]+)[\r\n]} $out tmp linkCRCmode
|
|
Packit |
857059 |
expect_chassis_prompt 60
|
|
Packit |
857059 |
set out "
|
|
Packit |
857059 |
Firmware Active : $act_fw_version
|
|
Packit |
857059 |
Firmware Primary : $pri_fw_version
|
|
Packit |
857059 |
Syslog Configuration : $sysLogVal
|
|
Packit |
857059 |
NTP : $ntpVal
|
|
Packit |
857059 |
Time Zone : $timeZone
|
|
Packit |
857059 |
LinkWidth Support : $linkWidth
|
|
Packit |
857059 |
Node Description : $nodeDesc
|
|
Packit |
857059 |
Link CRC Mode : $linkCRCmode"
|
|
Packit |
857059 |
show_message "\n$chassis:$out"
|
|
Packit |
857059 |
if { ! [ string equal "$fd" "" ] } {
|
|
Packit |
857059 |
puts $fd "$out"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc get_esm_security_files { chassis security_files dest_dir } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## get_esm_security_files
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## get esm security files from the chassis
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## get_esm_security security_files
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## security_files - local pathname of file to get to
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 1 - match, 0 - no match
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global spawn_id expect_out spawn_out timeout
|
|
Packit |
857059 |
global expecting
|
|
Packit |
857059 |
|
|
Packit |
857059 |
chassis_sftp_cmd "sftp admin@\\\[$chassis\\\]:" "get /firmware/$security_files $dest_dir" 0
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
proc test_case_get_esm_security_files { chassis security_files dest_dir } {
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## test_case_get_esm_security_file
|
|
Packit |
857059 |
## -------------------------
|
|
Packit |
857059 |
## test case to get the given security files from the given chassis.
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## Usage:
|
|
Packit |
857059 |
## test_case_get_esm_security_files chassis security_files
|
|
Packit |
857059 |
## Arguments:
|
|
Packit |
857059 |
## chassis - IP address/name of chassis to scp and telnet to
|
|
Packit |
857059 |
## security_files - security files to fetch
|
|
Packit |
857059 |
## Returns:
|
|
Packit |
857059 |
## 0 -> success
|
|
Packit |
857059 |
## -code error on failure
|
|
Packit |
857059 |
## Additional Information:
|
|
Packit |
857059 |
## The global timeout is changed by this routine
|
|
Packit |
857059 |
##
|
|
Packit |
857059 |
## see push_esm_security_files for error handling summary
|
|
Packit |
857059 |
|
|
Packit |
857059 |
global env
|
|
Packit |
857059 |
|
|
Packit |
857059 |
test_case "$chassis.fm_get_security_files" "get $chassis $security_files $dest_dir" "get FM security files from $chassis
|
|
Packit |
857059 |
Get Security Files: $security_files
|
|
Packit |
857059 |
Dest Directory: $dest_dir
|
|
Packit |
857059 |
File: TestTools/chassis.exp" noop noop {
|
|
Packit |
857059 |
upvar chassis chassis
|
|
Packit |
857059 |
upvar security_files security_files
|
|
Packit |
857059 |
upvar action action
|
|
Packit |
857059 |
upvar dest_dir dest_dir
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# check if chassis supports slaveCli, if not then skip chassis, older FW
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "slaveCli"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
skip_case "chassis does not support FM config via FastFabric"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# TBD - make this common code with fmconfig
|
|
Packit |
857059 |
log_message "\nTest: Getting Slot list from $chassis ...\n"
|
|
Packit |
857059 |
set my_slot [ get_this_slot_number ]
|
|
Packit |
857059 |
# get management card type for this chassis model
|
|
Packit |
857059 |
set mgmt_card_type [ get_chassis_card_type $my_slot]
|
|
Packit |
857059 |
# all slots of matching card type (eg. all management cards)
|
|
Packit |
857059 |
set mgmt_slots [get_chassis_slots $mgmt_card_type]
|
|
Packit |
857059 |
set num_slots [llength $mgmt_slots]
|
|
Packit |
857059 |
if { $num_slots == 0 } {
|
|
Packit |
857059 |
# this should not happen, we should at least find card 0
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "No cards of type $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
# lets be paranoid
|
|
Packit |
857059 |
if { ! [ string equal [get_chassis_card_type $my_slot] "$mgmt_card_type" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "IP address given is not for chassis mgmt card $mgmt_card_type"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
# all security files on the master management card
|
|
Packit |
857059 |
set sec_files [ list_esm_security_files ]
|
|
Packit |
857059 |
set num_sec_files [llength $sec_files]
|
|
Packit |
857059 |
if { $num_sec_files == 0 } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
fail_test "No FM security files found"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "\nTest: Checking FM capabilities and status of $chassis ...\n"
|
|
Packit |
857059 |
# slot which supports sm CLI. Prefer active mgmt card otherwise its
|
|
Packit |
857059 |
# secondary mgmt card
|
|
Packit |
857059 |
set mgmt_slot ""
|
|
Packit |
857059 |
# see if any slots in chassis support smConfig
|
|
Packit |
857059 |
foreach slot $mgmt_slots {
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh $chassis $slot
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ catch { set cap [check_chassis_capability "smConfig"] } res ] != 0
|
|
Packit |
857059 |
|| $cap < 1 } {
|
|
Packit |
857059 |
# slot will be skipped, doesn't support smConfig
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" ""] || [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
set mgmt_slot "$slot"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if { [ string equal "$slot" "$my_slot" ] } {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
target_chassis_admin_sh_exit 1
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if { [ string equal "$mgmt_slot" "" ] } {
|
|
Packit |
857059 |
skip_case "chassis does not have an ESM license key or does not support smConfig"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
log_message "mkdir -p $dest_dir"
|
|
Packit |
857059 |
exec mkdir -p $dest_dir
|
|
Packit |
857059 |
foreach sec_file $sec_files {
|
|
Packit |
857059 |
get_esm_security_files "$chassis" "$sec_file" "$dest_dir"
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|