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 Write Data To File ${\n}${resp.json()}${\n} ${logpath} 301 Append To List ${ffdc_file_list} ${logpath} 302 END 303 304 [Return] ${ffdc_file_list} 305 306 307Log FFDC Get Redfish Requests 308 [Documentation] Run the get requests associated with the key and return a 309 ... list of generated files. 310 [Arguments] ${key_index} 311 312 # Note: Output will be in JSON pretty_print format. 313 314 # Description of argument(s): 315 # key_index The key to the FFDC_GET_REDFISH_REQUEST dictionary that contains the 316 # get requests that are to be run. 317 318 @{ffdc_file_list}= Create List 319 @{cmd_list}= Get FFDC Get Redfish Request ${key_index} 320 321 FOR ${cmd} IN @{cmd_list} 322 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 323 ${resp}= Redfish.Get ${cmd[1]} 324 Write Data To File ${\n}${resp}${\n} ${logpath} 325 Append To List ${ffdc_file_list} ${logpath} 326 END 327 328 [Return] ${ffdc_file_list} 329 330 331BMC FFDC Get Requests 332 [Documentation] Iterate over get request list and return a list of 333 ... generated files. 334 335 @{ffdc_file_list}= Create List 336 337 @{entries}= Get ffdc get request index 338 # Example of entries: 339 # entries: 340 # entries[0]: GET REQUESTS 341 342 FOR ${index} IN @{entries} 343 ${ffdc_file_sub_list}= Log FFDC Get Requests ${index} 344 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 345 END 346 347 [Return] ${ffdc_file_list} 348 349 350BMC FFDC Get Redfish Requests 351 [Documentation] Iterate over get request list and return a list of 352 ... generated files. 353 354 @{ffdc_file_list}= Create List 355 356 @{entries}= Get ffdc get redfish request index 357 # Example of entries: 358 # entries: 359 # entries[0]: GET REQUESTS 360 361 FOR ${index} IN @{entries} 362 ${ffdc_file_sub_list}= Log FFDC Get Redfish Requests ${index} 363 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 364 END 365 366 [Return] ${ffdc_file_list} 367 368 369Log OS All distros FFDC 370 [Documentation] Run commands from FFDC_OS_ALL_DISTROS_FILE to create FFDC 371 ... files and return a list of generated files. 372 [Arguments] ${key_index} 373 374 # Description of argument(s): 375 # key_index The index into the FFDC_OS_ALL_DISTROS_FILE dictionary. 376 377 @{ffdc_file_list}= Create List 378 379 @{cmd_list}= Get FFDC OS All Distros Call ${key_index} 380 381 FOR ${cmd} IN @{cmd_list} 382 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 383 ${ffdc_file_sub_list}= Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} target=OS 384 # scp it to the LOG_PREFIX ffdc directory. 385 Run Key U scp.Get File \ /tmp/${cmd[0]} \ ${LOG_PREFIX}${cmd[0]} ignore=1 386 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 387 END 388 389 [Return] ${ffdc_file_list} 390 391 392Log OS SPECIFIC DISTRO FFDC 393 [Documentation] Run commands from the FFDC_OS_<distro>_FILE to create FFDC 394 ... files and return a list of generated files. 395 [Arguments] ${key_index} ${linux_distro} 396 397 # Description of argument(s): 398 # key_index The index into the FFDC_OS_<distro>_FILE dictionary. 399 # linux_distro Your OS's linux distro (e.g. "UBUNTU", "RHEL", etc). 400 401 Log To Console Collecting log for ${linux_distro} 402 403 @{ffdc_file_list}= Create List 404 405 @{cmd_list}= Get FFDC OS Distro Call ${key_index} ${linux_distro} 406 407 FOR ${cmd} IN @{cmd_list} 408 ${logpath}= Catenate SEPARATOR= ${LOG_PREFIX} ${cmd[0]} 409 ${ffdc_file_sub_list}= Execute Command and Write FFDC ${cmd[0]} ${cmd[1]} ${logpath} target=OS 410 Run Key U scp.Get File \ /tmp/${cmd[0]} \ ${LOG_PREFIX}${cmd[0]} ignore=1 411 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 412 END 413 414 # Get the name of the sosreport file. 415 ${sosreport_file_path} ${stderr} ${rc}= OS Execute Command 416 ... ls /tmp/sosreport*FFDC*tar.xz ignore_err=${True} 417 # Example: sosreport_file_path="/tmp/sosreport-myhost-FFDC-2019-08-20-pbuaqtk.tar.xz". 418 419 # Return if there is no sosreport file. 420 Return From Keyword If ${rc} != ${0} ${ffdc_file_list} 421 422 ${sosreport_dir_path} ${sosreport_file_name}= Split Path ${sosreport_file_path} 423 # Example: sosreport_dir_path="/tmp", 424 # sosreport_file_name="sosreport-myhost-FFDC-2019-08-20-pbuaqtk.tar.xz". 425 426 # Location where the sosreport file will be copied to. 427 ${local_sosreport_file_path}= Set Variable ${LOG_PREFIX}OS_${sosreport_file_name} 428 429 # Change file permissions otherwise scp will not see the file. 430 OS Execute Command chmod 644 ${sosreport_file_path} 431 432 # SCP the sosreport file from the OS. 433 Run Key U scp.Get File \ ${sosreport_file_path} \ ${local_sosreport_file_path} ignore=1 434 435 # Add the file location to the ffdc_file_list. 436 Append To List ${ffdc_file_list} ${local_sosreport_file_path} 437 438 [Return] ${ffdc_file_list} 439 440 441OS FFDC Files 442 [Documentation] Run the commands from FFDC_OS_ALL_DISTROS_FILE to create 443 ... FFDC files and return a list of generated files. 444 [Arguments] ${OS_HOST}=${OS_HOST} ${OS_USERNAME}=${OS_USERNAME} 445 ... ${OS_PASSWORD}=${OS_PASSWORD} 446 447 @{ffdc_file_list}= Create List 448 449 Run Keyword If '${OS_HOST}' == '${EMPTY}' Run Keywords 450 ... Print Timen No OS Host provided so no OS FFDC will be done. AND 451 ... Return From Keyword ${ffdc_file_list} 452 453 ${match_state}= Create Dictionary os_ping=^1$ os_login=^1$ 454 ... os_run_cmd=^1$ 455 ${status} ${ret_values}= Run Keyword and Ignore Error Check State 456 ... ${match_state} quiet=0 457 458 Run Keyword If '${status}' == 'FAIL' Run Keywords 459 ... Print Timen The OS is not communicating so no OS FFDC will be done.\n 460 ... AND 461 ... Return From Keyword ${ffdc_file_list} 462 463 ${stdout}= OS Distro Type 464 465 Set Global Variable ${linux_distro} ${stdout} 466 467 Rpvars linux_distro 468 469 scp.Open Connection 470 ... ${OS_HOST} username=${OS_USERNAME} password=${OS_PASSWORD} 471 472 @{entries}= Get FFDC OS All Distros Index 473 474 FOR ${index} IN @{entries} 475 ${ffdc_file_sub_list}= Log OS All distros FFDC ${index} 476 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 477 END 478 479 Return From Keyword If 480 ... '${linux_distro}' == '${EMPTY}' or '${linux_distro}' == 'None' 481 ... ${ffdc_file_list} 482 483 @{entries}= Get ffdc os distro index ${linux_distro} 484 485 FOR ${index} IN @{entries} 486 ${ffdc_file_sub_list}= Log OS SPECIFIC DISTRO FFDC ${index} ${linux_distro} 487 ${ffdc_file_list}= Smart Combine Lists ${ffdc_file_list} ${ffdc_file_sub_list} 488 END 489 490 # Delete ffdc files still on OS and close scp. 491 OS Execute Command rm -rf /tmp/OS_* /tmp/sosreport*FFDC* ignore_err=${True} 492 scp.Close Connection 493 494 [Return] ${ffdc_file_list} 495 496 497System Inventory Files 498 [Documentation] Copy systest os_inventory files and return a list of 499 ... generated files.. 500 # The os_inventory files are the result of running 501 # systest/htx_hardbootme_test. If these files exist 502 # they are copied to the FFDC directory. 503 # Global variable ffdc_dir_path is the path name of the 504 # directory they are copied to. 505 506 @{ffdc_file_list}= Create List 507 508 ${globex}= Set Variable os_inventory_*.json 509 510 @{file_list}= OperatingSystem.List Files In Directory . ${globex} 511 512 Copy Files ${globex} ${ffdc_dir_path} 513 514 FOR ${file_name} IN @{file_list} 515 Append To List ${ffdc_file_list} ${ffdc_dir_path}${file_name} 516 END 517 518 Run Keyword and Ignore Error Remove Files ${globex} 519 520 [Return] ${ffdc_file_list} 521 522 523SCP Coredump Files 524 [Documentation] Copy core dump files from BMC to local system and return a 525 ... list of generated file names. 526 527 @{ffdc_file_list}= Create List 528 529 # Check if core dump exist in the /tmp 530 ${core_files} ${stderr} ${rc}= BMC Execute Command ls /tmp/core_* 531 ... ignore_err=${1} 532 Run Keyword If '${rc}' != '${0}' Return From Keyword ${ffdc_file_list} 533 534 @{core_list}= Split String ${core_files} 535 # Copy the core files 536 Run Key U Open Connection for SCP 537 538 FOR ${index} IN @{core_list} 539 ${ffdc_file_path}= Catenate ${LOG_PREFIX}${index.lstrip("/tmp/")} 540 ${status}= Run Keyword and Return Status scp.Get File ${index} ${ffdc_file_path} 541 Run Keyword If '${status}' == '${False}' Continue For Loop 542 Append To List ${ffdc_file_list} ${ffdc_file_path} 543 544 # Remove the file from remote to avoid re-copying on next FFDC call 545 546 BMC Execute Command rm ${index} ignore_err=${1} 547 # I can't find a way to do this: scp.Close Connection 548 549 END 550 551 [Return] ${ffdc_file_list} 552 553 554SCP Dump Files 555 [Documentation] Copy all dump files from BMC to local system. 556 557 # Check if dumps exist 558 ${ffdc_file_list}= Scp Dumps ${FFDC_DIR_PATH} ${FFDC_PREFIX} 559 560 [Return] ${ffdc_file_list} 561 562 563Collect Dump Log 564 [Documentation] Collect dumps from dump entry. 565 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 566 567 Return From Keyword If ${REDFISH_SUPPORT_TRANS_STATE} == ${1} 568 569 ${resp}= OpenBMC Get Request ${DUMP_URI} 570 Run Keyword If '${resp.status_code}' == '${HTTP_NOT_FOUND}' 571 ... Set Test Variable ${DUMP_ENTRY_URI} /xyz/openbmc_project/dump/entry/ 572 573 ${data}= Read Properties ${DUMP_ENTRY_URI}enumerate quiet=${1} timeout=${30} 574 575 # Grab the list of entries from dump/entry/ 576 # The data shown below is the result of the "Get Dictionary Keys". 577 # Example: 578 # /xyz/openbmc_project/dump/entry/1 579 # /xyz/openbmc_project/dump/entry/2 580 581 ${dump_list}= Get Dictionary Keys ${data} 582 583 584Collect PEL Log 585 [Documentation] Collect PEL files from from BMC. 586 587 Create Directory ${FFDC_DIR_PATH}${/}pel_files/ 588 scp.Get File /var/lib/phosphor-logging/extensions/pels/logs/ 589 ... ${FFDC_DIR_PATH}${/}pel_files recursive=True 590 591 592Enumerate Redfish Resources 593 [Documentation] Enumerate /redfish/v1 resources and properties to 594 ... a file. Return a list which contains the file name. 595 [Arguments] ${log_prefix_path}=${LOG_PREFIX} ${enum_uri}=/redfish/v1 596 ... ${file_enum_name}=redfish_resource_properties.txt 597 598 # Description of argument(s): 599 # log_prefix_path The location specifying where to create FFDC file(s). 600 601 # Login is needed to fetch Redfish information. 602 # If login fails, return from keyword. 603 ${status}= Run Keyword And Return Status Redfish.Login 604 Return From Keyword If ${status} == ${False} 605 606 # Get the Redfish resources and properties. 607 ${json_data}= redfish_utils.Enumerate Request ${enum_uri} 608 # Typical output: 609 # { 610 # "@odata.id": "/redfish/v1", 611 # "@odata.type": "#ServiceRoot.v1_1_1.ServiceRoot", 612 # "AccountService": { 613 # "@odata.id": "/redfish/v1/AccountService" 614 # }, 615 # "Chassis": { 616 # "@odata.id": "/redfish/v1/Chassis" 617 # }, 618 # "Id": "RootService", 619 # "JsonSchemas": { 620 # "@odata.id": "/redfish/v1/JsonSchemas" 621 # }, 622 # ..etc... 623 # } 624 625 @{ffdc_file_list}= Create List 626 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} ${file_enum_name} 627 Create File ${logpath} 628 Write Data To File "${\n}${json_data}${\n}" ${logpath} 629 630 Append To List ${ffdc_file_list} ${logpath} 631 632 [Return] ${ffdc_file_list} 633 634 635Enumerate Redfish OEM Resources 636 [Documentation] Enumerate /<oem>/v1 resources and properties to 637 ... a file. Return a list which contains the file name. 638 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 639 640 # Description of argument(s): 641 # log_prefix_path The location specifying where to create FFDC file(s). 642 643 # No-op by default if input is not supplied from command line. 644 Return From Keyword If "${OEM_REDFISH_PATH}" == "${EMPTY}" 645 646 # Login is needed to fetch Redfish information. 647 # If login fails, return from keyword. 648 ${status}= Run Keyword And Return Status Redfish.Login 649 Return From Keyword If ${status} == ${False} 650 651 # Get the Redfish resources and properties. 652 ${json_data}= redfish_utils.Enumerate Request ${OEM_REDFISH_PATH} 653 654 @{ffdc_file_list}= Create List 655 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} 656 ... redfish_oem_resource_properties.txt 657 Create File ${logpath} 658 Write Data To File "${\n}${json_data}${\n}" ${logpath} 659 660 Append To List ${ffdc_file_list} ${logpath} 661 662 [Return] ${ffdc_file_list} 663 664 665Collect eSEL Log 666 [Documentation] Create raw and formatted eSEL files. 667 [Arguments] ${log_prefix_path}=${LOG_PREFIX} 668 669 # NOTE: If no eSEL.pl program can be located, then no formatted eSEL file 670 # will be generated. 671 672 # Description of argument(s): 673 # log_prefix_path The path prefix to be used in creating 674 # eSEL file path names. For example, if 675 # log_prefix_path is 676 # "/tmp/user1/dummy.181001.120000.", then 677 # this keyword will create 678 # /tmp/user1/dummy.181001.120000.esel (raw) 679 # and 680 # /tmp/user1/dummy.181001.120000.esel.txt 681 # (formatted). 682 683 @{ffdc_file_list}= Create List 684 685 ${esels}= Get Esels 686 ${num_esels}= Evaluate len(${esels}) 687 Rprint Vars num_esels 688 Return From Keyword If ${num_esels} == ${0} ${ffdc_file_list} 689 690 ${logpath}= Catenate SEPARATOR= ${log_prefix_path} esel 691 Create File ${logpath} 692 693 FOR ${esel} IN @{esels} 694 Write Data To File "${esel}"${\n} ${logpath} 695 END 696 697 Append To List ${ffdc_file_list} ${logpath} 698 699 ${rc} ${output}= Shell Cmd which eSEL.pl show_err=0 700 Return From Keyword If ${rc} != ${0} ${ffdc_file_list} 701 702 Convert eSEL To Elog Format ${logpath} 703 Append To List ${ffdc_file_list} ${logpath}.txt 704 705 [Return] ${ffdc_file_list} 706 707 708Convert eSEL To Elog Format 709 [Documentation] Execute parser tool on the eSEL data file to generate 710 ... formatted error log. 711 [Arguments] ${esel_file_path} 712 # Description of argument(s): 713 # esel_file_path The path to the file containing raw eSEL 714 # data (e.g. 715 # "/tmp/user1/dummy.181001.120000.esel"). 716 717 # Note: The only way to get eSEL.pl to put the output in a particular 718 # directory is to cd to that directory. 719 ${cmd_buf}= Catenate cd $(dirname ${esel_file_path}) ; eSEL.pl -l 720 ... ${esel_file_path} -p decode_obmc_data 721 Qprint Issuing ${cmd_buf} 722 Run ${cmd_buf} 723 # The .binary file, which is generated by eSEL.pl, is of no use to us. 724 Remove File ${esel_file_path}.binary 725 726 727OS Distro Type 728 [Documentation] Determine the host partition distro type 729 730 ${stdout} ${stderr} ${rc}= OS Execute Command 731 ... . /etc/os-release; echo $ID ignore_err=${1} 732 733 Return From Keyword If ${rc} == ${0} ${stdout} 734 735 # If linux distro doesn't have os-release, check for uname. 736 ${stdout} ${stderr} ${rc}= OS Execute Command uname ignore_err=${0} 737 738 [Return] ${stdout} 739 740 741Get OS Distro Release Info 742 [Documentation] Get the host partition release info. 743 ${stdout} ${stderr} ${rc}= OS Execute Command 744 ... cat /etc/os-release ignore_err=${1} 745 746 Return From Keyword If ${rc} == ${0} ${stdout} 747 748 # If linux distro doesn't have os-release, check for uname. 749 ${stdout} ${stderr} ${rc}= OS Execute Command uname ignore_err=${0} 750 751 [Return] ${stdout} 752