1*** Settings *** 2Documentation Methods to execute commands on BMC and collect 3... data to a list of FFDC files 4 5Resource openbmc_ffdc_utils.robot 6Resource rest_client.robot 7Resource utils.robot 8Resource list_utils.robot 9Resource logging_utils.robot 10Resource bmc_redfish_resource.robot 11Library SSHLibrary 12Library OperatingSystem 13Library Collections 14Library String 15Library gen_print.py 16Library gen_cmd.py 17Library gen_robot_keyword.py 18Library dump_utils.py 19Library logging_utils.py 20 21*** Variables *** 22 23${FFDC_CMD_TIMEOUT} 240 24${FFDC_BMC_FILES_CLEANUP} rm -rf /tmp/BMC_* /tmp/PEL_* /tmp/PLDM_* 25... /tmp/OCC_* /tmp/fan_* /tmp/GUARD_* /tmp/DEVTREE 26 27*** Keywords *** 28 29# Method : Call FFDC Methods # 30# Execute the user define keywords from the FFDC List # 31# Unlike any other keywords this will call into the # 32# list of keywords defined in the FFDC list at one go # 33 34Call FFDC Methods 35 [Documentation] Call into FFDC Keyword index list. 36 [Arguments] ${ffdc_function_list}=${EMPTY} 37 38 # Description of argument(s): 39 # ffdc_function_list A colon-delimited list naming the kinds of FFDC that 40 # are to be collected 41 # (e.g. "FFDC Generic Report:BMC Specific Files"). 42 # Acceptable values can be found in the description 43 # field of FFDC_METHOD_CALL in 44 # lib/openbmc_ffdc_list.py. Those values can be 45 # obtained via a call to 'Get FFDC Method Desc' (also 46 # from lib/openbmc_ffdc_list.py). 47 48 @{entries}= Get FFDC Method Index 49 # Example entries: 50 # entries: 51 # entries[0]: BMC LOGS 52 53 @{ffdc_file_list}= Create List 54 FOR ${index} IN @{entries} 55 ${ffdc_file_sub_list}= Method Call Keyword List ${index} ${ffdc_function_list} 56 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 57 END 58 59 Run Key U SSHLibrary.Close All Connections 60 61 [Return] ${ffdc_file_list} 62 63 64Method Call Keyword List 65 [Documentation] Process FFDC request and return a list of generated files. 66 [Arguments] ${index} ${ffdc_function_list}=${EMPTY} 67 68 # Description of argument(s): 69 # index The index into the FFDC_METHOD_CALL dictionary (e.g. 70 # 'BMC LOGS'). 71 # ffdc_function_list See ffdc_function_list description in 72 # "Call FFDC Methods" (above). 73 74 @{method_list}= Get FFDC Method Call ${index} 75 # Example method_list: 76 # method_list: 77 # method_list[0]: 78 # method_list[0][0]: FFDC Generic Report 79 # method_list[0][1]: BMC FFDC Manifest 80 # method_list[1]: 81 # method_list[1][0]: Get Request FFDC 82 # method_list[1][1]: BMC FFDC Get Requests 83 # (etc.) 84 85 # If function list is empty assign default (i.e. a list of all allowable 86 # values). In either case, convert ffdc_function_list from a string to 87 # a list. 88 @{ffdc_function_list}= 89 ... Run Keyword If '${ffdc_function_list}' == '${EMPTY}' 90 ... Get FFDC Method Desc ${index} 91 ... ELSE 92 ... Split String ${ffdc_function_list} separator=: 93 94 @{ffdc_file_list}= Create List 95 FOR ${method} IN @{method_list} 96 ${ffdc_file_sub_list}= Execute Keyword Method ${method[0]} ${method[1]} @{ffdc_function_list} 97 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 98 END 99 100 [Return] ${ffdc_file_list} 101 102 103Execute Keyword Method 104 [Documentation] Call into BMC method keywords. Don't let one 105 ... failure skip the remaining. Get whatever data 106 ... it could gather at worse case scenario. 107 [Arguments] ${description} ${keyword_name} @{ffdc_function_list} 108 109 # Description of argument(s): 110 # description The description of the FFDC to be collected. This 111 # would be any value returned by 112 # 'Get FFDC Method Desc' (e.g. "FFDC Generic Report"). 113 # keyword_name The name of the keyword to call to collect the FFDC 114 # data (again, see FFDC_METHOD_CALL). 115 # ffdc_function_list See ffdc_function_list description in 116 # "Call FFDC Methods" (above). The only difference is 117 # in this case, it should be a list rather than a 118 # colon-delimited value. 119 120 @{ffdc_file_list}= Create List 121 122 ${index}= Get Index From List ${ffdc_function_list} ${description} 123 Run Keyword If '${index}' == '${-1}' Return from Keyword 124 ... ${ffdc_file_list} 125 126 ${status} ${ffdc_file_list}= Run Key ${keyword_name} ignore=1 127 [Return] ${ffdc_file_list} 128 129 130BMC FFDC Cleanup 131 [Documentation] Run the ssh commands from FFDC_BMC_FILES_CLEANUP. 132 133 Log To Console BMC FFDC Files clean up: ${FFDC_BMC_FILES_CLEANUP} 134 BMC Execute Command ${FFDC_BMC_FILES_CLEANUP} ignore_err=1 135 136 137# Method : BMC FFDC Manifest # 138# Execute command on BMC and write to ffdc_report.txt # 139 140BMC FFDC Manifest 141 [Documentation] Run the ssh commands from FFDC_BMC_CMD and return a list 142 ... of generated files. 143 144 @{ffdc_file_list}= Create List ${FFDC_FILE_PATH} 145 @{entries}= Get FFDC Cmd Index 146 147 FOR ${index} IN @{entries} 148 Iterate BMC Command List Pairs ${index} 149 END 150 151 [Return] ${ffdc_file_list} 152 153 154Iterate BMC Command List Pairs 155 [Documentation] Feed in key pair list from dictionary to execute 156 [Arguments] ${key_index} 157 158 @{cmd_list}= Get ffdc bmc cmd ${key_index} 159 Set Suite Variable ${ENTRY_INDEX} ${key_index} 160 161 FOR ${cmd} IN @{cmd_list} 162 Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} 163 END 164 165Execute Command and Write FFDC 166 [Documentation] Run a command on the BMC or OS, write the output to the 167 ... specified file and return a list of generated files. 168 [Arguments] ${key_index} ${cmd} ${logpath}=${FFDC_FILE_PATH} 169 ... ${target}=BMC 170 171 Run Keyword If '${logpath}' == '${FFDC_FILE_PATH}' 172 ... Write Cmd Output to FFDC File ${key_index} ${cmd} 173 174 @{ffdc_file_list}= Create List ${log_path} 175 176 ${cmd_buf}= Catenate ${target} Execute Command \ ${cmd} \ ignore_err=${1} 177 ... \ time_out=${FFDC_CMD_TIMEOUT} 178 ${status} ${ret_values}= Run Key ${cmd_buf} ignore=${1} 179 # If the command times out, status will be 'FAIL'. 180 Return From Keyword If '${status}' == 'FAIL' ${ffdc_file_list} 181 182 ${stdout}= Set Variable ${ret_values}[0] 183 ${stderr}= Set Variable ${ret_values}[1] 184 185 # Write stdout on success and stderr/stdout to the file on failure. 186 Run Keyword If $stderr == '${EMPTY}' 187 ... Write Data To File ${stdout}${\n} ${logpath} 188 ... ELSE Write Data To File 189 ... ERROR output:${\n}${stderr}${\n}Output:${\n}${stdout}${\n} 190 ... ${logpath} 191 192 [Return] ${ffdc_file_list} 193 194 195# Method : BMC FFDC Files # 196# Execute command on BMC and write to individual file # 197# based on the file name pre-defined in the list # 198 199BMC FFDC Files 200 [Documentation] Run the commands from FFDC_BMC_FILE and return a list of 201 ... generated files. 202 203 @{entries}= Get FFDC File Index 204 # Example of entries: 205 # entries: 206 # entries[0]: BMC FILES 207 208 scp.Open Connection 209 ... ${OPENBMC_HOST} username=${OPENBMC_USERNAME} password=${OPENBMC_PASSWORD} port=${SSH_PORT} 210 211 @{ffdc_file_list}= Create List 212 213 FOR ${index} IN @{entries} 214 ${ffdc_file_sub_list}= Create File and Write Data ${index} 215 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 216 END 217 218 BMC Execute Command rm -rf /tmp/BMC_* 219 scp.Close Connection 220 221 [Return] ${ffdc_file_list} 222 223 224Create File and Write Data 225 [Documentation] Run commands from FFDC_BMC_FILE to create FFDC files and 226 ... return a list of generated files. 227 [Arguments] ${key_index} 228 229 # Description of argument(s): 230 # key_index The index into the FFDC_BMC_FILE dictionary. 231 232 @{ffdc_file_list}= Create List 233 @{cmd_list}= Get FFDC BMC File ${key_index} 234 235 FOR ${cmd} IN @{cmd_list} 236 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 237 ${ffdc_file_sub_list}= Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} 238 Run Key U scp.Get File \ /tmp/${cmd[0]} \ ${LOG_PREFIX}${cmd[0]} ignore=1 239 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 240 END 241 242 [Return] ${ffdc_file_list} 243 244 245# Method : Log Test Case Status # 246# Creates test result history footprint for reference # 247 248Log Test Case Status 249 [Documentation] Test case execution result history. 250 ... Create once and append to this file 251 ... logs/test_history.txt 252 ... Format Date:Test suite:Test case:Status 253 ... 20160909214053719992:Test Warmreset:Test WarmReset via REST:FAIL 254 255 ${FFDC_DIR_PATH_STYLE}= Get Variable Value ${FFDC_DIR_PATH_STYLE} 256 ... ${EMPTY} 257 ${FFDC_DIR_PATH}= Get Variable Value ${FFDC_DIR_PATH} ${EMPTY} 258 259 Run Keyword If '${FFDC_DIR_PATH}' == '${EMPTY}' Set FFDC Defaults 260 261 Run Keyword If '${FFDC_DIR_PATH_STYLE}' == '${1}' Run Keywords 262 ... Set Global Variable ${FFDC_LOG_PATH} ${FFDC_DIR_PATH} AND 263 ... Set Global Variable ${TEST_HISTORY} ${FFDC_DIR_PATH}test_history.txt 264 265 Create Directory ${FFDC_LOG_PATH} 266 267 ${exist}= Run Keyword and Return Status 268 ... OperatingSystem.File Should Exist ${TEST_HISTORY} 269 270 Run Keyword If '${exist}' == '${False}' 271 ... Create File ${TEST_HISTORY} 272 273 Rpvars TEST_HISTORY 274 275 ${cur_time}= Get Current Time Stamp 276 277 Append To File ${TEST_HISTORY} 278 ... ${cur_time}:${SUITE_NAME}:${TEST_NAME}:${TEST_STATUS}${\n} 279 280 281Log FFDC Get Requests 282 [Documentation] Run the get requests associated with the key and return a 283 ... list of generated files. 284 [Arguments] ${key_index} 285 286 # Note: Output will be in JSON pretty_print format. 287 288 # Description of argument(s): 289 # key_index The key to the FFDC_GET_REQUEST dictionary that contains the 290 # get requests that are to be run. 291 292 @{ffdc_file_list}= Create List 293 @{cmd_list}= Get FFDC Get Request ${key_index} 294 295 FOR ${cmd} IN @{cmd_list} 296 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 297 ${resp}= OpenBMC Get Request ${cmd[1]} quiet=${1} timeout=${30} 298 ${status}= Run Keyword and Return Status Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 299 Run Keyword If '${status}' == '${False}' Continue For Loop 300 ${jsondata}= to json ${resp.content} pretty_print=True 301 Write Data To File ${\n}${jsondata}${\n} ${logpath} 302 Append To List ${ffdc_file_list} ${logpath} 303 END 304 305 [Return] ${ffdc_file_list} 306 307 308Log FFDC Get Redfish Requests 309 [Documentation] Run the get requests associated with the key and return a 310 ... list of generated files. 311 [Arguments] ${key_index} 312 313 # Note: Output will be in JSON pretty_print format. 314 315 # Description of argument(s): 316 # key_index The key to the FFDC_GET_REDFISH_REQUEST dictionary that contains the 317 # get requests that are to be run. 318 319 @{ffdc_file_list}= Create List 320 @{cmd_list}= Get FFDC Get Redfish Request ${key_index} 321 322 FOR ${cmd} IN @{cmd_list} 323 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 324 ${resp}= Redfish.Get ${cmd[1]} 325 Write Data To File ${\n}${resp}${\n} ${logpath} 326 Append To List ${ffdc_file_list} ${logpath} 327 END 328 329 [Return] ${ffdc_file_list} 330 331 332BMC FFDC Get Requests 333 [Documentation] Iterate over get request list and return a list of 334 ... generated files. 335 336 @{ffdc_file_list}= Create List 337 338 @{entries}= Get ffdc get request index 339 # Example of entries: 340 # entries: 341 # entries[0]: GET REQUESTS 342 343 FOR ${index} IN @{entries} 344 ${ffdc_file_sub_list}= Log FFDC Get Requests ${index} 345 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 346 END 347 348 [Return] ${ffdc_file_list} 349 350 351BMC FFDC Get Redfish Requests 352 [Documentation] Iterate over get request list and return a list of 353 ... generated files. 354 355 @{ffdc_file_list}= Create List 356 357 @{entries}= Get ffdc get redfish request index 358 # Example of entries: 359 # entries: 360 # entries[0]: GET REQUESTS 361 362 FOR ${index} IN @{entries} 363 ${ffdc_file_sub_list}= Log FFDC Get Redfish Requests ${index} 364 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 365 END 366 367 [Return] ${ffdc_file_list} 368 369 370Log OS All distros FFDC 371 [Documentation] Run commands from FFDC_OS_ALL_DISTROS_FILE to create FFDC 372 ... files and return a list of generated files. 373 [Arguments] ${key_index} 374 375 # Description of argument(s): 376 # key_index The index into the FFDC_OS_ALL_DISTROS_FILE dictionary. 377 378 @{ffdc_file_list}= Create List 379 380 @{cmd_list}= Get FFDC OS All Distros Call ${key_index} 381 382 FOR ${cmd} IN @{cmd_list} 383 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 384 ${ffdc_file_sub_list}= Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} target=OS 385 # scp it to the LOG_PREFIX ffdc directory. 386 Run Key U scp.Get File \ /tmp/${cmd[0]} \ ${LOG_PREFIX}${cmd[0]} ignore=1 387 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 388 END 389 390 [Return] ${ffdc_file_list} 391 392 393Log OS SPECIFIC DISTRO FFDC 394 [Documentation] Run commands from the FFDC_OS_<distro>_FILE to create FFDC 395 ... files and return a list of generated files. 396 [Arguments] ${key_index} ${linux_distro} 397 398 # Description of argument(s): 399 # key_index The index into the FFDC_OS_<distro>_FILE dictionary. 400 # linux_distro Your OS's linux distro (e.g. "UBUNTU", "RHEL", etc). 401 402 Log To Console Collecting log for ${linux_distro} 403 404 @{ffdc_file_list}= Create List 405 406 @{cmd_list}= Get FFDC OS Distro Call ${key_index} ${linux_distro} 407 408 FOR ${cmd} IN @{cmd_list} 409 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 410 ${ffdc_file_sub_list}= Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} target=OS 411 Run Key U scp.Get File \ /tmp/${cmd[0]} \ ${LOG_PREFIX}${cmd[0]} ignore=1 412 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 413 END 414 415 # Get the name of the sosreport file. 416 ${sosreport_file_path} ${stderr} ${rc}= OS Execute Command 417 ... ls /tmp/sosreport*FFDC*tar.xz ignore_err=${True} 418 # Example: sosreport_file_path="/tmp/sosreport-myhost-FFDC-2019-08-20-pbuaqtk.tar.xz". 419 420 # Return if there is no sosreport file. 421 Return From Keyword If ${rc} != ${0} ${ffdc_file_list} 422 423 ${sosreport_dir_path} ${sosreport_file_name}= Split Path ${sosreport_file_path} 424 # Example: sosreport_dir_path="/tmp", 425 # sosreport_file_name="sosreport-myhost-FFDC-2019-08-20-pbuaqtk.tar.xz". 426 427 # Location where the sosreport file will be copied to. 428 ${local_sosreport_file_path}= Set Variable ${LOG_PREFIX}OS_${sosreport_file_name} 429 430 # Change file permissions otherwise scp will not see the file. 431 OS Execute Command chmod 644 ${sosreport_file_path} 432 433 # SCP the sosreport file from the OS. 434 Run Key U scp.Get File \ ${sosreport_file_path} \ ${local_sosreport_file_path} ignore=1 435 436 # Add the file location to the ffdc_file_list. 437 Append To List ${ffdc_file_list} ${local_sosreport_file_path} 438 439 [Return] ${ffdc_file_list} 440 441 442OS FFDC Files 443 [Documentation] Run the commands from FFDC_OS_ALL_DISTROS_FILE to create 444 ... FFDC files and return a list of generated files. 445 [Arguments] ${OS_HOST}=${OS_HOST} ${OS_USERNAME}=${OS_USERNAME} 446 ... ${OS_PASSWORD}=${OS_PASSWORD} 447 448 @{ffdc_file_list}= Create List 449 450 Run Keyword If '${OS_HOST}' == '${EMPTY}' Run Keywords 451 ... Print Timen No OS Host provided so no OS FFDC will be done. AND 452 ... Return From Keyword ${ffdc_file_list} 453 454 ${match_state}= Create Dictionary os_ping=^1$ os_login=^1$ 455 ... os_run_cmd=^1$ 456 ${status} ${ret_values}= Run Keyword and Ignore Error Check State 457 ... ${match_state} quiet=0 458 459 Run Keyword If '${status}' == 'FAIL' Run Keywords 460 ... Print Timen The OS is not communicating so no OS FFDC will be done.\n 461 ... AND 462 ... Return From Keyword ${ffdc_file_list} 463 464 ${stdout}= OS Distro Type 465 466 Set Global Variable ${linux_distro} ${stdout} 467 468 Rpvars linux_distro 469 470 scp.Open Connection 471 ... ${OS_HOST} username=${OS_USERNAME} password=${OS_PASSWORD} 472 473 @{entries}= Get FFDC OS All Distros Index 474 475 FOR ${index} IN @{entries} 476 ${ffdc_file_sub_list}= Log OS All distros FFDC ${index} 477 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 478 END 479 480 Return From Keyword If 481 ... '${linux_distro}' == '${EMPTY}' or '${linux_distro}' == 'None' 482 ... ${ffdc_file_list} 483 484 @{entries}= Get ffdc os distro index ${linux_distro} 485 486 FOR ${index} IN @{entries} 487 ${ffdc_file_sub_list}= Log OS SPECIFIC DISTRO FFDC ${index} ${linux_distro} 488 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 489 END 490 491 # Delete ffdc files still on OS and close scp. 492 OS Execute Command rm -rf /tmp/OS_* /tmp/sosreport*FFDC* ignore_err=${True} 493 scp.Close Connection 494 495 [Return] ${ffdc_file_list} 496 497 498System Inventory Files 499 [Documentation] Copy systest os_inventory files and return a list of 500 ... generated files.. 501 # The os_inventory files are the result of running 502 # systest/htx_hardbootme_test. If these files exist 503 # they are copied to the FFDC directory. 504 # Global variable ffdc_dir_path is the path name of the 505 # directory they are copied to. 506 507 @{ffdc_file_list}= Create List 508 509 ${globex}= Set Variable os_inventory_*.json 510 511 @{file_list}= OperatingSystem.List Files In Directory . ${globex} 512 513 Copy Files ${globex} ${ffdc_dir_path} 514 515 FOR ${file_name} IN @{file_list} 516 Append To List ${ffdc_file_list} ${ffdc_dir_path}${file_name} 517 END 518 519 Run Keyword and Ignore Error Remove Files ${globex} 520 521 [Return] ${ffdc_file_list} 522 523 524SCP Coredump Files 525 [Documentation] Copy core dump files from BMC to local system and return a 526 ... list of generated file names. 527 528 @{ffdc_file_list}= Create List 529 530 # Check if core dump exist in the /tmp 531 ${core_files} ${stderr} ${rc}= BMC Execute Command ls /tmp/core_* 532 ... ignore_err=${1} 533 Run Keyword If '${rc}' != '${0}' Return From Keyword ${ffdc_file_list} 534 535 @{core_list}= Split String ${core_files} 536 # Copy the core files 537 Run Key U Open Connection for SCP 538 539 FOR ${index} IN @{core_list} 540 ${ffdc_file_path}= Catenate ${LOG_PREFIX}${index.lstrip("/tmp/")} 541 ${status}= Run Keyword and Return Status scp.Get File ${index} ${ffdc_file_path} 542 Run Keyword If '${status}' == '${False}' Continue For Loop 543 Append To List ${ffdc_file_list} ${ffdc_file_path} 544 545 # Remove the file from remote to avoid re-copying on next FFDC call 546 547 BMC Execute Command rm ${index} ignore_err=${1} 548 # I can't find a way to do this: scp.Close Connection 549 550 END 551 552 [Return] ${ffdc_file_list} 553 554 555SCP Dump Files 556 [Documentation] Copy all dump files from BMC to local system. 557 558 # Check if dumps exist 559 ${ffdc_file_list}= Scp Dumps ${FFDC_DIR_PATH} ${FFDC_PREFIX} 560 561 [Return] ${ffdc_file_list} 562 563 564Collect Dump Log 565 [Documentation] Collect dumps from dump entry. 566 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 567 568 Return From Keyword If ${REDFISH_SUPPORT_TRANS_STATE} == ${1} 569 570 ${resp}= OpenBMC Get Request ${DUMP_URI} 571 Run Keyword If '${resp.status_code}' == '${HTTP_NOT_FOUND}' 572 ... Set Test Variable ${DUMP_ENTRY_URI} /xyz/openbmc_project/dump/entry/ 573 574 ${data}= Read Properties ${DUMP_ENTRY_URI}enumerate quiet=${1} timeout=${30} 575 576 # Grab the list of entries from dump/entry/ 577 # The data shown below is the result of the "Get Dictionary Keys". 578 # Example: 579 # /xyz/openbmc_project/dump/entry/1 580 # /xyz/openbmc_project/dump/entry/2 581 582 ${dump_list}= Get Dictionary Keys ${data} 583 584 585Collect PEL Log 586 [Documentation] Collect PEL files from from BMC. 587 588 Create Directory ${FFDC_DIR_PATH}${/}pel_files/ 589 scp.Get File /var/lib/phosphor-logging/extensions/pels/logs/ 590 ... ${FFDC_DIR_PATH}${/}pel_files recursive=True 591 592 593Enumerate Redfish Resources 594 [Documentation] Enumerate /redfish/v1 resources and properties to 595 ... a file. Return a list which contains the file name. 596 [Arguments] ${log_prefix_path}=${LOG_PREFIX} ${enum_uri}=/redfish/v1 597 ... ${file_enum_name}=redfish_resource_properties.txt 598 599 # Description of argument(s): 600 # log_prefix_path The location specifying where to create FFDC file(s). 601 602 # Login is needed to fetch Redfish information. 603 # If login fails, return from keyword. 604 ${status}= Run Keyword And Return Status Redfish.Login 605 Return From Keyword If ${status} == ${False} 606 607 # Get the Redfish resources and properties. 608 ${json_data}= redfish_utils.Enumerate Request ${enum_uri} 609 # Typical output: 610 # { 611 # "@odata.id": "/redfish/v1", 612 # "@odata.type": "#ServiceRoot.v1_1_1.ServiceRoot", 613 # "AccountService": { 614 # "@odata.id": "/redfish/v1/AccountService" 615 # }, 616 # "Chassis": { 617 # "@odata.id": "/redfish/v1/Chassis" 618 # }, 619 # "Id": "RootService", 620 # "JsonSchemas": { 621 # "@odata.id": "/redfish/v1/JsonSchemas" 622 # }, 623 # ..etc... 624 # } 625 626 @{ffdc_file_list}= Create List 627 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} ${file_enum_name} 628 Create File ${logpath} 629 Write Data To File "${\n}${json_data}${\n}" ${logpath} 630 631 Append To List ${ffdc_file_list} ${logpath} 632 633 [Return] ${ffdc_file_list} 634 635 636Enumerate Redfish OEM Resources 637 [Documentation] Enumerate /<oem>/v1 resources and properties to 638 ... a file. Return a list which contains the file name. 639 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 640 641 # Description of argument(s): 642 # log_prefix_path The location specifying where to create FFDC file(s). 643 644 # No-op by default if input is not supplied from command line. 645 Return From Keyword If "${OEM_REDFISH_PATH}" == "${EMPTY}" 646 647 # Login is needed to fetch Redfish information. 648 # If login fails, return from keyword. 649 ${status}= Run Keyword And Return Status Redfish.Login 650 Return From Keyword If ${status} == ${False} 651 652 # Get the Redfish resources and properties. 653 ${json_data}= redfish_utils.Enumerate Request ${OEM_REDFISH_PATH} 654 655 @{ffdc_file_list}= Create List 656 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} 657 ... redfish_oem_resource_properties.txt 658 Create File ${logpath} 659 Write Data To File "${\n}${json_data}${\n}" ${logpath} 660 661 Append To List ${ffdc_file_list} ${logpath} 662 663 [Return] ${ffdc_file_list} 664 665 666Collect eSEL Log 667 [Documentation] Create raw and formatted eSEL files. 668 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 669 670 # NOTE: If no eSEL.pl program can be located, then no formatted eSEL file 671 # will be generated. 672 673 # Description of argument(s): 674 # log_prefix_path The path prefix to be used in creating 675 # eSEL file path names. For example, if 676 # log_prefix_path is 677 # "/tmp/user1/dummy.181001.120000.", then 678 # this keyword will create 679 # /tmp/user1/dummy.181001.120000.esel (raw) 680 # and 681 # /tmp/user1/dummy.181001.120000.esel.txt 682 # (formatted). 683 684 @{ffdc_file_list}= Create List 685 686 ${esels}= Get Esels 687 ${num_esels}= Evaluate len(${esels}) 688 Rprint Vars num_esels 689 Return From Keyword If ${num_esels} == ${0} ${ffdc_file_list} 690 691 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} esel 692 Create File ${logpath} 693 694 FOR ${esel} IN @{esels} 695 Write Data To File "${esel}"${\n} ${logpath} 696 END 697 698 Append To List ${ffdc_file_list} ${logpath} 699 700 ${rc} ${output}= Shell Cmd which eSEL.pl show_err=0 701 Return From Keyword If ${rc} != ${0} ${ffdc_file_list} 702 703 Convert eSEL To Elog Format ${logpath} 704 Append To List ${ffdc_file_list} ${logpath}.txt 705 706 [Return] ${ffdc_file_list} 707 708 709Convert eSEL To Elog Format 710 [Documentation] Execute parser tool on the eSEL data file to generate 711 ... formatted error log. 712 [Arguments] ${esel_file_path} 713 # Description of argument(s): 714 # esel_file_path The path to the file containing raw eSEL 715 # data (e.g. 716 # "/tmp/user1/dummy.181001.120000.esel"). 717 718 # Note: The only way to get eSEL.pl to put the output in a particular 719 # directory is to cd to that directory. 720 ${cmd_buf}= Catenate cd $(dirname ${esel_file_path}) ; eSEL.pl -l 721 ... ${esel_file_path} -p decode_obmc_data 722 Qprint Issuing ${cmd_buf} 723 Run ${cmd_buf} 724 # The .binary file, which is generated by eSEL.pl, is of no use to us. 725 Remove File ${esel_file_path}.binary 726 727 728OS Distro Type 729 [Documentation] Determine the host partition distro type 730 731 ${stdout} ${stderr} ${rc}= OS Execute Command 732 ... . /etc/os-release; echo $ID ignore_err=${1} 733 734 Return From Keyword If ${rc} == ${0} ${stdout} 735 736 # If linux distro doesn't have os-release, check for uname. 737 ${stdout} ${stderr} ${rc}= OS Execute Command uname ignore_err=${0} 738 739 [Return] ${stdout} 740