| *** Settings *** | 
 | Documentation  This module provides general keywords for dump. | 
 |  | 
 | Library         bmc_ssh_utils.py | 
 |  | 
 | *** Variables *** | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Create User Initiated Dump | 
 |     [Documentation]  Generate user initiated dump and return | 
 |     ...  the dump id number (e.g., "5").  Optionally return EMPTY | 
 |     ...  if out of dump space. | 
 |     [Arguments]   ${check_out_of_space}=${False} | 
 |  | 
 |     # Description of Argument(s): | 
 |     # check_out_of_space   If ${False}, a dump will be created and | 
 |     #                      its dump_id will be returned. | 
 |     #                      If ${True}, either the dump_id will be | 
 |     #                      returned, or the value ${EMPTY} will be | 
 |     #                      returned if out of dump space was | 
 |     #                      detected when creating the dump. | 
 |  | 
 |     ${data}=  Create Dictionary  data=@{EMPTY} | 
 |     ${resp}=  OpenBMC Post Request | 
 |     ...  ${DUMP_URI}action/CreateDump  data=${data}  quiet=${1} | 
 |  | 
 |     Run Keyword If  '${check_out_of_space}' == '${False}' | 
 |     ...  Run Keyword And Return  Get The Dump Id  ${resp} | 
 |     ...  ELSE   Run Keyword And Return  Check For Too Many Dumps  ${resp} | 
 |  | 
 |  | 
 | Get The Dump Id | 
 |     [Documentation]  Wait for the dump to be created. Return the | 
 |     ...  dump id number (e.g., "5"). | 
 |     [Arguments]  ${resp} | 
 |  | 
 |     # Description of Argument(s): | 
 |     # resp   Response object from action/Create Dump attempt. | 
 |     #        Example object: | 
 |     #        { | 
 |     #           "data": 5, | 
 |     #           "message": "200 OK", | 
 |     #           "status": "ok" | 
 |     #        }, | 
 |     #        The "data" field conveys the id number of the created dump. | 
 |  | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |     ${json}=  To JSON  ${resp.content} | 
 |  | 
 |     Run Keyword If  ${json["data"]} == ${None} | 
 |     ...  Fail  Dump id returned null. | 
 |  | 
 |     ${dump_id}=  Set Variable  ${json["data"]} | 
 |  | 
 |     Wait Until Keyword Succeeds  3 min  15 sec  Check Dump Existence | 
 |     ...  ${dump_id} | 
 |  | 
 |     [Return]  ${dump_id} | 
 |  | 
 |  | 
 | Check For Too Many Dumps | 
 |     [Documentation]  Return the dump_id number, or return ${EMPTY} if dump | 
 |     ...  creation failed due to too many dumps. | 
 |     [Arguments]  ${resp} | 
 |  | 
 |     # Description of Argument(s): | 
 |     # resp   Response object from action/Create Dump attempt. | 
 |     #        Example object if there are too many dumps: | 
 |     #        { | 
 |     #           "data": { | 
 |     #              "description": "Internal Server Error", | 
 |     #              "exception": "'Dump not captured due to a cap.'", | 
 |     #              "traceback": [ | 
 |     #              "Traceback (most recent call last):", | 
 |     #                ... | 
 |     #              "DBusException: Create.Error.QuotaExceeded" | 
 |     #                           ] | 
 |     #              }, | 
 |     #           "message": "500 Internal Server Error", | 
 |     #           "status": "error" | 
 |     #        } | 
 |  | 
 |     # If dump was created normally, return the dump_id number. | 
 |     Run Keyword If  '${resp.status_code}' == '${HTTP_OK}' | 
 |     ...  Run Keyword And Return  Get The Dump Id  ${resp} | 
 |  | 
 |     ${exception}=  Set Variable  ${resp.json()['data']['exception']} | 
 |     ${at_capacity}=  Set Variable  Dump not captured due to a cap | 
 |     ${too_many_dumps}=  Evaluate  $at_capacity in $exception | 
 |     Printn | 
 |     Rprint Vars   exception  too_many_dumps | 
 |     # If there are too many dumps, return ${EMPTY}, otherwise Fail. | 
 |     ${status}=  Run Keyword If  ${too_many_dumps}  Set Variable  ${EMPTY} | 
 |     ...  ELSE  Fail  msg=${exception}. | 
 |  | 
 |     [Return]  ${status} | 
 |  | 
 |  | 
 | Verify No Dump In Progress | 
 |     [Documentation]  Verify no dump in progress. | 
 |  | 
 |     ${dump_progress}  ${stderr}  ${rc}=  BMC Execute Command  ls /tmp | 
 |     Should Not Contain  ${dump_progress}  obmcdump | 
 |  | 
 |  | 
 | Check Dump Existence | 
 |     [Documentation]  Verify if given dump exist. | 
 |     [Arguments]  ${dump_id} | 
 |  | 
 |     # Description of Argument(s): | 
 |     # dump_id  An integer value that identifies a particular dump | 
 |     #          object(e.g. 1, 3, 5). | 
 |  | 
 |     ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}${dump_id} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 |  | 
 | Delete BMC Dump | 
 |     [Documentation]  Deletes a given bmc dump. | 
 |     [Arguments]  ${dump_id} | 
 |  | 
 |     # Description of Argument(s): | 
 |     # dump_id  An integer value that identifies a particular dump (e.g. 1, 3). | 
 |  | 
 |     ${data}=  Create Dictionary  data=@{EMPTY} | 
 |     ${resp}=  OpenBMC Post Request | 
 |     ...  ${DUMP_ENTRY_URI}${dump_id}/action/Delete  data=${data} | 
 |  | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 | Delete All Dumps | 
 |     [Documentation]  Delete all dumps. | 
 |  | 
 |     # Check if dump entries exist, if not return. | 
 |     ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list  quiet=${1} | 
 |     Return From Keyword If  ${resp.status_code} == ${HTTP_NOT_FOUND} | 
 |  | 
 |     # Get the list of dump entries and delete them all. | 
 |     ${dump_entries}=  Get URL List  ${DUMP_ENTRY_URI} | 
 |     :FOR  ${entry}  IN  @{dump_entries} | 
 |     \  ${dump_id}=  Fetch From Right  ${entry}  / | 
 |     \  Delete BMC Dump  ${dump_id} | 
 |  | 
 |  | 
 | Delete All BMC Dump | 
 |     [Documentation]  Delete all BMC dump entries using "DeleteAll" interface. | 
 |  | 
 |     ${data}=  Create Dictionary  data=@{EMPTY} | 
 |     ${resp}=  Openbmc Post Request  ${DUMP_URI}action/DeleteAll  data=${data} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 | Dump Should Not Exist | 
 |     [Documentation]  Verify that BMC dumps do not exist. | 
 |  | 
 |     ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list  quiet=${1} | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND} | 
 |  | 
 | Check Existence of BMC Dump file | 
 |     [Documentation]  Verify existence of BMC dump file. | 
 |     [Arguments]  ${dump_id} | 
 |  | 
 |     # Description of argument(s): | 
 |     # dump_id  BMC dump identifier | 
 |  | 
 |     ${dump_check_cmd}=  Set Variable | 
 |     ...  ls /var/lib/phosphor-debug-collector/dumps | 
 |  | 
 |     # Output of sample BMC Execute command with '2' as dump id is as follows | 
 |     # ls /var/lib/phosphor-debug-collector/dumps/2 | 
 |     # obmcdump_2_XXXXXXXXXX.tar.xz | 
 |     ${file_there}  ${stderr}  ${rc}=  BMC Execute Command | 
 |     ...  ${dump_check_cmd}/${dump_id} | 
 |     Should End With  ${file_there}  tar.xz  msg=BMC dump file not found. | 
 |  | 
 | Get Dump Entries | 
 |     [Documentation]  Return dump entries list. | 
 |  | 
 |     ${dump_entries}=  Get URL List  ${DUMP_ENTRY_URI} | 
 |     [Return]  ${dump_entries} | 
 |  | 
 |  | 
 | Trigger Core Dump | 
 |     [Documentation]  Trigger core dump. | 
 |  | 
 |     # Find the pid of the active ipmid and kill it. | 
 |     ${cmd_buf}=  Catenate  kill -s SEGV $(ps | egrep ' ipmid$' | | 
 |     ...  egrep -v grep | \ cut -c1-6) | 
 |  | 
 |     ${cmd_output}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd_buf} | 
 |     Should Be Empty  ${stderr}  msg=BMC execute command error. | 
 |     Should Be Equal As Integers  ${rc}  ${0} | 
 |     ...  msg=BMC execute command return code is not zero. |