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
10
11Test Setup          Start SOL Console Logging
12Test Teardown       Test Teardown Execution
13
14Force Tags          SOL_Test
15
16
17*** Variables ***
18
19*** Test Cases ***
20
21Set SOL Enabled
22    [Documentation]  Verify enabling SOL via IPMI.
23    [Tags]  Set_SOL_Enabled
24
25    ${msg}=  Run Keyword  Run IPMI Standard Command
26    ...  sol set enabled true
27
28    # Verify SOL status from ipmitool sol info command.
29    ${sol_info_dict}=  Get SOL Info
30    ${sol_enable_status}=  Get From Dictionary
31    ...  ${sol_info_dict}  Enabled
32
33    Should Be Equal  '${sol_enable_status}'  'true'
34
35
36Set SOL Disabled
37    [Documentation]  Verify disabling SOL via IPMI.
38    [Tags]  Set_SOL_Disabled
39
40    ${msg}=  Run Keyword  Run IPMI Standard Command
41    ...  sol set enabled false
42
43    # Verify SOL status from ipmitool sol info command.
44    ${sol_info_dict}=  Get SOL Info
45    ${sol_enable_status}=  Get From Dictionary
46    ...  ${sol_info_dict}  Enabled
47    Should Be Equal  '${sol_enable_status}'  'false'
48
49    # Verify error while activating SOL with SOL disabled.
50    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
51    ...  sol activate
52    Should Contain  ${msg}  SOL payload disabled  ignore_case=True
53
54
55Set Valid SOL Privilege Level
56    [Documentation]  Verify valid SOL's privilege level via IPMI.
57    [Tags]  Set_Valid_SOL_Privilege_Level
58
59    ${privilege_level_list}=  Create List  user  operator  admin  oem
60    : FOR  ${item}  IN  @{privilege_level_list}
61    \  Set SOL Setting  privilege-level  ${item}
62    \  ${output}=  Get SOL Setting  Privilege Level
63    \  Should Contain  ${output}  ${item}  ignore_case=True
64
65
66Set Invalid SOL Privilege Level
67    [Documentation]  Verify invalid SOL's retry count via IPMI.
68    [Tags]  Set_Invalid_SOL_Privilege_Level
69
70    ${value}=  Generate Random String  ${8}
71    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
72    ...  sol set privilege-level ${value}
73    Should Contain  ${msg}  Invalid value  ignore_case=True
74
75
76Set Invalid SOL Retry Count
77    [Documentation]  Verify invalid SOL's retry count via IPMI.
78    [Tags]  Set_Invalid_SOL_Retry_Count
79
80    # Any integer above 7 is invalid for SOL retry count.
81    ${value}=  Evaluate  random.randint(8, 10000)  modules=random
82
83    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
84    ...  sol set retry-count ${value}
85    Should Contain  ${msg}  Invalid value  ignore_case=True
86
87
88Set Invalid SOL Retry Interval
89    [Documentation]  Verify invalid SOL's retry interval via IPMI.
90    [Tags]  Set_Invalid_SOL_Retry_Interval
91
92    # Any integer above 255 is invalid for SOL retry interval.
93    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
94
95    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
96    ...  sol set retry-interval ${value}
97    Should Contain  ${msg}  Invalid value  ignore_case=True
98
99
100Set Invalid SOL Character Accumulate Level
101    [Documentation]  Verify invalid SOL's character accumulate level via IPMI.
102    [Tags]  Set_Invalid_SOL_Character_Accumulate_Level
103
104    # Any integer above 255 is invalid for SOL character accumulate level.
105    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
106
107    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
108    ...  sol set character-accumulate-level ${value}
109    Should Contain  ${msg}  Invalid value  ignore_case=True
110
111
112Set Invalid SOL Character Send Threshold
113    [Documentation]  Verify invalid SOL's character send threshold via IPMI.
114    [Tags]  Set_Invalid_SOL_Character_Send_Threshold
115
116    # Any integer above 255 is invalid for SOL character send threshold.
117    ${value}=  Evaluate  random.randint(256, 10000)  modules=random
118
119    ${msg}=  Run Keyword And Expect Error  *  Run IPMI Standard Command
120    ...  sol set character-send-threshold ${value}
121    Should Contain  ${msg}  Invalid value  ignore_case=True
122
123
124Verify SOL During Boot
125    [Documentation]  Verify SOL during boot.
126    [Tags]  Verify_SOL_During_Boot
127
128    Redfish Hard Power Off
129    Activate SOL Via IPMI
130    Initiate Host Boot Via External IPMI  wait=${0}
131
132    Wait Until Keyword Succeeds  3 mins  15 secs
133    ...  Check IPMI SOL Output Content  Welcome to Hostboot
134
135    Wait Until Keyword Succeeds  3 mins  15 secs
136    ...  Check IPMI SOL Output Content  ISTEP
137
138    Redfish Hard Power Off
139
140
141Verify Deactivate Non Existing SOL
142    [Documentation]  Verify deactivate non existing SOL session.
143    [Tags]  Verify_Deactivate_Non_Existing_SOL
144
145    ${resp}=  Deactivate SOL Via IPMI
146    Should Contain  ${resp}  SOL payload already de-activated
147    ...  case_insensitive=True
148
149
150Set Valid SOL Retry Count
151    [Documentation]  Verify valid SOL's retry count via IPMI.
152    [Tags]  Set_Valid_SOL_Retry_Count
153    [Template]  Verify SOL Setting
154
155    # Setting name    Min valid value    Max valid value
156    retry-count       0                  7
157
158
159Set Valid SOL Retry Interval
160    [Documentation]  Verify valid SOL's retry interval via IPMI.
161    [Tags]  Set_Valid_SOL_Retry_Interval
162    [Template]  Verify SOL Setting
163
164    # Setting name    Min valid value    Max valid value
165    retry-interval    0                  255
166
167
168Set Valid SOL Character Accumulate Level
169    [Documentation]  Verify valid SOL's character accumulate level via IPMI.
170    [Tags]  Set_Valid_SOL_Character_Accumulate_Level
171    [Template]  Verify SOL Setting
172
173    # Setting name              Min valid value    Max valid value
174    character-accumulate-level  1                  255
175
176
177Set Valid SOL Character Send Threshold
178    [Documentation]  Verify valid SOL's character send threshold via IPMI.
179    [Tags]  Set_Valid_SOL_Character_Send_Threshold
180    [Template]  Verify SOL Setting
181
182    # Setting name              Min valid value    Max valid value
183    character-send-threshold    0                  255
184
185*** Keywords ***
186
187Check IPMI SOL Output Content
188    [Documentation]  Check if SOL has given content.
189    [Arguments]  ${data}  ${file_path}=/tmp/sol_${OPENBMC_HOST}
190    # Description of argument(s):
191    # data       Content which need to be checked(e.g. Petitboot, ISTEP).
192    # file_path  The file path on the local machine to check SOL content.
193    #            By default it check SOL content from /tmp/sol_<BMC_IP>.
194
195    ${output}=  OperatingSystem.Get File  ${file_path}  encoding_errors=ignore
196    Should Contain  ${output}  ${data}  case_insensitive=True
197
198
199Verify SOL Setting
200    [Documentation]  Verify SOL Setting via IPMI.
201    [Arguments]  ${setting_name}  ${min_value}  ${max_value}
202    # Description of Arguments:
203    # setting_name    Setting to verify (e.g. "retry-count").
204    # min_value       min valid value for given setting.
205    # max_value       max valid value for given setting.
206
207    ${value}=
208    ...  Evaluate  random.randint(${min_value}, ${max_value})  modules=random
209
210    # Character accumulate level setting is set in multiples of 5.
211    # Retry interval setting is set in multiples of 10.
212    # Reference IPMI specification v2.0
213
214    ${expected_value}=  Run Keyword If
215    ...  '${setting_name}' == 'character-accumulate-level'  Evaluate  ${value}*5
216    ...  ELSE IF  '${setting_name}' == 'retry-interval'  Evaluate  ${value}*10
217    ...  ELSE  Set Variable  ${value}
218
219    Set SOL Setting  ${setting_name}  '${value}'
220
221    # Replace "-" with space " " in setting name.
222    # E.g. "retry-count" to "retry count"
223    ${setting_name}=  Evaluate  $setting_name.replace('-',' ')
224
225    ${sol_info_dict}=  Get SOL Info
226
227    # Get exact SOL setting name from sol info output.
228    ${list}=  Get Matches  ${sol_info_dict}  ${setting_name}*
229    ...  case_insensitive=${True}
230    ${setting_name_from_dict}=  Get From List  ${list}  0
231
232    # Get SOL setting value from above setting name.
233    ${setting_value}=  Get From Dictionary
234    ...  ${sol_info_dict}  ${setting_name_from_dict}
235
236    Should Be Equal  '${setting_value}'  '${expected_value}'
237
238    Redfish Hard Power Off
239
240    Initiate Host Boot Via External IPMI  wait=${0}
241
242    Activate SOL Via IPMI
243    Wait Until Keyword Succeeds  3 mins  15 secs
244    ...  Check IPMI SOL Output Content  Welcome to Hostboot
245
246    Wait Until Keyword Succeeds  3 mins  15 secs
247    ...  Check IPMI SOL Output Content  ISTEP
248
249
250Get SOL Setting
251    [Documentation]  Returns status for given SOL setting.
252    [Arguments]  ${setting}
253    # Description of argument(s):
254    # setting  SOL setting which needs to be read(e.g. "Retry Count").
255
256    ${sol_info_dict}=  Get SOL Info
257    ${setting_status}=  Get From Dictionary  ${sol_info_dict}  ${setting}
258
259    [Return]  ${setting_status}
260
261
262Restore Default SOL Configuration
263    [Documentation]  Restore default SOL configuration.
264
265    Set SOL Setting  enabled  true
266    Set SOL Setting  retry-count  7
267    Set SOL Setting  retry-interval  10
268    Set SOL Setting  character-accumulate-level  20
269    Set SOL Setting  character-send-threshold  1
270    Set SOL Setting  privilege-level  user
271
272
273Test Teardown Execution
274    [Documentation]  Do the post test teardown.
275
276    Wait Until Keyword Succeeds  15 sec  5 sec  Restore Default SOL Configuration
277    Deactivate SOL Via IPMI
278    ${sol_log}=  Stop SOL Console Logging
279    Log   ${sol_log}
280    FFDC On Test Case Fail
281