1*** Settings *** 2Documentation Do random repeated boots based on the state of the BMC machine. 3... The number of repetitions is designated by ${max_num_tests}. Keyword 4... names that are listed in @{AVAIL_BOOTS} become the selection of possible 5... boots for the test. 6 7Resource ../lib/dvt/obmc_driver_vars.txt 8Resource ../lib/list_utils.robot 9Resource ../lib/openbmc_ffdc.robot 10 11Library ../lib/gen_robot_print.py 12Library ../lib/gen_robot_plug_in.py 13Library ../lib/gen_robot_valid.py 14Library ../lib/state.py 15Library ../lib/boot/powerons.py 16Library ../lib/boot/poweroffs.py 17Library ../lib/obmc_boot_test.py 18 19# WITH NAME boot_results 20 21*** Variables *** 22# Initialize program parameters variables. 23# Create parm_list containing all of our program parameters. This is used by 24# 'Rqprint Pgm Header' 25@{parm_list} openbmc_nickname openbmc_host openbmc_username 26... openbmc_password os_host os_username os_password pdu_host 27... pdu_username pdu_password pdu_slot_no openbmc_serial_host 28... openbmc_serial_port boot_stack boot_list max_num_tests 29... plug_in_dir_paths status_file_path openbmc_model boot_pass boot_fail 30... test_mode quiet debug 31 32# Initialize each program parameter. 33${openbmc_nickname} ${EMPTY} 34${openbmc_host} ${EMPTY} 35${openbmc_username} root 36${openbmc_password} 0penBmc 37${os_host} ${EMPTY} 38${os_username} root 39${os_password} P@ssw0rd 40${pdu_host} ${EMPTY} 41${pdu_username} admin 42${pdu_password} admin 43${pdu_slot_no} ${EMPTY} 44${openbmc_serial_host} ${EMPTY} 45${openbmc_serial_port} ${EMPTY} 46${boot_stack} ${EMPTY} 47${boot_list} ${EMPTY} 48${max_num_tests} 0 49${plug_in_dir_paths} ${EMPTY} 50${status_file_path} ${EMPTY} 51${openbmc_model} ${EMPTY} 52# The reason boot_pass and boot_fail are parameters is that it is possible to 53# be called by a program that has already done some tests. This allows us to 54# keep the grand total. 55${boot_pass} ${0} 56${boot_fail} ${0} 57${test_mode} 0 58${quiet} 0 59${debug} 0 60 61# Plug-in variables. 62${shell_rc} 0x00000000 63${fail_on_plug_in_failure} 1 64${return_on_non_zero_rc} 0 65 66${next_boot} ${EMPTY} 67# State dictionary. Initializing to a realistic state for testing in 68# test_mode. 69&{default_state} power=1 70... bmc=HOST_BOOTED 71... boot_progress=FW Progress, Starting OS 72... os_ping=1 73... os_login=1 74... os_run_cmd=1 75&{state} &{default_state} 76 77# Flag variables. 78${cp_setup_called} ${0} 79# test_really_running is needed by DB_Logging plug-in. 80${test_really_running} ${1} 81 82*** Test Cases *** 83Randomized Boot Testing 84 [Documentation] Performs random, repeated boots. 85 [Tags] Randomized_boot_testing 86 87 # Call the Main keyword to prevent any dots from appearing in the console 88 # due to top level keywords. 89 Main 90 91*** Keywords *** 92############################################################################### 93Main 94 [Teardown] Program Teardown 95 96 Setup 97 98 :For ${BOOT_COUNT} IN RANGE ${max_num_tests} 99 \ Test Loop Body ${BOOT_COUNT} 100 101 Rprint Timen Completed all requested boot tests. 102 103############################################################################### 104 105 106############################################################################### 107Setup 108 [Documentation] Do general program setup tasks. 109 110 Rprintn 111 112 Validate Parms 113 114 Rqprint Pgm Header 115 116 Create Boot Results Table 117 118 # Preserve the values of boot_pass/boot_fail that were passed in. 119 Set Global Variable ${initial_boot_pass} ${boot_pass} 120 Set Global Variable ${initial_boot_fail} ${boot_fail} 121 122 # Call "setup" plug-ins, if any. 123 Plug In Setup 124 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 125 ... call_point=setup 126 Should Be Equal '${rc}' '${0}' 127 128 # Keyword "FFDC" will fail if TEST_MESSAGE is not set. 129 Set Global Variable ${TEST_MESSAGE} ${EMPTY} 130 131 # Setting cp_setup_called lets our Teardown know that it needs to call 132 # the cleanup plug-in call point. 133 Set Global Variable ${cp_setup_called} ${1} 134 135 Rqprint Timen Getting system state. 136 # The state dictionary must be primed before calling Test Loop Body. 137 ${temp_state}= Run Keyword If '${test_mode}' == '0' Get State 138 ... ELSE Create Dictionary &{default_state} 139 Set Global Variable &{state} &{temp_state} 140 rpvars state 141 142############################################################################### 143 144 145############################################################################### 146Validate Parms 147 [Documentation] Validate all program parameters. 148 149 rprintn 150 151 Rvalid Value AVAIL_BOOTS 152 Rvalid Value openbmc_host 153 Rvalid Value openbmc_username 154 Rvalid Value openbmc_password 155 # os_host is optional so no validation is being done. 156 Rvalid Value os_username 157 Rvalid Value os_password 158 Rvalid Value pdu_host 159 Rvalid Value pdu_username 160 Rvalid Value pdu_password 161 Rvalid Integer pdu_slot_no 162 Rvalid Value openbmc_serial_host 163 Rvalid Integer openbmc_serial_port 164 Rvalid Integer max_num_tests 165 Rvalid Value openbmc_model 166 Rvalid Integer boot_pass 167 Rvalid Integer boot_fail 168 169 ${boot_pass_temp}= Convert To Integer ${boot_pass} 170 Set Global Variable ${boot_pass} ${boot_pass_temp} 171 ${boot_fail_temp}= Convert To Integer ${boot_fail} 172 Set Global Variable ${boot_fail} ${boot_fail_temp} 173 174 ${temp_arr}= Rvalidate Plug Ins ${plug_in_dir_paths} 175 Set Global Variable @{plug_in_packages_list} @{temp_arr} 176 177############################################################################### 178 179 180############################################################################### 181Program Teardown 182 [Documentation] Clean up after this program. 183 184 Run Keyword If '${cp_setup_called}' == '1' Run Keywords 185 ... Plug In Setup AND 186 ... Rprocess Plug In Packages call_point=cleanup 187 ... stop_on_plug_in_failure=1 188 189 Rqprint Pgm Footer 190 191############################################################################### 192 193 194############################################################################### 195Test Loop Body 196 [Documentation] The main loop body for the loop in "main". 197 [Arguments] ${BOOT_COUNT} 198 199 Rqprintn 200 Rqprint Timen Starting boot ${BOOT_COUNT+1} of ${max_num_tests}. 201 202 ${loc_next_boot}= Select Boot ${state['power']} 203 Set Global Variable ${next_boot} ${loc_next_boot} 204 205 ${status} ${msg}= Run Keyword And Ignore Error Run Boot ${next_boot} 206 Run Keyword If '${status}' == 'FAIL' rprint ${msg} 207 208 rprintn 209 Run Keyword If '${BOOT_STATUS}' == 'PASS' Run Keywords 210 ... Set Global Variable ${boot_success} ${1} AND 211 ... Rqprint Timen BOOT_SUCCESS: "${next_boot}" succeeded. 212 ... ELSE Run Keywords 213 ... Set Global Variable ${boot_success} ${0} AND 214 ... Rqprint Timen BOOT_FAILED: ${next_boot} failed. 215 216 Update Boot Results Table ${next_boot} ${BOOT_STATUS} 217 218 # NOTE: A post_test_case call point failure is NOT counted as a boot 219 # failure. 220 Plug In Setup 221 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 222 ... call_point=post_test_case stop_on_plug_in_failure=1 223 224 Run Keyword If '${BOOT_STATUS}' != 'PASS' 225 ... Run Keyword and Continue On Failure My FFDC 226 227 # Run plug-ins to see if we ought to stop execution. 228 Plug In Setup 229 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 230 ... call_point=stop_check 231 Run Keyword If '${rc}' != '${0}' Run Keywords 232 ... Rprint Error Report Stopping as requested by user. 233 ... Fail 234 235 Print Boot Results Table 236 Rqprint Timen Finished boot ${BOOT_COUNT+1} of ${max_num_tests}. 237 238 Rqprint Timen Getting system state. 239 # The state must be refreshed before calling Test Loop Body again. 240 ${temp_state}= Run Keyword If '${test_mode}' == '0' Get State 241 ... quiet=${1} 242 ... ELSE Create Dictionary &{default_state} 243 Set Global Variable &{state} &{temp_state} 244 rpvars state 245 246############################################################################### 247 248 249############################################################################### 250Select Boot 251 [Documentation] Select a boot test to be run based on our current state. 252 ... Return the chosen boot type. 253 [Arguments] ${power} 254 255 # power The power state of the machine, either zero or one. 256 257 ${boot}= Run Keyword If ${power} == ${0} Select Power On 258 ... ELSE Run Keyword If ${power} == ${1} Select Power Off 259 ... ELSE Run Keywords Log to Console 260 ... **ERROR** BMC not in state to power on or off: "${power}" AND 261 ... Fatal Error 262 263 [return] ${boot} 264 265############################################################################### 266 267 268############################################################################### 269Select Power On 270 [Documentation] Randomly chooses a boot from the list of Power On boots. 271 272 @{power_on_choices}= Intersect Lists ${VALID_POWER_ON} ${AVAIL_BOOTS} 273 274 ${length}= Get Length ${power_on_choices} 275 276 # Currently selects the first boot in the list of options, rather than 277 # selecting randomly. 278 ${chosen}= Set Variable @{power_on_choices}[0] 279 280 [return] ${chosen} 281 282############################################################################### 283 284 285############################################################################### 286Select Power Off 287 [Documentation] Randomly chooses an boot from the list of Power Off boots. 288 289 @{power_off_choices}= Intersect Lists ${VALID_POWER_OFF} ${AVAIL_BOOTS} 290 291 ${length}= Get Length ${power_off_choices} 292 293 # Currently selects the first boot in the list of options, rather than 294 # selecting randomly. 295 ${chosen}= Set Variable @{power_off_choices}[0] 296 297 [return] ${chosen} 298 299############################################################################### 300 301 302############################################################################### 303Run Boot 304 [Documentation] Run the selected boot and mark the status when complete. 305 [Arguments] ${boot_keyword} 306 [Teardown] Set Global Variable ${BOOT_STATUS} ${KEYWORD STATUS} 307 308 # boot_keyword The name of the boot to run, which corresponds to the 309 # keyword to run. (i.e "BMC Power On") 310 311 Print Test Start Message ${boot_keyword} 312 313 Plug In Setup 314 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 315 ... call_point=pre_boot 316 Should Be Equal '${rc}' '${0}' 317 318 @{cmd_buf}= Create List ${boot_keyword} 319 rqpissuing_keyword ${cmd_buf} ${test_mode} 320 Run Keyword If '${test_mode}' == '0' Run Keyword @{cmd_buf} 321 322 Plug In Setup 323 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 324 ... call_point=post_boot 325 Should Be Equal '${rc}' '${0}' 326 327############################################################################### 328 329 330############################################################################### 331Print Test Start Message 332 [Documentation] Print a message indicating what boot test is about to run. 333 [Arguments] ${boot_keyword} 334 335 ${doing_msg}= Sprint Timen Doing "${boot_keyword}". 336 rqprint ${doing_msg} 337 338 Append to List ${LAST_TEN} ${doing_msg} 339 ${length}= Get Length ${LAST_TEN} 340 341 Run Keyword If '${length}' > '${10}' Remove From List ${LAST_TEN} 0 342 343############################################################################### 344 345 346############################################################################### 347My FFDC 348 [Documentation] Collect FFDC data. 349 350 Rqprint Timen FFDC Dump requested. 351 Rqprint Timen Starting dump of FFDC. 352 ${FFDC_DIR_PATH}= Add Trailing Slash ${FFDC_DIR_PATH} 353 # FFDC_LOG_PATH is used by "FFDC" keyword. 354 Set Global Variable ${FFDC_LOG_PATH} ${FFDC_DIR_PATH} 355 356 @{cmd_buf}= Create List FFDC 357 rqpissuing_keyword ${cmd_buf} ${test_mode} 358 Run Keyword If '${test_mode}' == '0' @{cmd_buf} 359 360 Plug In Setup 361 ${rc} ${shell_rc} ${failed_plug_in_name}= Rprocess Plug In Packages 362 ... call_point=ffdc stop_on_plug_in_failure=1 363 364 Rqprint Timen Finished dumping of FFDC. 365 Log FFDC Summary 366 Log Defect Information 367 368############################################################################### 369 370 371############################################################################### 372Log Defect Information 373 [Documentation] Logs information needed for a defect. This information 374 ... can also be found within the FFDC gathered. 375 376 Rqprintn 377 # indent=0, width=90, linefeed=1, char="=" 378 Rqprint Dashes ${0} ${90} ${1} = 379 Rqprintn Copy this data to the defect: 380 Rqprintn 381 382 Rqpvars @{parm_list} 383 Print Last Ten Boots 384 385 ${rc} ${output}= Run Keyword If '${test_mode}' == '0' 386 ... Run and return RC and Output ls ${LOG_PREFIX}* 387 ... ELSE Set Variable ${0} ${EMPTY} 388 389 Run Keyword If '${rc}' != '${0}' and '${rc}' != 'None' rqpvars rc 390 391 Rqprintn 392 Rqprintn FFDC data files: 393 Rqprintn ${output} 394 395 Rqprintn 396 Rqprint Dashes ${0} ${90} ${1} = 397 398############################################################################### 399 400 401############################################################################### 402Print Last Ten Boots 403 [Documentation] Logs the last ten boots that were performed with their 404 ... starting time stamp. 405 406 # indent 0, 90 chars wide, linefeed, char is "=" 407 Rqprint Dashes ${0} ${90} 408 Rqprintn Last 10 boots: 409 Rqprintn 410 :FOR ${boot_entry} IN @{LAST_TEN} 411 \ rqprint ${boot_entry} 412 Rqprint Dashes ${0} ${90} 413 414############################################################################### 415 416 417############################################################################### 418Log FFDC Summary 419 [Documentation] Logs finding from within the FFDC files gathered. 420 421 Rqprint Timen This is where the FFDC summary would go... 422 423############################################################################### 424 425 426