1*** Settings ***
2Documentation  This module provides general keywords for dump.
3
4Library         bmc_ssh_utils.py
5
6*** Variables ***
7
8*** Keywords ***
9
10Create User Initiated Dump
11    [Documentation]  Generate user initiated dump and return
12    ...  the dump id number (e.g., "5").  Optionally return EMPTY
13    ...  if out of dump space.
14    [Arguments]   ${check_out_of_space}=${False}
15
16    # Description of Argument(s):
17    # check_out_of_space   If ${False}, a dump will be created and
18    #                      its dump_id will be returned.
19    #                      If ${True}, either the dump_id will be
20    #                      returned, or the value ${EMPTY} will be
21    #                      returned if out of dump space was
22    #                      detected when creating the dump.
23
24    ${data}=  Create Dictionary  data=@{EMPTY}
25    ${resp}=  OpenBMC Post Request
26    ...  ${DUMP_URI}action/CreateDump  data=${data}  quiet=${1}
27
28    Run Keyword If  '${check_out_of_space}' == '${False}'
29    ...  Run Keyword And Return  Get The Dump Id  ${resp}
30    ...  ELSE   Run Keyword And Return  Check For Too Many Dumps  ${resp}
31
32
33Get The Dump Id
34    [Documentation]  Wait for the dump to be created. Return the
35    ...  dump id number (e.g., "5").
36    [Arguments]  ${resp}
37
38    # Description of Argument(s):
39    # resp   Response object from action/Create Dump attempt.
40    #        Example object:
41    #        {
42    #           "data": 5,
43    #           "message": "200 OK",
44    #           "status": "ok"
45    #        },
46    #        The "data" field conveys the id number of the created dump.
47
48    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
49    ${json}=  To JSON  ${resp.content}
50
51    Run Keyword If  ${json["data"]} == ${None}
52    ...  Fail  Dump id returned null.
53
54    ${dump_id}=  Set Variable  ${json["data"]}
55
56    Wait Until Keyword Succeeds  3 min  15 sec  Check Dump Existence
57    ...  ${dump_id}
58
59    [Return]  ${dump_id}
60
61
62Check For Too Many Dumps
63    [Documentation]  Return the dump_id number, or return ${EMPTY} if dump
64    ...  creation failed due to too many dumps.
65    [Arguments]  ${resp}
66
67    # Description of Argument(s):
68    # resp   Response object from action/Create Dump attempt.
69    #        Example object if there are too many dumps:
70    #       {
71    #           "data": {
72    #               "description": "xyz.openbmc_project.Dump.Create.Error.QuotaExceeded"
73    #           },
74    #           "message": "Dump not captured due to a cap.",
75    #           "status": "error"
76    #       }
77
78    # If dump was created normally, return the dump_id number.
79    Run Keyword If  '${resp.status_code}' == '${HTTP_OK}'
80    ...  Run Keyword And Return  Get The Dump Id  ${resp}
81
82    ${json}=  To JSON   ${resp.content}
83    ${exception}=  Set Variable  ${json["message"]}
84    ${at_capacity}=  Set Variable  Dump not captured due to a cap
85    ${too_many_dumps}=  Evaluate  $at_capacity in $exception
86    Printn
87    Rprint Vars   exception  too_many_dumps
88    # If there are too many dumps, return ${EMPTY}, otherwise Fail.
89    ${status}=  Run Keyword If  ${too_many_dumps}  Set Variable  ${EMPTY}
90    ...  ELSE  Fail  msg=${exception}.
91
92    [Return]  ${status}
93
94
95Verify No Dump In Progress
96    [Documentation]  Verify no dump in progress.
97
98    ${dump_progress}  ${stderr}  ${rc}=  BMC Execute Command  ls /tmp
99    Should Not Contain  ${dump_progress}  obmcdump
100
101
102Check Dump Existence
103    [Documentation]  Verify if given dump exist.
104    [Arguments]  ${dump_id}
105
106    # Description of Argument(s):
107    # dump_id  An integer value that identifies a particular dump
108    #          object(e.g. 1, 3, 5).
109
110    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}${dump_id}
111    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
112
113
114Delete BMC Dump
115    [Documentation]  Deletes a given bmc dump.
116    [Arguments]  ${dump_id}
117
118    # Description of Argument(s):
119    # dump_id  An integer value that identifies a particular dump (e.g. 1, 3).
120
121    ${data}=  Create Dictionary  data=@{EMPTY}
122    ${resp}=  OpenBMC Post Request
123    ...  ${DUMP_ENTRY_URI}${dump_id}/action/Delete  data=${data}
124
125    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
126
127Delete All Dumps
128    [Documentation]  Delete all dumps.
129
130    # Check if dump entries exist, if not return.
131    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list  quiet=${1}
132    Return From Keyword If  ${resp.status_code} == ${HTTP_NOT_FOUND}
133
134    # Get the list of dump entries and delete them all.
135    ${dump_entries}=  Get URL List  ${DUMP_ENTRY_URI}
136    :FOR  ${entry}  IN  @{dump_entries}
137    \  ${dump_id}=  Fetch From Right  ${entry}  /
138    \  Delete BMC Dump  ${dump_id}
139
140
141Delete All BMC Dump
142    [Documentation]  Delete all BMC dump entries using "DeleteAll" interface.
143
144    ${data}=  Create Dictionary  data=@{EMPTY}
145    ${resp}=  Openbmc Post Request  ${DUMP_URI}action/DeleteAll  data=${data}
146    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
147
148Dump Should Not Exist
149    [Documentation]  Verify that BMC dumps do not exist.
150
151    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list  quiet=${1}
152    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND}
153
154Check Existence of BMC Dump file
155    [Documentation]  Verify existence of BMC dump file.
156    [Arguments]  ${dump_id}
157
158    # Description of argument(s):
159    # dump_id  BMC dump identifier
160
161    ${dump_check_cmd}=  Set Variable
162    ...  ls /var/lib/phosphor-debug-collector/dumps
163
164    # Output of sample BMC Execute command with '2' as dump id is as follows
165    # ls /var/lib/phosphor-debug-collector/dumps/2
166    # obmcdump_2_XXXXXXXXXX.tar.xz
167    ${file_there}  ${stderr}  ${rc}=  BMC Execute Command
168    ...  ${dump_check_cmd}/${dump_id}
169    Should End With  ${file_there}  tar.xz  msg=BMC dump file not found.
170
171Get Dump Entries
172    [Documentation]  Return dump entries list.
173
174    ${dump_entries}=  Get URL List  ${DUMP_ENTRY_URI}
175    [Return]  ${dump_entries}
176
177
178Trigger Core Dump
179    [Documentation]  Trigger core dump.
180
181    # Find the pid of the active ipmid and kill it.
182    ${cmd_buf}=  Catenate  kill -s SEGV $(ps | egrep ' ipmid$' |
183    ...  egrep -v grep | \ cut -c1-6)
184
185    ${cmd_output}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd_buf}
186    Should Be Empty  ${stderr}  msg=BMC execute command error.
187    Should Be Equal As Integers  ${rc}  ${0}
188    ...  msg=BMC execute command return code is not zero.
189