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    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
159Verify 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
168Set 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
177Set 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
186Set 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
195Set 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
204Verify 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
215Verify 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
224Verify 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
233Set 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 External IPMI Standard Command
242      ...  sol set non-volatile-bit-rate ${bit_rate}
243
244    END
245
246
247Set 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 External 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
259Set 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 External IPMI Standard Command
268      ...  sol set volatile-bit-rate ${bit_rate}
269
270    END
271
272
273Set 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 External 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
285Verify 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 External 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
302Check 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
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