1*** Settings ***
2
3Documentation       Test BMC dump functionality of OpenBMC.
4
5Resource            ../../lib/bmc_redfish_resource.robot
6Resource            ../../lib/boot_utils.robot
7Resource            ../../lib/dump_utils.robot
8Resource            ../../lib/openbmc_ffdc.robot
9
10Suite Setup         Redfish.Login
11Test Setup          Redfish Delete All BMC Dumps
12Test Teardown       Test Teardown Execution
13
14*** Variables ***
15
16# Total size of the dump in kilo bytes
17${BMC_DUMP_TOTAL_SIZE}       ${1024}
18
19# Minimum space required for one bmc dump in kilo bytes
20${BMC_DUMP_MIN_SPACE_REQD}   ${20}
21${MAX_DUMP_COUNT}            ${20}
22
23*** Test Cases ***
24
25Verify Error Response For Already Deleted Dump Id
26    [Documentation]  Delete non existing BMC dump and expect an error.
27    [Tags]  Verify_Error_Response_For_Already_Deleted_Dump_Id
28
29    ${dump_id}=  Create User Initiated BMC Dump Via Redfish
30    Redfish Delete BMC Dump  ${dump_id}
31    Run Keyword And Expect Error  ValueError: *  Redfish Delete BMC Dump  ${dump_id}
32
33
34Verify User Initiated BMC Dump When Host Powered Off
35    [Documentation]  Create user initiated BMC dump at host off state and
36    ...  verify dump entry for it.
37    [Tags]  Verify_User_Initiated_BMC_Dump_When_Host_Powered_Off
38
39    Redfish Power Off  stack_mode=skip
40    ${dump_id}=  Create User Initiated BMC Dump Via Redfish
41    ${dump_entries}=  Get BMC Dump Entries
42    Length Should Be  ${dump_entries}  1
43    List Should Contain Value  ${dump_entries}  ${dump_id}
44
45
46Verify User Initiated BMC Dump Size
47    [Documentation]  Verify user initiated BMC dump size is under 20 MB.
48    [Tags]  Verify_User_Initiated_BMC_Dump_Size
49
50    ${dump_id}=  Create User Initiated BMC Dump Via Redfish
51    ${resp}=  Redfish.Get Properties  /redfish/v1/Managers/bmc/LogServices/Dump/Entries/${dump_id}
52
53    # Example of response from above Redfish GET request.
54    # "@odata.type": "#LogEntry.v1_7_0.LogEntry",
55    # "AdditionalDataSizeBytes": 31644,
56    # "AdditionalDataURI": "/redfish/v1/Managers/bmc/LogServices/Dump/attachment/9",
57    # "Created": "2020-10-23T06:32:53+00:00",
58    # "DiagnosticDataType": "Manager",
59    # "EntryType": "Event",
60    # "Id": "9",
61    # "Name": "BMC Dump Entry"
62
63    # Max size for dump is 20 MB = 20x1024x1024 Byte.
64    Should Be True  0 < ${resp["AdditionalDataSizeBytes"]} < 20971520
65
66
67Verify Multiple BMC Dump Creation
68    [Documentation]  Verify that multiple BMC dumps can be created one after
69    ...  another successfully.
70    [Tags]   Verify_Multiple_BMC_Dump_Creation
71
72    ${dump_count}=  Evaluate  random.randint(5, 10)  modules=random
73    FOR  ${INDEX}  IN  1  ${dump_count}
74      Create User Initiated BMC Dump Via Redfish
75    END
76
77
78Verify User Initiated BMC Dump When Host Booted
79    [Documentation]  Create user initiated BMC dump at host booted state and
80    ...  verify dump entry for it.
81    [Tags]  Verify_User_Initiated_BMC_Dump_When_Host_Booted
82
83    Redfish Power On  stack_mode=skip
84    ${dump_id}=  Create User Initiated BMC Dump Via Redfish
85    ${dump_entries}=  Get BMC Dump Entries
86    Length Should Be  ${dump_entries}  1
87    List Should Contain Value  ${dump_entries}  ${dump_id}
88
89
90Verify Dump Persistency On Dump Service Restart
91    [Documentation]  Create user dump, restart dump manager service and verify dump
92    ...  persistency.
93    [Tags]  Verify_Dump_Persistency_On_Dump_Service_Restart
94
95    Create User Initiated BMC Dump Via Redfish
96    ${dump_entries_before}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
97
98    # Restart dump service.
99    BMC Execute Command  systemctl restart xyz.openbmc_project.Dump.Manager.service
100    Sleep  10s  reason=Wait for BMC dump service to restart properly
101
102    ${dump_entries_after}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
103    Lists Should Be Equal  ${dump_entries_before}  ${dump_entries_after}
104
105
106Verify Dump Persistency On BMC Reset
107    [Documentation]  Create user dump, reset BMC and verify dump persistency.
108    [Tags]  Verify_Dump_Persistency_On_BMC_Reset
109
110    # Power off host so that dump is not offloaded to host OS.
111    Redfish Power Off  stack_mode=skip
112
113    Create User Initiated BMC Dump Via Redfish
114    ${dump_entries_before}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
115
116    # Reset BMC.
117    OBMC Reboot (off)  stack_mode=skip
118
119    ${dump_entries_after}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
120    Lists Should Be Equal  ${dump_entries_before}  ${dump_entries_after}
121
122
123Delete User Initiated BMC Dump And Verify
124    [Documentation]  Delete user initiated BMC dump and verify.
125    [Tags]  Delete_User_Initiated_BMC_Dump_And_Verify
126
127    ${dump_id}=  Create User Initiated BMC Dump Via Redfish
128    Redfish Delete BMC Dump  ${dump_id}
129
130    ${dump_entries}=  Get BMC Dump Entries
131    Should Be Empty  ${dump_entries}
132
133
134Delete All User Initiated BMC Dumps And Verify
135    [Documentation]  Delete all user initiated BMC dumps and verify.
136    [Tags]  Delete_All_User_Initiated_BMC_Dumps_And_Verify
137
138    # Power off host so that dump is not offloaded to host OS.
139    Redfish Power Off  stack_mode=skip
140
141    # Create some BMC dump.
142    Create User Initiated BMC Dump Via Redfish
143    Create User Initiated BMC Dump Via Redfish
144
145    Redfish Delete All BMC Dumps
146    ${dump_entries}=  Get BMC Dump Entries
147    Should Be Empty  ${dump_entries}
148
149
150Create Two User Initiated BMC Dumps
151    [Documentation]  Create two user initiated BMC dumps.
152    [Tags]  Create_Two_User_Initiated_BMC_Dumps
153
154    ${dump_id1}=  Create User Initiated BMC Dump Via Redfish
155    ${dump_id2}=  Create User Initiated BMC Dump Via Redfish
156
157    ${dump_entries}=  Get BMC Dump Entries
158    Length Should Be  ${dump_entries}  2
159    Should Contain  ${dump_entries}  ${dump_id1}
160    Should Contain  ${dump_entries}  ${dump_id2}
161
162
163Create Two User Initiated BMC Dumps And Delete One
164    [Documentation]  Create two dumps and delete the first.
165    [Tags]  Create_Two_User_Initiated_BMC_Dumps_And_Delete_One
166
167    ${dump_id1}=  Create User Initiated BMC Dump Via Redfish
168    ${dump_id2}=  Create User Initiated BMC Dump Via Redfish
169
170    Redfish Delete BMC Dump  ${dump_id1}
171
172    ${dump_entries}=  Get BMC Dump Entries
173    Length Should Be  ${dump_entries}  1
174    List Should Contain Value  ${dump_entries}  ${dump_id2}
175
176
177Create And Delete User Initiated BMC Dump Multiple Times
178    [Documentation]  Create and delete user initiated BMC dump multiple times.
179    [Tags]  Create_And_Delete_User_Initiated_BMC_Dump_Multiple_Times
180
181    FOR  ${INDEX}  IN  1  10
182      ${dump_id}=  Create User Initiated BMC Dump Via Redfish
183      Redfish Delete BMC Dump  ${dump_id}
184    END
185
186
187Verify Maximum BMC Dump Creation
188    [Documentation]  Create maximum BMC dump and verify error when dump runs out of space.
189    [Tags]  Verify_Maximum_BMC_Dump_Creation
190    [Teardown]  Redfish Delete All BMC Dumps
191
192    # Maximum allowed space for dump is 1024 KB. BMC typically hold 8-14 dumps
193    # before running out of this dump space. So trying to create dumps in 20
194    # iterations to run out of space.
195    # User can key in the Maximum allowed space for bmc dump and how many iteration.
196    FOR  ${n}  IN RANGE  0  ${MAX_DUMP_COUNT}
197      Create User Initiated BMC Dump Via Redfish
198      ${dump_space}=  Get Disk Usage For Dumps
199      Exit For Loop If  ${dump_space} >= (${BMC_DUMP_TOTAL_SIZE} - ${BMC_DUMP_MIN_SPACE_REQD})
200    END
201
202    # Check error while creating dump when dump size is full.
203    ${payload}=  Create Dictionary  DiagnosticDataType=Manager
204    Redfish.Post  /redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData
205    ...  body=${payload}  valid_status_codes=[${HTTP_INTERNAL_SERVER_ERROR}]
206
207
208Verify BMC Core Dump When Host Powered Off
209    [Documentation]  Verify BMC core dump after application crash at host powered off state.
210    [Tags]  Verify_BMC_Core_Dump_When_Host_Powered_Off
211
212    Redfish Power Off  stack_mode=skip
213
214    # Ensure all dumps are cleaned out.
215    Redfish Delete All BMC Dumps
216    Trigger Core Dump
217
218    # Verify that BMC dump is available.
219    Wait Until Keyword Succeeds  2 min  10 sec  Is BMC Dump Available
220
221
222Verify Core Dump Size
223    [Documentation]  Verify BMC core dump size is under 20 MB.
224    [Tags]  Verify_Core_Dump_Size
225
226    Redfish Power Off  stack_mode=skip
227
228    # Ensure all dumps are cleaned out.
229    Redfish Delete All BMC Dumps
230    Trigger Core Dump
231
232    # Verify that BMC dump is available.
233    Wait Until Keyword Succeeds  2 min  10 sec  Is BMC Dump Available
234    ${dump_entries}=  Get BMC Dump Entries
235    ${resp}=  Redfish.Get Properties
236    ...  /redfish/v1/Managers/bmc/LogServices/Dump/Entries/${dump_entries[0]}
237
238    # Max size for dump is 20 MB = 20x1024x1024 Byte.
239    Should Be True  0 < ${resp["AdditionalDataSizeBytes"]} < 20971520
240
241
242*** Keywords ***
243
244Get BMC Dump Entries
245    [Documentation]  Return BMC dump ids list.
246
247    ${dump_uris}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
248    ${dump_ids}=  Create List
249
250    FOR  ${dump_uri}  IN  @{dump_uris}
251      ${dump_id}=  Fetch From Right  ${dump_uri}  /
252      Append To List  ${dump_ids}  ${dump_id}
253    END
254
255    [Return]  ${dump_ids}
256
257
258Is BMC Dump Available
259    [Documentation]  Verify if BMC dump is available.
260
261    ${dump_entries}=  Get BMC Dump Entries
262
263    # Verifying that BMC dump is available.
264    ${length}=  Get length  ${dump_entries}
265    Should Be True  0 < ${length}
266
267
268Get Disk Usage For Dumps
269    [Documentation]  Return disk usage in kilobyte for BMC dumps.
270
271    ${usage_output}  ${stderr}  ${rc}=  BMC Execute Command  du -s /var/lib/phosphor-debug-collector/dumps
272
273    # Example of output from above BMC cli command.
274    # $ du -s /var/lib/phosphor-debug-collector/dumps
275    # 516    /var/lib/phosphor-debug-collector/dumps
276
277    ${usage_output}=  Fetch From Left  ${usage_output}  /
278    ${usage_output}=  Convert To Integer  ${usage_output}
279
280    [return]  ${usage_output}
281
282
283Test Teardown Execution
284    [Documentation]  Do test teardown operation.
285
286    FFDC On Test Case Fail
287    Close All Connections
288