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