1*** Settings ***
2
3Documentation       Test dump functionality of OpenBMC.
4
5Resource            ../../lib/openbmc_ffdc.robot
6Resource            ../../lib/rest_client.robot
7Resource            ../../lib/dump_utils.robot
8Resource            ../../lib/boot_utils.robot
9Resource            ../../lib/utils.robot
10Resource            ../../lib/state_manager.robot
11Library             ../../lib/bmc_ssh_utils.py
12
13Suite Setup         Suite Setup Execution
14Test Setup          Open Connection And Log In
15Test Teardown       Test Teardown Execution
16
17*** Test Cases ***
18
19Pre Dump BMC Performance Test
20    [Documentation]  Check performance of memory, CPU & file system of BMC.
21    [Tags]  Pre_Dump_BMC_Performance_Test
22
23    Open Connection And Log In
24    Check BMC Performance
25
26
27Verify User Initiated BMC Dump When Powered Off
28    [Documentation]  Create user initiated BMC dump at host off state and
29    ...  verify dump entry for it.
30    [Tags]  Verify_User_Initiated_BMC_Dump_When_Powered_Off
31
32    Redfish Power Off  stack_mode=skip
33    ${dump_id}=  Create User Initiated Dump
34    Check Existence Of BMC Dump File  ${dump_id}
35
36
37Verify Dump Persistency On Service Restart
38    [Documentation]  Create user dump, restart BMC service and verify dump
39    ...  persistency.
40    [Tags]  Verify_Dump_Persistency_On_Service_Restart
41
42    Delete All BMC Dump
43    ${dump_id}=  Create User Initiated Dump
44    BMC Execute Command
45    ...  systemctl restart xyz.openbmc_project.Dump.Manager.service
46    Sleep  10s  reason=Wait for BMC dump service to restart properly.
47
48    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list
49    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
50    Check Existence Of BMC Dump File  ${dump_id}
51
52
53Verify Dump Persistency On Reset
54    [Documentation]  Create user dump, reset BMC and verify dump persistency.
55    [Tags]  Verify_Dump_Persistency_On_Reset
56
57    Delete All BMC Dump
58    ${dump_id}=  Create User Initiated Dump
59    OBMC Reboot (off)
60    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list
61    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
62    Check Existence Of BMC Dump File  ${dump_id}
63
64
65Delete User Initiated BMC Dump And Verify
66    [Documentation]  Delete user initiated dump and verify.
67    [Tags]  Delete_User_Initiated_Dump_And_Verify
68
69    ${dump_id}=  Create User Initiated Dump
70    Check Existence Of BMC Dump File  ${dump_id}
71
72    Delete BMC Dump  ${dump_id}
73
74
75Verify User Initiated Dump Size
76    [Documentation]  Verify user Initiated BMC dump size is under 200k.
77    [Tags]  Verify_User_Initiated_Dump_Size
78
79    ${dump_id}=  Create User Initiated Dump
80
81    ${dump_size}=  Read Attribute  ${DUMP_ENTRY_URI}${dump_id}  Size
82    # Max size for dump is 200k = 200x1024
83    Should Be True  0 < ${dump_size} < 204800
84    Check Existence Of BMC Dump File  ${dump_id}
85
86
87Create Two User Initiated Dump And Delete One
88    [Documentation]  Create two dumps and delete the first.
89    [Tags]  Create_Two_User_Initiated_Dump_And_Delete_One
90
91    ${dump_id_1}=  Create User Initiated Dump
92    ${dump_id_2}=  Create User Initiated Dump
93
94    Delete BMC Dump  ${dump_id_1}
95
96    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}${dump_id_1}
97    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND}
98
99    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}${dump_id_2}
100    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
101    Check Existence Of BMC Dump File  ${dump_id_2}
102
103
104Create And Delete BMC Dump Multiple Times
105    [Documentation]  Create and delete BMC dump multiple times.
106    [Tags]  Create_And_Delete_BMC_Dump_Multiple_Times
107
108    FOR  ${INDEX}  IN  1  5
109      ${dump_id}=  Create User Initiated Dump
110      Delete BMC Dump  ${dump_id}
111    END
112
113
114Delete All BMC Dumps And Verify
115    [Documentation]  Delete all BMC dumps and verify.
116    [Tags]  Delete_All_BMC_Dumps_And_Verify
117
118    # Create some dump.
119    Create User Initiated Dump
120    Create User Initiated Dump
121
122    Delete All BMC Dump
123    ${resp}=  OpenBMC Get Request  ${DUMP_ENTRY_URI}list
124    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_NOT_FOUND}
125
126
127Verify User Initiated BMC Dump When Host Booted
128    [Documentation]  Create user initiated BMC dump at host booted state and
129    ...  verify dump entry for it.
130    [Tags]  Verify_User_Initiated_BMC_Dump_When_Host_Booted
131
132    Redfish Power On  stack_mode=skip
133    Create User Initiated Dump
134
135
136Verify Core Dump Size
137    [Documentation]  Verify BMC core dump size is under 200k.
138    [Tags]  Verify_Core_Dump_Size
139
140    Delete All Dumps
141    Trigger Core Dump
142    Wait Until Keyword Succeeds  2 min  10 sec  Get Dump Entries
143
144    ${dump_entries}=  Get URL List  ${DUMP_ENTRY_URI}
145    ${dump_size}=  Read Attribute  ${dump_entries[0]}  Size
146
147    # Max size for dump is 200k = 200x1024
148    Should Be True  0 < ${dump_size} < 204800  msg=Size of dump is incorrect.
149
150
151Dump Out Of Space Test
152    [Documentation]  Verify out of dump space is reported when attempt
153    ...  to create too many dumps.
154    [Tags]  Dump_Out_Of_Space_Test
155    [Setup]  Delete All BMC Dump
156
157    # Systems typically hold 8-14 dumps before running out of dump space.
158    # Attempt to create too_many_dumps.  Expect to run out of space
159    # before this.
160    ${too_many_dumps}  Set Variable  ${20}
161
162    # Loop, creating a dump each iteration.  Will either get dump_id or
163    # will get EMPTY when out of dump space.
164    FOR  ${n}  IN RANGE  0  ${too_many_dumps}
165      ${dump_id}=  Create User Initiated Dump  check_out_of_space=${True}
166      Exit For Loop If  '${dump_id}' == '${EMPTY}'
167      Check Existence Of BMC Dump File  ${dump_id}
168    END
169
170    Run Keyword If  '${dump_id}' != '${EMPTY}'  Fail
171    ...  msg=Did not run out of dump space as expected.
172
173
174Post Dump BMC Performance Test
175    [Documentation]  Check performance of memory, CPU & file system of BMC.
176    [Tags]  Post_Dump_BMC_Performance_Test
177
178    Open Connection And Log In
179    Check BMC Performance
180
181
182Post Dump Core Dump Check
183    [Documentation]  Check core dump existence on BMC after code update.
184    [Tags]  Post_Dump_Core_Dump_Check
185
186    Check For Core Dumps
187
188
189Verify Dump After Host Watchdog Error Injection
190    [Documentation]  Inject host watchdog error and verify whether dump is generated.
191    [Tags]  Verify_Dump_After_Host_Watchdog_Error_Injection
192
193    Redfish Power On
194
195    Run Keyword And Ignore Error  Delete All Dumps
196
197    # Enable auto reboot
198    Set Auto Reboot  ${1}
199
200    Trigger Host Watchdog Error  2000  30
201
202    Wait Until Keyword Succeeds  300 sec  20 sec  Is Host Rebooted
203
204    #Get dump details
205    @{dump_entry_list}=  Read Properties  ${DUMP_ENTRY_URI}
206
207    # Verifying that there is only one dump
208    ${length}=  Get length  ${dump_entry_list}
209    Should Be Equal As Integers  ${length}  ${1}
210
211    # Get dump id
212    ${value}=  Get From List  ${dump_entry_list}  0
213    @{split_value}=  Split String  ${value}  /
214    ${dump_id}=  Get From List  ${split_value}  -1
215
216    # Max size for dump is 200k = 200x1024
217    ${dump_size}=  Read Attribute  ${DUMP_ENTRY_URI}${dump_id}  Size
218    Should Be True  0 < ${dump_size} < 204800
219
220
221Verify Download BMC Dump
222    [Documentation]  Verify that a BMC dump can be downloaded to the local machine.
223    [Tags]  Verify_Download_BMC_Dump
224
225    ${dump_id}=  Create User Initiated Dump
226    ${dump_dict}=  Get Dump Dict
227    ${bmc_dump_name}=  Fetch From Right  ${dump_dict['${dump_id}']}  /
228    ${bmc_dump_checksum}  ${stderr}  ${rc}=  BMC Execute Command
229    ...  md5sum ${dump_dict['${dump_id}']}|awk '{print$1}'
230    ${bmc_dump_size}  ${stderr}  ${rc}=  BMC Execute Command
231    ...  stat -c "%s" ${dump_dict['${dump_id}']}
232
233    ${response}=  OpenBMC Get Request  ${DUMP_DOWNLOAD_URI}${dump_id}
234    ...  quiet=${1}
235    Should Be Equal As Strings  ${response.status_code}  ${HTTP_OK}
236    Create Binary File  ${EXECDIR}${/}dumps   ${response.content}
237    Run  tar -xvf ${EXECDIR}${/}dumps
238    ${download_dump_name}=  Fetch From Left  ${bmc_dump_name}  .
239    ${download_dump_checksum}=  Run  md5sum ${EXECDIR}/dumps|awk '{print$1}'
240    ${download_dump_size}=  Run  stat -c "%s" ${EXECDIR}${/}dumps
241
242    OperatingSystem.Directory Should Exist  ${EXECDIR}/${download_dump_name}
243    ...  msg=Created dump name and downloaded dump name don't match.
244    Should Be Equal As Strings  ${bmc_dump_checksum}  ${download_dump_checksum}
245    Should Be Equal As Strings  ${bmc_dump_size}  ${download_dump_size}
246
247    Run  rm -rf ${EXECDIR}${/}${download_dump_name};rm ${EXECDIR}${/}dumps
248
249
250*** Keywords ***
251
252Suite Setup Execution
253    [Documentation]  Do initial suite setup tasks.
254
255    ${resp}=  OpenBMC Get Request  ${DUMP_URI}
256    Run Keyword If  '${resp.status_code}' == '${HTTP_NOT_FOUND}'
257    ...  Run Keywords  Set Suite Variable  ${DUMP_URI}  /xyz/openbmc_project/dump/  AND
258    ...  Set Suite Variable  ${DUMP_ENTRY_URI}  /xyz/openbmc_project/dump/entry/
259
260
261Test Teardown Execution
262    [Documentation]  Do the post test teardown.
263
264    Wait Until Keyword Succeeds  3 min  15 sec  Verify No Dump In Progress
265    FFDC On Test Case Fail
266    Delete All BMC Dump
267    Close All Connections
268