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 dumps if configured to dump on /tmp via /proc/sys/kernel/core_pattern
535    Run Keyword and Ignore Error
536    ...  BMC Execute Command  chown ${OPENBMC_USERNAME}:${OPENBMC_USERNAME} /tmp/core_*
537
538    @{core_list}=  Split String  ${core_files}
539    # Copy the core files
540    Run Key U  Open Connection for SCP
541
542    FOR  ${index}  IN  @{core_list}
543      ${ffdc_file_path}=  Catenate  ${LOG_PREFIX}${index.lstrip("/tmp/")}
544      ${status}=  Run Keyword and Return Status  scp.Get File  ${index}  ${ffdc_file_path}
545      Run Keyword If  '${status}' == '${False}'  Continue For Loop
546      Append To List  ${ffdc_file_list}  ${ffdc_file_path}
547
548      # Remove the file from remote to avoid re-copying on next FFDC call
549
550      BMC Execute Command  rm ${index}  ignore_err=${1}
551      # I can't find a way to do this: scp.Close Connection
552
553    END
554
555    RETURN  ${ffdc_file_list}
556
557
558SCP Dump Files
559    [Documentation]  Copy all dump files from BMC to local system.
560
561    # Check if dumps exist
562    ${ffdc_file_list}=  Scp Dumps  ${FFDC_DIR_PATH}  ${FFDC_PREFIX}
563
564    RETURN  ${ffdc_file_list}
565
566
567Collect Dump Log
568    [Documentation]  Collect dumps from dump entry.
569    [Arguments]  ${log_prefix_path}=${LOG_PREFIX}
570
571    Return From Keyword If  ${REDFISH_SUPPORT_TRANS_STATE} == ${1}
572
573    ${resp}=  OpenBMC Get Request  ${DUMP_URI}
574    Run Keyword If  '${resp.status_code}' == '${HTTP_NOT_FOUND}'
575    ...  Set Test Variable  ${DUMP_ENTRY_URI}  /xyz/openbmc_project/dump/entry/
576
577    ${data}=  Read Properties  ${DUMP_ENTRY_URI}enumerate  quiet=${1}  timeout=${30}
578
579    # Grab the list of entries from dump/entry/
580    # The data shown below is the result of the "Get Dictionary Keys".
581    # Example:
582    # /xyz/openbmc_project/dump/entry/1
583    # /xyz/openbmc_project/dump/entry/2
584
585    ${dump_list}=  Get Dictionary Keys  ${data}
586
587
588Collect PEL Log
589    [Documentation]  Collect PEL files from from BMC.
590
591    Create Directory  ${FFDC_DIR_PATH}${/}pel_files/
592    scp.Get File  /var/lib/phosphor-logging/extensions/pels/logs/
593    ...  ${FFDC_DIR_PATH}${/}pel_files  recursive=True
594
595
596Enumerate Redfish Resources
597    [Documentation]  Enumerate /redfish/v1 resources and properties to
598    ...              a file. Return a list which contains the file name.
599    [Arguments]  ${log_prefix_path}=${LOG_PREFIX}  ${enum_uri}=/redfish/v1
600    ...          ${file_enum_name}=redfish_resource_properties.txt
601
602    # Description of argument(s):
603    # log_prefix_path    The location specifying where to create FFDC file(s).
604
605    # Login is needed to fetch Redfish information.
606    # If login fails, return from keyword.
607    ${status}=  Run Keyword And Return Status  Redfish.Login
608    Return From Keyword If   ${status} == ${False}
609
610    # Get the Redfish resources and properties.
611    ${json_data}=  redfish_utils.Enumerate Request  ${enum_uri}
612    # Typical output:
613    # {
614    #  "@odata.id": "/redfish/v1",
615    #  "@odata.type": "#ServiceRoot.v1_1_1.ServiceRoot",
616    #  "AccountService": {
617    #    "@odata.id": "/redfish/v1/AccountService"
618    #  },
619    #  "Chassis": {
620    #    "@odata.id": "/redfish/v1/Chassis"
621    #  },
622    #  "Id": "RootService",
623    #  "JsonSchemas": {
624    #    "@odata.id": "/redfish/v1/JsonSchemas"
625    #  },
626    # ..etc...
627    # }
628
629    @{ffdc_file_list}=  Create List
630    ${logpath}=  Catenate  SEPARATOR=  ${log_prefix_path}  ${file_enum_name}
631    Create File  ${logpath}
632    Write Data To File  "${\n}${json_data}${\n}"  ${logpath}
633
634    Append To List  ${ffdc_file_list}  ${logpath}
635
636    RETURN  ${ffdc_file_list}
637
638
639Enumerate Redfish OEM Resources
640    [Documentation]  Enumerate /<oem>/v1 resources and properties to
641    ...              a file. Return a list which contains the file name.
642    [Arguments]  ${log_prefix_path}=${LOG_PREFIX}
643
644    # Description of argument(s):
645    # log_prefix_path    The location specifying where to create FFDC file(s).
646
647    # No-op by default if input is not supplied from command line.
648    Return From Keyword If   "${OEM_REDFISH_PATH}" == "${EMPTY}"
649
650    # Login is needed to fetch Redfish information.
651    # If login fails, return from keyword.
652    ${status}=  Run Keyword And Return Status  Redfish.Login
653    Return From Keyword If   ${status} == ${False}
654
655    # Get the Redfish resources and properties.
656    ${json_data}=  redfish_utils.Enumerate Request  ${OEM_REDFISH_PATH}
657
658    @{ffdc_file_list}=  Create List
659    ${logpath}=  Catenate  SEPARATOR=  ${log_prefix_path}
660    ...  redfish_oem_resource_properties.txt
661    Create File  ${logpath}
662    Write Data To File  "${\n}${json_data}${\n}"  ${logpath}
663
664    Append To List  ${ffdc_file_list}  ${logpath}
665
666    RETURN  ${ffdc_file_list}
667
668
669Collect eSEL Log
670    [Documentation]  Create raw and formatted eSEL files.
671    [Arguments]  ${log_prefix_path}=${LOG_PREFIX}
672
673    # NOTE: If no eSEL.pl program can be located, then no formatted eSEL file
674    # will be generated.
675
676    # Description of argument(s):
677    # log_prefix_path               The path prefix to be used in creating
678    #                               eSEL file path names.  For example, if
679    #                               log_prefix_path is
680    #                               "/tmp/user1/dummy.181001.120000.", then
681    #                               this keyword will create
682    #                               /tmp/user1/dummy.181001.120000.esel (raw)
683    #                               and
684    #                               /tmp/user1/dummy.181001.120000.esel.txt
685    #                               (formatted).
686
687    @{ffdc_file_list}=  Create List
688
689    ${esels}=  Get Esels
690    ${num_esels}=  Evaluate  len(${esels})
691    Rprint Vars  num_esels
692    Return From Keyword If  ${num_esels} == ${0}  ${ffdc_file_list}
693
694    ${logpath}=  Catenate  SEPARATOR=  ${log_prefix_path}  esel
695    Create File  ${logpath}
696
697    FOR  ${esel}  IN  @{esels}
698      Write Data To File  "${esel}"${\n}  ${logpath}
699    END
700
701    Append To List  ${ffdc_file_list}  ${logpath}
702
703    ${rc}  ${output}=  Shell Cmd  which eSEL.pl  show_err=0
704    Return From Keyword If  ${rc} != ${0}  ${ffdc_file_list}
705
706    Convert eSEL To Elog Format  ${logpath}
707    Append To List  ${ffdc_file_list}  ${logpath}.txt
708
709    RETURN  ${ffdc_file_list}
710
711
712Convert eSEL To Elog Format
713    [Documentation]  Execute parser tool on the eSEL data file to generate
714    ...              formatted error log.
715    [Arguments]  ${esel_file_path}
716    # Description of argument(s):
717    # esel_file_path                The path to the file containing raw eSEL
718    #                               data (e.g.
719    #                               "/tmp/user1/dummy.181001.120000.esel").
720
721    # Note: The only way to get eSEL.pl to put the output in a particular
722    # directory is to cd to that directory.
723    ${cmd_buf}=  Catenate  cd $(dirname ${esel_file_path}) ; eSEL.pl -l
724    ...  ${esel_file_path} -p decode_obmc_data
725    Qprint Issuing  ${cmd_buf}
726    Run  ${cmd_buf}
727    # The .binary file, which is generated by eSEL.pl, is of no use to us.
728    Remove File  ${esel_file_path}.binary
729
730
731OS Distro Type
732   [Documentation]  Determine the host partition distro type
733
734    ${stdout}  ${stderr}  ${rc}=  OS Execute Command
735    ...  . /etc/os-release; echo $ID  ignore_err=${1}
736
737    Return From Keyword If  ${rc} == ${0}  ${stdout}
738
739    # If linux distro doesn't have os-release, check for uname.
740    ${stdout}  ${stderr}  ${rc}=  OS Execute Command  uname  ignore_err=${0}
741
742    RETURN  ${stdout}
743
744
745Get OS Distro Release Info
746   [Documentation]  Get the host partition release info.
747    ${stdout}  ${stderr}  ${rc}=  OS Execute Command
748    ...  cat /etc/os-release  ignore_err=${1}
749
750    Return From Keyword If  ${rc} == ${0}  ${stdout}
751
752    # If linux distro doesn't have os-release, check for uname.
753    ${stdout}  ${stderr}  ${rc}=  OS Execute Command  uname  ignore_err=${0}
754
755    RETURN  ${stdout}
756