1*** Settings ***
2
3Documentation       Test BMC dump functionality of OpenBMC.
4
5Resource            ../../lib/openbmc_ffdc.robot
6Resource            ../../lib/dump_utils.robot
7
8Test Setup          Redfish Delete All BMC Dumps
9Test Teardown       Test Teardown Execution
10
11
12*** Test Cases ***
13
14Verify User Initiated BMC Dump When Host Powered Off
15    [Documentation]  Create user initiated BMC dump at host off state and
16    ...  verify dump entry for it.
17    [Tags]  Verify_User_Initiated_BMC_Dump_When_Host_Powered_Off
18
19    Redfish Power Off  stack_mode=skip
20    ${dump_id}=  Create User Initiated BMC Dump
21    ${dump_entries}=  Get BMC Dump Entries
22    Length Should Be  ${dump_entries}  1
23    List Should Contain Value  ${dump_entries}  ${dump_id}
24
25Verify User Initiated BMC Dump When Host Booted
26    [Documentation]  Create user initiated BMC dump at host booted state and
27    ...  verify dump entry for it.
28    [Tags]  Verify_User_Initiated_BMC_Dump_When_Host_Booted
29
30    Redfish Power On  stack_mode=skip
31    ${dump_id}=  Create User Initiated BMC Dump
32    ${dump_entries}=  Get BMC Dump Entries
33    Length Should Be  ${dump_entries}  1
34    List Should Contain Value  ${dump_entries}  ${dump_id}
35
36
37Verify User Initiated BMC Dump Size
38    [Documentation]  Verify user initiated BMC dump size is under 200 KB.
39    [Tags]  Verify_User_Initiated_BMC_Dump_Size
40
41    ${dump_id}=  Create User Initiated BMC Dump
42    ${resp}=  Redfish.Get Properties  /redfish/v1/Managers/bmc/LogServices/Dump/Entries/${dump_id}
43
44    # Example of response from above Redfish GET request.
45    # "@odata.type": "#LogEntry.v1_7_0.LogEntry",
46    # "AdditionalDataSizeBytes": 31644,
47    # "AdditionalDataURI": "/redfish/v1/Managers/bmc/LogServices/Dump/attachment/9",
48    # "Created": "2020-10-23T06:32:53+00:00",
49    # "DiagnosticDataType": "Manager",
50    # "EntryType": "Event",
51    # "Id": "9",
52    # "Name": "BMC Dump Entry"
53
54    # Max size for dump is 200 KB = 200x1024 Byte.
55    Should Be True  0 < ${resp["AdditionalDataSizeBytes"]} < 204800
56
57
58Verify Dump Persistency On Dump Service Restart
59    [Documentation]  Create user dump, restart dump manager service and verify dump
60    ...  persistency.
61    [Tags]  Verify_Dump_Persistency_On_Dump_Service_Restart
62
63    Create User Initiated BMC Dump
64    ${dump_entries_before}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
65
66    # Restart dump service.
67    BMC Execute Command  systemctl restart xyz.openbmc_project.Dump.Manager.service
68    Sleep  10s  reason=Wait for BMC dump service to restart properly
69
70    ${dump_entries_after}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
71    Lists Should Be Equal  ${dump_entries_before}  ${dump_entries_after}
72
73
74Verify Dump Persistency On BMC Reset
75    [Documentation]  Create user dump, reset BMC and verify dump persistency.
76    [Tags]  Verify_Dump_Persistency_On_BMC_Reset
77
78    Create User Initiated BMC Dump
79    ${dump_entries_before}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
80
81    # Reset BMC.
82    OBMC Reboot (off)
83
84    ${dump_entries_after}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
85    Lists Should Be Equal  ${dump_entries_before}  ${dump_entries_after}
86
87
88Delete User Initiated BMC Dump And Verify
89    [Documentation]  Delete user initiated BMC dump and verify.
90    [Tags]  Delete_User_Initiated_BMC_Dump_And_Verify
91
92    ${dump_id}=  Create User Initiated BMC Dump
93    Redfish Delete BMC Dump  ${dump_id}
94
95    ${dump_entries}=  Get BMC Dump Entries
96    Should Be Empty  ${dump_entries}
97
98
99Delete All User Initiated BMC Dumps And Verify
100    [Documentation]  Delete all user initiated BMC dumps and verify.
101    [Tags]  Delete_All_User_Initiated_BMC_Dumps_And_Verify
102
103    # Create some BMC dump.
104    Create User Initiated BMC Dump
105    Create User Initiated BMC Dump
106
107    Redfish Delete All BMC Dumps
108    ${dump_entries}=  Get BMC Dump Entries
109    Should Be Empty  ${dump_entries}
110
111
112Create Two User Initiated BMC Dumps
113    [Documentation]  Create two user initiated BMC dumps.
114    [Tags]  Create_Two_User_Initiated_BMC_Dumps
115
116    ${dump_id1}=  Create User Initiated BMC Dump
117    ${dump_id2}=  Create User Initiated BMC Dump
118
119    ${dump_entries}=  Get BMC Dump Entries
120    Length Should Be  ${dump_entries}  2
121    Should Contain  ${dump_entries}  ${dump_id1}
122    Should Contain  ${dump_entries}  ${dump_id2}
123
124
125Create Two User Initiated BMC Dumps And Delete One
126    [Documentation]  Create two dumps and delete the first.
127    [Tags]  Create_Two_User_Initiated_BMC_Dumps_And_Delete_One
128
129    ${dump_id1}=  Create User Initiated BMC Dump
130    ${dump_id2}=  Create User Initiated BMC Dump
131
132    Redfish Delete BMC Dump  ${dump_id1}
133
134    ${dump_entries}=  Get BMC Dump Entries
135    Length Should Be  ${dump_entries}  1
136    List Should Contain Value  ${dump_entries}  ${dump_id2}
137
138
139Create And Delete User Initiated BMC Dump Multiple Times
140    [Documentation]  Create and delete user initiated BMC dump multiple times.
141    [Tags]  Create_And_Delete_User_Initiated_BMC_Dump_Multiple_Times
142
143    FOR  ${INDEX}  IN  1  10
144      ${dump_id}=  Create User Initiated BMC Dump
145      Redfish Delete BMC Dump  ${dump_id}
146    END
147
148
149Verify Maximum BMC Dump Creation
150    [Documentation]  Create maximum BMC dump and verify error when dump runs out of space.
151    [Tags]  Verify_Maximum_BMC_Dump_Creation
152    [Teardown]  Redfish Delete All BMC Dumps
153
154    # Maximum allowed space for dump is 1024 KB. BMC typically hold 8-14 dumps
155    # before running out of this dump space. So trying to create dumps in 20
156    # iterations to run out of space.
157
158    FOR  ${n}  IN RANGE  0  20
159      Create User Initiated BMC Dump
160      ${dump_space}=  Get Disk Usage For Dumps
161      Exit For Loop If  ${dump_space} >= 1024
162    END
163
164    # Check error while creating dump when dump size is full.
165    ${payload}=  Create Dictionary  DiagnosticDataType=Manager
166    Redfish.Post  /redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData
167    ...  body=${payload}  valid_status_codes=[${HTTP_INTERNAL_SERVER_ERROR}]
168
169
170*** Keywords ***
171
172Create User Initiated BMC Dump
173    [Documentation]  Generate user initiated BMC dump and return the dump id number (e.g., "5").
174
175    ${payload}=  Create Dictionary  DiagnosticDataType=Manager
176    ${resp}=  Redfish.Post  /redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData
177    ...  body=${payload}  valid_status_codes=[${HTTP_ACCEPTED}]
178
179    # Example of response from above Redfish POST request.
180    # "@odata.id": "/redfish/v1/TaskService/Tasks/0",
181    # "@odata.type": "#Task.v1_4_3.Task",
182    # "Id": "0",
183    # "TaskState": "Running",
184    # "TaskStatus": "OK"
185
186    Wait Until Keyword Succeeds  5 min  15 sec  Is Task Completed  ${resp.dict['Id']}
187    ${task_id}=  Set Variable  ${resp.dict['Id']}
188
189    ${task_dict}=  Redfish.Get Properties  /redfish/v1/TaskService/Tasks/${task_id}
190
191    # Example of HttpHeaders field of task details.
192    # "Payload": {
193    #   "HttpHeaders": [
194    #     "Host: <BMC_IP>",
195    #      "Accept-Encoding: identity",
196    #      "Connection: Keep-Alive",
197    #      "Accept: */*",
198    #      "Content-Length: 33",
199    #      "Location: /redfish/v1/Managers/bmc/LogServices/Dump/Entries/2"]
200    #    ],
201    #    "HttpOperation": "POST",
202    #    "JsonBody": "{\"DiagnosticDataType\":\"Manager\"}",
203    #     "TargetUri": "/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData"
204    # }
205
206    [Return]  ${task_dict["Payload"]["HttpHeaders"][-1].split("/")[-1]}
207
208
209Get BMC Dump Entries
210    [Documentation]  Return BMC dump ids list.
211
212    ${dump_uris}=  redfish_utils.get_member_list  /redfish/v1/Managers/bmc/LogServices/Dump/Entries
213    ${dump_ids}=  Create List
214
215    FOR  ${dump_uri}  IN  @{dump_uris}
216      ${dump_id}=  Fetch From Right  ${dump_uri}  /
217      Append To List  ${dump_ids}  ${dump_id}
218    END
219
220    [Return]  ${dump_ids}
221
222
223Get Disk Usage For Dumps
224    [Documentation]  Return disk usage in kilobyte for BMC dumps.
225
226    ${usage_output}  ${stderr}  ${rc}=  BMC Execute Command  du -s /var/lib/phosphor-debug-collector/dumps
227
228    # Example of output from above BMC cli command.
229    # $ du -s /var/lib/phosphor-debug-collector/dumps
230    # 516    /var/lib/phosphor-debug-collector/dumps
231
232    ${usage_output}=  Fetch From Left  ${usage_output}  /
233    ${usage_output}=  Convert To Integer  ${usage_output}
234
235    [return]  ${usage_output}
236
237
238Is Task Completed
239    [Documentation]  Verify if the given task is completed.
240    [Arguments]   ${task_id}
241
242    # Description of argument(s):
243    # task_id        Id of task which needs to be checked.
244
245    ${task_dict}=  Redfish.Get Properties  /redfish/v1/TaskService/Tasks/${task_id}
246    Should Be Equal As Strings  ${task_dict['TaskState']}  Completed
247
248
249Test Teardown Execution
250    [Documentation]  Do test teardown operation.
251
252    FFDC On Test Case Fail
253    Close All Connections
254