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