*** Settings *** Documentation Do random repeated boots based on the state of the BMC machine. ... The number of repetitions is designated by ${max_num_tests}. Keyword ... names that are listed in @{AVAIL_BOOTS} become the selection of possible ... boots for the test. Resource ../lib/dvt/obmc_driver_vars.txt Resource ../lib/list_utils.robot Resource ../lib/openbmc_ffdc.robot Library ../lib/gen_robot_print.py Library ../lib/gen_robot_plug_in.py Library ../lib/gen_robot_valid.py Library ../lib/state.py Library ../lib/boot/powerons.py Library ../lib/boot/poweroffs.py Library ../lib/obmc_boot_test.py # WITH NAME boot_results *** Variables *** # Initialize program parameters variables. # Create parm_list containing all of our program parameters. This is used by # 'Rqprint Pgm Header' @{parm_list} openbmc_nickname openbmc_host openbmc_username ... openbmc_password os_host os_username os_password pdu_host ... pdu_username pdu_password pdu_slot_no openbmc_serial_host ... openbmc_serial_port boot_stack boot_list max_num_tests ... plug_in_dir_paths status_file_path openbmc_model boot_pass boot_fail ... ffdc_dir_path_style ffdc_check test_mode quiet debug # Initialize each program parameter. ${openbmc_nickname} ${EMPTY} ${openbmc_host} ${EMPTY} ${openbmc_username} root ${openbmc_password} 0penBmc ${os_host} ${EMPTY} ${os_username} root ${os_password} P@ssw0rd ${pdu_host} ${EMPTY} ${pdu_username} admin ${pdu_password} admin ${pdu_slot_no} ${EMPTY} ${openbmc_serial_host} ${EMPTY} ${openbmc_serial_port} ${EMPTY} ${boot_stack} ${EMPTY} ${boot_list} ${EMPTY} ${max_num_tests} 0 ${plug_in_dir_paths} ${EMPTY} ${status_file_path} ${EMPTY} ${openbmc_model} ${EMPTY} # The reason boot_pass and boot_fail are parameters is that it is possible to # be called by a program that has already done some tests. This allows us to # keep the grand total. ${boot_pass} ${0} ${boot_fail} ${0} ${ffdc_dir_path_style} ${EMPTY} ${ffdc_check} ${EMPTY} ${test_mode} 0 ${quiet} 0 ${debug} 0 # Plug-in variables. ${shell_rc} 0x00000000 ${fail_on_plug_in_failure} 1 ${return_on_non_zero_rc} 0 ${next_boot} ${EMPTY} # State dictionary. Initializing to a realistic state for testing in # test_mode. &{default_state} power=1 ... bmc=HOST_BOOTED ... boot_progress=FW Progress, Starting OS ... os_ping=1 ... os_login=1 ... os_run_cmd=1 &{state} &{default_state} # Flag variables. ${cp_setup_called} ${0} # test_really_running is needed by DB_Logging plug-in. ${test_really_running} ${1} *** Test Cases *** Randomized Boot Testing [Documentation] Performs random, repeated boots. [Tags] Randomized_boot_testing # Call the Main keyword to prevent any dots from appearing in the console # due to top level keywords. Main *** Keywords *** ############################################################################### Main [Teardown] Program Teardown Setup :For ${BOOT_COUNT} IN RANGE ${max_num_tests} \ Test Loop Body ${BOOT_COUNT} Rprint Timen Completed all requested boot tests. ############################################################################### ############################################################################### Setup [Documentation] Do general program setup tasks. Rprintn Validate Parms Rqprint Pgm Header Create Boot Results Table # Preserve the values of boot_pass/boot_fail that were passed in. Set Global Variable ${initial_boot_pass} ${boot_pass} Set Global Variable ${initial_boot_fail} ${boot_fail} # Call "setup" plug-ins, if any. Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=setup Should Be Equal '${rc}' '${0}' # Keyword "FFDC" will fail if TEST_MESSAGE is not set. Set Global Variable ${TEST_MESSAGE} ${EMPTY} # Setting cp_setup_called lets our Teardown know that it needs to call # the cleanup plug-in call point. Set Global Variable ${cp_setup_called} ${1} Rqprint Timen Getting system state. # The state dictionary must be primed before calling Test Loop Body. ${temp_state}= Run Keyword If '${test_mode}' == '0' Get State ... ELSE Create Dictionary &{default_state} Set Global Variable &{state} &{temp_state} rpvars state ############################################################################### ############################################################################### Validate Parms [Documentation] Validate all program parameters. rprintn Rvalid Value AVAIL_BOOTS Rvalid Value openbmc_host Rvalid Value openbmc_username Rvalid Value openbmc_password # os_host is optional so no validation is being done. Run Keyword If '${OS_HOST}' != '${EMPTY}' Run Keywords ... Rvalid Value os_username AND ... Rvalid Value os_password Rvalid Value pdu_host Rvalid Value pdu_username Rvalid Value pdu_password Rvalid Integer pdu_slot_no Rvalid Value openbmc_serial_host Rvalid Integer openbmc_serial_port Rvalid Integer max_num_tests Rvalid Value openbmc_model Rvalid Integer boot_pass Rvalid Integer boot_fail ${boot_pass_temp}= Convert To Integer ${boot_pass} Set Global Variable ${boot_pass} ${boot_pass_temp} ${boot_fail_temp}= Convert To Integer ${boot_fail} Set Global Variable ${boot_fail} ${boot_fail_temp} ${temp_arr}= Rvalidate Plug Ins ${plug_in_dir_paths} Set Global Variable @{plug_in_packages_list} @{temp_arr} Set FFDC Dir Path Style ############################################################################### ############################################################################### Set FFDC Dir Path Style Run Keyword If '${ffdc_dir_path_style}' != '${EMPTY}' Return from Keyword ${temp}= Run Keyword and Continue On Failure Get Environment Variable ... FFDC_DIR_PATH_STYLE ${0} Set Global Variable ${ffdc_dir_path_style} ${temp} ############################################################################### ############################################################################### Program Teardown [Documentation] Clean up after this program. Run Keyword If '${cp_setup_called}' == '1' Run Keywords ... Plug In Setup AND ... Rprocess Plug In Packages call_point=cleanup ... stop_on_plug_in_failure=1 Rqprint Pgm Footer ############################################################################### ############################################################################### Test Loop Body [Documentation] The main loop body for the loop in "main". [Arguments] ${BOOT_COUNT} Rqprintn Rqprint Timen Starting boot ${BOOT_COUNT+1} of ${max_num_tests}. ${loc_next_boot}= Select Boot ${state['power']} Set Global Variable ${next_boot} ${loc_next_boot} ${status} ${msg}= Run Keyword And Ignore Error Run Boot ${next_boot} Run Keyword If '${status}' == 'FAIL' rprint ${msg} rprintn Run Keyword If '${BOOT_STATUS}' == 'PASS' Run Keywords ... Set Global Variable ${boot_success} ${1} AND ... Rqprint Timen BOOT_SUCCESS: "${next_boot}" succeeded. ... ELSE Run Keywords ... Set Global Variable ${boot_success} ${0} AND ... Rqprint Timen BOOT_FAILED: ${next_boot} failed. Update Boot Results Table ${next_boot} ${BOOT_STATUS} # NOTE: A post_test_case call point failure is NOT counted as a boot # failure. Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=post_test_case stop_on_plug_in_failure=1 Run Keyword If '${BOOT_STATUS}' != 'PASS' or '${FFDC_CHECK}' == 'All' ... Run Keyword and Continue On Failure My FFDC # Run plug-ins to see if we ought to stop execution. Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=stop_check Run Keyword If '${rc}' != '${0}' Run Keywords ... Rprint Error Report Stopping as requested by user. ... Fail Print Boot Results Table Rqprint Timen Finished boot ${BOOT_COUNT+1} of ${max_num_tests}. Rqprint Timen Getting system state. # The state must be refreshed before calling Test Loop Body again. ${temp_state}= Run Keyword If '${test_mode}' == '0' Get State ... quiet=${1} ... ELSE Create Dictionary &{default_state} Set Global Variable &{state} &{temp_state} rpvars state ############################################################################### ############################################################################### Select Boot [Documentation] Select a boot test to be run based on our current state. ... Return the chosen boot type. [Arguments] ${power} # power The power state of the machine, either zero or one. ${boot}= Run Keyword If ${power} == ${0} Select Power On ... ELSE Run Keyword If ${power} == ${1} Select Power Off ... ELSE Run Keywords Log to Console ... **ERROR** BMC not in state to power on or off: "${power}" AND ... Fatal Error [Return] ${boot} ############################################################################### ############################################################################### Select Power On [Documentation] Randomly chooses a boot from the list of Power On boots. @{power_on_choices}= Intersect Lists ${VALID_POWER_ON} ${AVAIL_BOOTS} ${length}= Get Length ${power_on_choices} # Currently selects the first boot in the list of options, rather than # selecting randomly. ${chosen}= Set Variable @{power_on_choices}[0] [Return] ${chosen} ############################################################################### ############################################################################### Select Power Off [Documentation] Randomly chooses an boot from the list of Power Off boots. @{power_off_choices}= Intersect Lists ${VALID_POWER_OFF} ${AVAIL_BOOTS} ${length}= Get Length ${power_off_choices} # Currently selects the first boot in the list of options, rather than # selecting randomly. ${chosen}= Set Variable @{power_off_choices}[0] [Return] ${chosen} ############################################################################### ############################################################################### Run Boot [Documentation] Run the selected boot and mark the status when complete. [Arguments] ${boot_keyword} [Teardown] Set Global Variable ${BOOT_STATUS} ${KEYWORD STATUS} # boot_keyword The name of the boot to run, which corresponds to the # keyword to run. (i.e "BMC Power On") Print Test Start Message ${boot_keyword} Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=pre_boot Should Be Equal '${rc}' '${0}' @{cmd_buf}= Create List ${boot_keyword} rqpissuing_keyword ${cmd_buf} ${test_mode} Run Keyword If '${test_mode}' == '0' Run Keyword @{cmd_buf} Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=post_boot Should Be Equal '${rc}' '${0}' ############################################################################### ############################################################################### Print Test Start Message [Documentation] Print a message indicating what boot test is about to run. [Arguments] ${boot_keyword} ${doing_msg}= Sprint Timen Doing "${boot_keyword}". rqprint ${doing_msg} Append to List ${LAST_TEN} ${doing_msg} ${length}= Get Length ${LAST_TEN} Run Keyword If '${length}' > '${10}' Remove From List ${LAST_TEN} 0 ############################################################################### ############################################################################### My FFDC [Documentation] Collect FFDC data. # FFDC_LOG_PATH is used by "FFDC" keyword. Set Global Variable ${FFDC_LOG_PATH} ${FFDC_DIR_PATH} @{cmd_buf}= Create List FFDC rqpissuing_keyword ${cmd_buf} ${test_mode} Run Keyword If '${test_mode}' == '0' @{cmd_buf} Plug In Setup ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages ... call_point=ffdc stop_on_plug_in_failure=1 Log Defect Information ############################################################################### ############################################################################### Log Defect Information [Documentation] Logs information needed for a defect. This information ... can also be found within the FFDC gathered. Rqprintn # indent=0, width=90, linefeed=1, char="=" Rqprint Dashes ${0} ${90} ${1} = Rqprintn Copy this data to the defect: Rqprintn Rqpvars @{parm_list} Print Last Ten Boots ${rc} ${output}= Run Keyword If '${test_mode}' == '0' ... Run and return RC and Output ls ${LOG_PREFIX}* ... ELSE Set Variable ${0} ${EMPTY} Run Keyword If '${rc}' != '${0}' and '${rc}' != 'None' rqpvars rc Rqprintn Rqprintn FFDC data files: Rqprintn ${output} Rqprintn Rqprint Dashes ${0} ${90} ${1} = ############################################################################### ############################################################################### Print Last Ten Boots [Documentation] Logs the last ten boots that were performed with their ... starting time stamp. # indent 0, 90 chars wide, linefeed, char is "=" Rqprint Dashes ${0} ${90} Rqprintn Last 10 boots: Rqprintn :FOR ${boot_entry} IN @{LAST_TEN} \ rqprint ${boot_entry} Rqprint Dashes ${0} ${90} ###############################################################################