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 Power Off
129    Activate SOL Via IPMI
130    Redfish Power On
131
132    Check IPMI SOL Output Content  Welcome to Hostboot
133    Check IPMI SOL Output Content  ISTEP
134
135
136Verify Deactivate Non Existing SOL
137    [Documentation]  Verify deactivate non existing SOL session.
138    [Tags]  Verify_Deactivate_Non_Existing_SOL
139
140    ${resp}=  Deactivate SOL Via IPMI
141    Should Contain  ${resp}  SOL payload already de-activated
142    ...  case_insensitive=True
143
144
145Set Valid SOL Retry Count
146    [Documentation]  Verify valid SOL's retry count via IPMI.
147    [Tags]  Set_Valid_SOL_Retry_Count
148    [Template]  Verify SOL Setting
149
150    # Setting name    Min valid value    Max valid value
151    retry-count       0                  7
152
153
154Set Valid SOL Retry Interval
155    [Documentation]  Verify valid SOL's retry interval via IPMI.
156    [Tags]  Set_Valid_SOL_Retry_Interval
157    [Template]  Verify SOL Setting
158
159    # Setting name    Min valid value    Max valid value
160    retry-interval    0                  255
161
162
163Set Valid SOL Character Accumulate Level
164    [Documentation]  Verify valid SOL's character accumulate level via IPMI.
165    [Tags]  Set_Valid_SOL_Character_Accumulate_Level
166    [Template]  Verify SOL Setting
167
168    # Setting name              Min valid value    Max valid value
169    character-accumulate-level  1                  255
170
171
172Set Valid SOL Character Send Threshold
173    [Documentation]  Verify valid SOL's character send threshold via IPMI.
174    [Tags]  Set_Valid_SOL_Character_Send_Threshold
175    [Template]  Verify SOL Setting
176
177    # Setting name              Min valid value    Max valid value
178    character-send-threshold    0                  255
179
180*** Keywords ***
181
182Check IPMI SOL Output Content
183    [Documentation]  Check if SOL has given content.
184    [Arguments]  ${data}  ${file_path}=/tmp/sol_${OPENBMC_HOST}
185    # Description of argument(s):
186    # data       Content which need to be checked(e.g. Petitboot, ISTEP).
187    # file_path  The file path on the local machine to check SOL content.
188    #            By default it check SOL content from /tmp/sol_<BMC_IP>.
189
190    ${output}=  OperatingSystem.Get File  ${file_path}  encoding_errors=ignore
191    Should Contain  ${output}  ${data}  case_insensitive=True
192
193
194Verify SOL Setting
195    [Documentation]  Verify SOL Setting via IPMI.
196    [Arguments]  ${setting_name}  ${min_value}  ${max_value}
197    # Description of Arguments:
198    # setting_name    Setting to verify (e.g. "retry-count").
199    # min_value       min valid value for given setting.
200    # max_value       max valid value for given setting.
201
202    ${value}=
203    ...  Evaluate  random.randint(${min_value}, ${max_value})  modules=random
204
205    # Character accumulate level setting is set in multiples of 5.
206    # Retry interval setting is set in multiples of 10.
207    # Reference IPMI specification v2.0
208
209    ${expected_value}=  Run Keyword If
210    ...  '${setting_name}' == 'character-accumulate-level'  Evaluate  ${value}*5
211    ...  ELSE IF  '${setting_name}' == 'retry-interval'  Evaluate  ${value}*10
212    ...  ELSE  Set Variable  ${value}
213
214    Set SOL Setting  ${setting_name}  '${value}'
215
216    # Replace "-" with space " " in setting name.
217    # E.g. "retry-count" to "retry count"
218    ${setting_name}=  Evaluate  $setting_name.replace('-',' ')
219
220    ${sol_info_dict}=  Get SOL Info
221
222    # Get exact SOL setting name from sol info output.
223    ${list}=  Get Matches  ${sol_info_dict}  ${setting_name}*
224    ...  case_insensitive=${True}
225    ${setting_name_from_dict}=  Get From List  ${list}  0
226
227    # Get SOL setting value from above setting name.
228    ${setting_value}=  Get From Dictionary
229    ...  ${sol_info_dict}  ${setting_name_from_dict}
230
231    Should Be Equal  '${setting_value}'  '${expected_value}'
232
233    # Power on host to check if SOL is working fine with new setting.
234    ${current_state}=  Get Host State Via External IPMI
235    Run Keyword If  '${current_state}' == 'on'
236    ...  Initiate Host PowerOff Via External IPMI
237    Initiate Host Boot Via External IPMI  wait=${0}
238
239    Activate SOL Via IPMI
240    Wait Until Keyword Succeeds  10 mins  30 secs
241    ...  Check IPMI SOL Output Content  Welcome to Hostboot
242
243    Wait Until Keyword Succeeds  3 mins  30 secs
244    ...  Check IPMI SOL Output Content  ISTEP
245
246Get SOL Setting
247    [Documentation]  Returns status for given SOL setting.
248    [Arguments]  ${setting}
249    # Description of argument(s):
250    # setting  SOL setting which needs to be read(e.g. "Retry Count").
251
252    ${sol_info_dict}=  Get SOL Info
253    ${setting_status}=  Get From Dictionary  ${sol_info_dict}  ${setting}
254
255    [Return]  ${setting_status}
256
257
258Restore Default SOL Configuration
259    [Documentation]  Restore default SOL configuration.
260
261    Set SOL Setting  enabled  true
262    Set SOL Setting  retry-count  7
263    Set SOL Setting  retry-interval  10
264    Set SOL Setting  character-accumulate-level  20
265    Set SOL Setting  character-send-threshold  1
266    Set SOL Setting  privilege-level  user
267
268
269Test Teardown Execution
270    [Documentation]  Do the post test teardown.
271
272    Deactivate SOL Via IPMI
273    ${sol_log}=  Stop SOL Console Logging
274    Log   ${sol_log}
275    FFDC On Test Case Fail
276    Wait Until Keyword Succeeds  15 sec  5 sec  Restore Default SOL Configuration
277