xref: /openbmc/openbmc-test-automation/ipmi/test_ipmi_sol.robot (revision 069b266e40a93fda3992c888062745b1ac920473)
1*** Settings ***
2Documentation       This suite tests IPMI SOL in OpenBMC.
3
4Resource            ../lib/ipmi_client.robot
5Resource            ../lib/openbmc_ffdc.robot
6Resource            ../lib/state_manager.robot
7Resource            ../lib/boot_utils.robot
8Resource            ../lib/bmc_redfish_resource.robot
9Library             ../lib/ipmi_utils.py
10Variables           ../data/ipmi_raw_cmd_table.py
11
12Test Setup          Start SOL Console Logging
13Test Teardown       Test Teardown Execution
14
15Test Tags          IPMI_SOL
16
17*** Variables ***
18
19@{valid_bit_rates}    ${9.6}  ${19.2}  ${38.4}  ${57.6}  ${115.2}
20@{setinprogress}      set-complete  set-in-progress  commit-write
21${invalid_bit_rate}   7.5
22
23
24*** Test Cases ***
25
26Set SOL Enabled
27    [Documentation]  Verify enabling SOL via IPMI.
28    [Tags]  Set_SOL_Enabled
29
30    ${msg}=  Run Keyword  Run External IPMI Standard Command
31    ...  sol set enabled true
32
33    # Verify SOL status from ipmitool sol info command.
34    ${sol_info_dict}=  Get SOL Info
35    ${sol_enable_status}=  Get From Dictionary
36    ...  ${sol_info_dict}  Enabled
37
38    Should Be Equal  '${sol_enable_status}'  'true'
39
40
41Set SOL Disabled
42    [Documentation]  Verify disabling SOL via IPMI.
43    [Tags]  Set_SOL_Disabled
44
45    ${msg}=  Run Keyword  Run External IPMI Standard Command
46    ...  sol set enabled false
47
48    # Verify SOL status from ipmitool sol info command.
49    ${sol_info_dict}=  Get SOL Info
50    ${sol_enable_status}=  Get From Dictionary
51    ...  ${sol_info_dict}  Enabled
52    Should Be Equal  '${sol_enable_status}'  'false'
53
54    # Verify error while activating SOL with SOL disabled.
55    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
56    ...  sol activate
57    Should Contain  ${msg}  SOL payload disabled  ignore_case=True
58
59
60Set Valid SOL Privilege Level
61    [Documentation]  Verify valid SOL's privilege level via IPMI.
62    [Tags]  Set_Valid_SOL_Privilege_Level
63
64    ${privilege_level_list}=  Create List  user  operator  admin  oem
65
66    FOR  ${item}  IN  @{privilege_level_list}
67      Set SOL Setting  privilege-level  ${item}
68      ${output}=  Get SOL Setting  Privilege Level
69      Should Contain  ${output}  ${item}  ignore_case=True
70    END
71
72
73Set Invalid SOL Privilege Level
74    [Documentation]  Verify invalid SOL's retry count via IPMI.
75    [Tags]  Set_Invalid_SOL_Privilege_Level
76
77    ${value}=  Generate Random String  ${8}
78    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
79    ...  sol set privilege-level ${value}
80    Should Contain  ${msg}  Invalid value  ignore_case=True
81
82
83Set Invalid SOL Retry Count
84    [Documentation]  Verify invalid SOL's retry count via IPMI.
85    [Tags]  Set_Invalid_SOL_Retry_Count
86
87    # Any integer above 7 is invalid for SOL retry count.
88    ${value}=  Evaluate  random.randint(8, 10000)  modules=random
89
90    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
91    ...  sol set retry-count ${value}
92    Should Contain  ${msg}  Invalid value  ignore_case=True
93
94
95Set Invalid SOL Retry Interval
96    [Documentation]  Verify invalid SOL's retry interval via IPMI.
97    [Tags]  Set_Invalid_SOL_Retry_Interval
98
99    # Any integer above 255 is invalid for SOL retry interval.
100    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
101
102    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
103    ...  sol set retry-interval ${value}
104    Should Contain  ${msg}  Invalid value  ignore_case=True
105
106
107Set Invalid SOL Character Accumulate Level
108    [Documentation]  Verify invalid SOL's character accumulate level via IPMI.
109    [Tags]  Set_Invalid_SOL_Character_Accumulate_Level
110
111    # Any integer above 255 is invalid for SOL character accumulate level.
112    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
113
114    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
115    ...  sol set character-accumulate-level ${value}
116    Should Contain  ${msg}  Invalid value  ignore_case=True
117
118
119Set Invalid SOL Character Send Threshold
120    [Documentation]  Verify invalid SOL's character send threshold via IPMI.
121    [Tags]  Set_Invalid_SOL_Character_Send_Threshold
122
123    # Any integer above 255 is invalid for SOL character send threshold.
124    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
125
126    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Standard Command
127    ...  sol set character-send-threshold ${value}
128    Should Contain  ${msg}  Invalid value  ignore_case=True
129
130
131Verify SOL During Boot
132    [Documentation]  Verify SOL activate console output during boot.
133    [Tags]  Verify_SOL_During_Boot
134
135    IPMI Power Off  stack_mode=skip
136    Activate SOL Via IPMI
137    Initiate Host Boot Via External IPMI  wait=${0}
138
139    Should Not Be Empty  ${SOL_BIOS_OUTPUT}
140    Should Not Be Empty  ${SOL_LOGIN_OUTPUT}
141
142    # Content takes maximum of 10 minutes to display in SOL console
143    # SOL_BIOS_OUTPUT - BIOS SOL console output
144    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  10 mins  15 secs
145    ...  Check IPMI SOL Output Content  ${SOL_BIOS_OUTPUT}
146
147    IF  '${status}' == 'False'
148        IPMI Power Off
149        FAIL  msg=BIOS not loaded.
150    END
151
152    # SOL_LOGIN_OUTPUT - SOL output login prompt
153    # Once host reboot completes, SOL console may take maximum of 15 minutes to get the login prompt.
154    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  15 mins  15 secs
155    ...  Check IPMI SOL Output Content  ${SOL_LOGIN_OUTPUT}
156
157    IF  '${status}' == 'False'  IPMI Power Off
158
159
160Verify Deactivate Non Existing SOL
161    [Documentation]  Verify deactivate non existing SOL session.
162    [Tags]  Verify_Deactivate_Non_Existing_SOL
163
164    ${resp}=  Deactivate SOL Via IPMI
165    Should Contain  ${resp}  SOL payload already de-activated
166    ...  case_insensitive=True
167
168
169Set Valid SOL Retry Count
170    [Documentation]  Verify valid SOL's retry count via IPMI.
171    [Tags]  Set_Valid_SOL_Retry_Count
172    [Template]  Verify SOL Setting
173
174    # Setting name    Min valid value    Max valid value
175    retry-count       0                  7
176
177
178Set Valid SOL Retry Interval
179    [Documentation]  Verify valid SOL's retry interval via IPMI.
180    [Tags]  Set_Valid_SOL_Retry_Interval
181    [Template]  Verify SOL Setting
182
183    # Setting name    Min valid value    Max valid value
184    retry-interval    0                  255
185
186
187Set Valid SOL Character Accumulate Level
188    [Documentation]  Verify valid SOL's character accumulate level via IPMI.
189    [Tags]  Set_Valid_SOL_Character_Accumulate_Level
190    [Template]  Verify SOL Setting
191
192    # Setting name              Min valid value    Max valid value
193    character-accumulate-level  1                  255
194
195
196Set Valid SOL Character Send Threshold
197    [Documentation]  Verify valid SOL's character send threshold via IPMI.
198    [Tags]  Set_Valid_SOL_Character_Send_Threshold
199    [Template]  Verify SOL Setting
200
201    # Setting name              Min valid value    Max valid value
202    character-send-threshold    0                  255
203
204
205Verify Continuous Activation And Deactivation Of SOL
206    [Documentation]  Continuously on and off SOL.
207    [Tags]  Verify_Continuous_Activation_And_Deactivation_Of_SOL
208
209    ${iteration_count}=  Evaluate  random.randint(5,10)  modules=random
210    FOR  ${iter}  IN RANGE  ${iteration_count}
211        Activate SOL Via IPMI
212        Deactivate SOL Via IPMI
213    END
214
215
216Verify SOL Payload Channel
217    [Documentation]  Verify SOL payload channel from SOL info.
218    [Tags]  Verify_SOL_Payload_Channel
219
220    # Get channel number from SOL Info and verify it is not empty.
221    ${payload_channel}=  Get SOL Setting  Payload Channel
222    Should Not Be Empty  ${payload_channel}
223
224
225Verify SOL Payload Port
226    [Documentation]  Verify SOL payload port from SOL info.
227    [Tags]  Verify_SOL_Payload_Port
228
229    # Get Payload Port from SOL Info and verify it equal with ipmi port.
230    ${payload_port}=  Get SOL Setting  Payload Port
231    Should Be Equal  ${IPMI_PORT}  ${payload_port}
232
233
234Set Valid SOL Non Volatile Bit Rate
235    [Documentation]  Verify ability to set valid SOL non-volatile bit rate.
236    [Tags]  Set_Valid_SOL_Non_Volatile_Bit_Rate
237
238    FOR  ${bit_rate}  IN  @{valid_bit_rates}
239
240      # Set valid non-volatile-bit-rate from SOL Info.
241      Run Keyword And Expect Error  *Parameter not supported*
242      ...  Run External IPMI Standard Command
243      ...  sol set non-volatile-bit-rate ${bit_rate}
244
245    END
246
247
248Set Invalid SOL Non Volatile Bit Rate
249    [Documentation]  Verify ability to set invalid SOL non-volatile bit rate.
250    [Tags]  Set_Invalid_SOL_Non_Volatile_Bit_Rate
251
252    # Set Invalid non-volatile-bit-rate from SOL Info.
253    ${resp} =  Run Keyword and Expect Error  *${IPMI_RAW_CMD['SOL']['Set_SOL'][0]}*
254    ...  Run External IPMI Standard Command  sol set non-volatile-bit-rate ${invalid_bit_rate}
255
256    # Compares whether valid values are displayed.
257    Should Contain  ${resp}  ${IPMI_RAW_CMD['SOL']['Set_SOL'][1]}  ignore_case=True
258
259
260Set Valid SOL Volatile Bit Rate
261    [Documentation]  Verify ability to set valid SOL volatile bit rate.
262    [Tags]  Set_Valid_SOL_Volatile_Bit_Rate
263
264    FOR  ${bit_rate}  IN  @{valid_bit_rates}
265
266      # Set valid volatile-bit-rate from SOL Info.
267      Run Keyword and Expect Error  *Parameter not supported*
268      ...  Run External IPMI Standard Command
269      ...  sol set volatile-bit-rate ${bit_rate}
270
271    END
272
273
274Set Invalid SOL Volatile Bit Rate
275    [Documentation]  Verify ability to set invalid SOL volatile bit rate.
276    [Tags]  Set_Invalid_SOL_Volatile_Bit_Rate
277
278    # Set invalid volatile-bit-rate from SOL Info.
279    ${resp} =  Run Keyword and Expect Error  *${IPMI_RAW_CMD['SOL']['Set_SOL'][0]}*
280    ...  Run External IPMI Standard Command  sol set volatile-bit-rate ${invalid_bit_rate}
281
282    # Compares whether valid values are displayed.
283    Should Contain  ${resp}  ${IPMI_RAW_CMD['SOL']['Set_SOL'][1]}  ignore_case=True
284
285
286Verify SOL Set In Progress
287    [Documentation]  Verify ability to set the set in-progress data for SOL.
288    [Tags]  Verify_SOL_Set_In_Progress
289    [Teardown]  Run Keywords  Set SOL Setting  set-in-progress  set-complete
290    ...         AND  Test Teardown Execution
291
292    # Set the param 0 - set-in-progress from SOL Info.
293    FOR  ${prog}  IN  @{setinprogress}
294       Run Keyword  Run External IPMI Standard Command  sol set set-in-progress ${prog}
295       # Get the param 0 - set-in-progress from SOL Info and verify.
296       ${set_inprogress_state}=  Get SOL Setting  Set in progress
297       Should Be Equal  ${prog}  ${set_inprogress_state}
298    END
299
300
301*** Keywords ***
302
303Check IPMI SOL Output Content
304    [Documentation]  Check if SOL has given content.
305    [Arguments]  ${data}  ${file_path}=${IPMI_SOL_LOG_FILE}
306
307    # Description of argument(s):
308    # data       Content which need to be checked(e.g. Petitboot, ISTEP).
309    # file_path  The file path on the local machine to check SOL content.
310    #            By default it check SOL content from log/sol_<BMC_IP>.
311
312    ${output}=  OperatingSystem.Get File  ${file_path}  encoding_errors=ignore
313    Should Match Regexp  ${output}  ${data}  case_insensitive=True
314
315
316Verify SOL Setting
317    [Documentation]  Verify SOL Setting via IPMI.
318    [Arguments]  ${setting_name}  ${min_value}  ${max_value}
319    # Description of Arguments:
320    # setting_name    Setting to verify (e.g. "retry-count").
321    # min_value       min valid value for given setting.
322    # max_value       max valid value for given setting.
323
324    ${value}=
325    ...  Evaluate  random.randint(${min_value}, ${max_value})  modules=random
326
327    # Character accumulate level setting is set in multiples of 5.
328    # Retry interval setting is set in multiples of 10.
329    # Reference IPMI specification v2.0
330
331    ${expected_value}=  Run Keyword If
332    ...  '${setting_name}' == 'character-accumulate-level'  Evaluate  ${value}*5
333    ...  ELSE IF  '${setting_name}' == 'retry-interval'  Evaluate  ${value}*10
334    ...  ELSE  Set Variable  ${value}
335
336    Set SOL Setting  ${setting_name}  '${value}'
337
338    # Replace "-" with space " " in setting name.
339    # E.g. "retry-count" to "retry count"
340    ${setting_name}=  Evaluate  $setting_name.replace('-',' ')
341
342    ${sol_info_dict}=  Get SOL Info
343
344    # Get exact SOL setting name from sol info output.
345    ${list}=  Get Matches  ${sol_info_dict}  ${setting_name}*
346    ...  case_insensitive=${True}
347    ${setting_name_from_dict}=  Get From List  ${list}  0
348
349    # Get SOL setting value from above setting name.
350    ${setting_value}=  Get From Dictionary
351    ...  ${sol_info_dict}  ${setting_name_from_dict}
352
353    Should Be Equal  '${setting_value}'  '${expected_value}'
354
355    IPMI Power Off  stack_mode=skip
356
357    Initiate Host Boot Via External IPMI  wait=${0}
358
359    Activate SOL Via IPMI
360    # Content takes maximum of 10 minutes to display in SOL console
361    # SOL_BIOS_OUTPUT - BIOS SOL console output
362    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  10 mins  15 secs
363    ...  Check IPMI SOL Output Content  ${SOL_BIOS_OUTPUT}
364
365    IF  '${status}' == 'False'
366        IPMI Power Off
367        FAIL  msg=BIOS not loaded.
368    END
369
370    # SOL_LOGIN_OUTPUT - SOL output login prompt
371    # Once host reboot completes, SOL console may take maximum of 15 minutes to get the login prompt.
372    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  15 mins  15 secs
373    ...  Check IPMI SOL Output Content  ${SOL_LOGIN_OUTPUT}
374
375    IF  '${status}' == 'False'  IPMI Power Off
376
377
378Get SOL Setting
379    [Documentation]  Returns status for given SOL setting.
380    [Arguments]  ${setting}
381    # Description of argument(s):
382    # setting  SOL setting which needs to be read(e.g. "Retry Count").
383
384    ${sol_info_dict}=  Get SOL Info
385    ${setting_status}=  Get From Dictionary  ${sol_info_dict}  ${setting}
386
387    RETURN  ${setting_status}
388
389
390Restore Default SOL Configuration
391    [Documentation]  Restore default SOL configuration.
392
393    Set SOL Setting  enabled  true
394    Set SOL Setting  retry-count  7
395    Set SOL Setting  retry-interval  10
396    Set SOL Setting  character-accumulate-level  20
397    Set SOL Setting  character-send-threshold  1
398    Set SOL Setting  privilege-level  user
399
400
401Test Teardown Execution
402    [Documentation]  Do the post test teardown.
403
404    Wait Until Keyword Succeeds  15 sec  5 sec  Restore Default SOL Configuration
405    Deactivate SOL Via IPMI
406    ${sol_log}=  Stop SOL Console Logging
407    Log   ${sol_log}
408    FFDC On Test Case Fail
409