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
15Force Tags          SOL_Test
16
17
18*** Variables ***
19
20@{valid_bit_rates}    ${9.6}  ${19.2}  ${38.4}  ${57.6}  ${115.2}
21@{setinprogress}      set-complete  set-in-progress  commit-write
22${invalid_bit_rate}   7.5
23
24
25*** Test Cases ***
26
27Set SOL Enabled
28    [Documentation]  Verify enabling SOL via IPMI.
29    [Tags]  Set_SOL_Enabled
30
31    ${msg}=  Run Keyword  Run IPMI Standard Command
32    ...  sol set enabled true
33
34    # Verify SOL status from ipmitool sol info command.
35    ${sol_info_dict}=  Get SOL Info
36    ${sol_enable_status}=  Get From Dictionary
37    ...  ${sol_info_dict}  Enabled
38
39    Should Be Equal  '${sol_enable_status}'  'true'
40
41
42Set SOL Disabled
43    [Documentation]  Verify disabling SOL via IPMI.
44    [Tags]  Set_SOL_Disabled
45
46    ${msg}=  Run Keyword  Run IPMI Standard Command
47    ...  sol set enabled false
48
49    # Verify SOL status from ipmitool sol info command.
50    ${sol_info_dict}=  Get SOL Info
51    ${sol_enable_status}=  Get From Dictionary
52    ...  ${sol_info_dict}  Enabled
53    Should Be Equal  '${sol_enable_status}'  'false'
54
55    # Verify error while activating SOL with SOL disabled.
56    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
57    ...  sol activate
58    Should Contain  ${msg}  SOL payload disabled  ignore_case=True
59
60
61Set Valid SOL Privilege Level
62    [Documentation]  Verify valid SOL's privilege level via IPMI.
63    [Tags]  Set_Valid_SOL_Privilege_Level
64
65    ${privilege_level_list}=  Create List  user  operator  admin  oem
66
67    FOR  ${item}  IN  @{privilege_level_list}
68      Set SOL Setting  privilege-level  ${item}
69      ${output}=  Get SOL Setting  Privilege Level
70      Should Contain  ${output}  ${item}  ignore_case=True
71    END
72
73
74Set Invalid SOL Privilege Level
75    [Documentation]  Verify invalid SOL's retry count via IPMI.
76    [Tags]  Set_Invalid_SOL_Privilege_Level
77
78    ${value}=  Generate Random String  ${8}
79    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
80    ...  sol set privilege-level ${value}
81    Should Contain  ${msg}  Invalid value  ignore_case=True
82
83
84Set Invalid SOL Retry Count
85    [Documentation]  Verify invalid SOL's retry count via IPMI.
86    [Tags]  Set_Invalid_SOL_Retry_Count
87
88    # Any integer above 7 is invalid for SOL retry count.
89    ${value}=  Evaluate  random.randint(8, 10000)  modules=random
90
91    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
92    ...  sol set retry-count ${value}
93    Should Contain  ${msg}  Invalid value  ignore_case=True
94
95
96Set Invalid SOL Retry Interval
97    [Documentation]  Verify invalid SOL's retry interval via IPMI.
98    [Tags]  Set_Invalid_SOL_Retry_Interval
99
100    # Any integer above 255 is invalid for SOL retry interval.
101    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
102
103    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
104    ...  sol set retry-interval ${value}
105    Should Contain  ${msg}  Invalid value  ignore_case=True
106
107
108Set Invalid SOL Character Accumulate Level
109    [Documentation]  Verify invalid SOL's character accumulate level via IPMI.
110    [Tags]  Set_Invalid_SOL_Character_Accumulate_Level
111
112    # Any integer above 255 is invalid for SOL character accumulate level.
113    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
114
115    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
116    ...  sol set character-accumulate-level ${value}
117    Should Contain  ${msg}  Invalid value  ignore_case=True
118
119
120Set Invalid SOL Character Send Threshold
121    [Documentation]  Verify invalid SOL's character send threshold via IPMI.
122    [Tags]  Set_Invalid_SOL_Character_Send_Threshold
123
124    # Any integer above 255 is invalid for SOL character send threshold.
125    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
126
127    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
128    ...  sol set character-send-threshold ${value}
129    Should Contain  ${msg}  Invalid value  ignore_case=True
130
131
132Verify SOL During Boot
133    [Documentation]  Verify SOL activate console output during boot.
134    [Tags]  Verify_SOL_During_Boot
135
136    IPMI Power Off  stack_mode=skip
137    Activate SOL Via IPMI
138    Initiate Host Boot Via External IPMI  wait=${0}
139
140    Should Not Be Empty  ${SOL_BIOS_OUTPUT}
141    Should Not Be Empty  ${SOL_LOGIN_OUTPUT}
142
143    # Content takes maximum of 10 minutes to display in SOL console
144    # SOL_BIOS_OUTPUT - BIOS SOL console output
145    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  10 mins  15 secs
146    ...  Check IPMI SOL Output Content  ${SOL_BIOS_OUTPUT}
147
148    Run Keyword If  '${status}' == 'False'
149    ...  Run Keywords  IPMI Power Off  AND  FAIL  msg=BIOS not loaded.
150
151    # SOL_LOGIN_OUTPUT - SOL output login prompt
152    # Once host reboot completes, SOL console may take maximum of 15 minutes to get the login prompt.
153    ${status}=  Run Keyword And Return Status  Wait Until Keyword Succeeds  15 mins  15 secs
154    ...  Check IPMI SOL Output Content  ${SOL_LOGIN_OUTPUT}
155
156    Run Keyword If  '${status}' == 'False'
157    ...  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 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 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 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 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 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    # 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 Contain  ${output}  ${data}  case_insensitive=True
313
314
315Verify 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
376Get 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
388Restore 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
399Test 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