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