Blame TestTools/chassis.exp

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