1*** Settings ***
2
3Documentation    Module to test IPMI asset tag functionality.
4Resource         ../lib/ipmi_client.robot
5Resource         ../lib/openbmc_ffdc.robot
6Resource         ../lib/bmc_network_utils.robot
7Variables        ../data/ipmi_raw_cmd_table.py
8Variables        ../data/ipmi_variable.py
9Library          ../lib/bmc_network_utils.py
10Library          ../lib/ipmi_utils.py
11
12Suite Setup      IPMI General Test Suite Setup
13Test Teardown    FFDC On Test Case Fail
14
15*** Test Cases ***
16
17Test Get Self Test Results via IPMI Raw Command
18    [Documentation]  Get self test results via IPMI raw command and verify the output.
19    [Tags]  Test_Get_Self_Test_Results_via_IPMI_Raw_Command
20
21    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Self_Test_Results']['Get'][0]}
22
23    # 55h = No error. All Self Tests Passed.
24    # 56h = Self Test function not implemented in this controller.
25    Should Contain Any  ${resp}  55 00  56 00
26
27
28Test Get Device GUID Via IPMI Raw Command
29    [Documentation]  Get device GUID via IPMI raw command and verify it using Redfish.
30    [Tags]  Test_Get_Device_GUID_Via_IPMI_Raw_Command
31    [Teardown]  Run Keywords  Redfish.Logout  AND  FFDC On Test Case Fail
32    # Get GUIDS via IPMI.
33    # This should match the /redfish/v1/Managers/bmc's UUID data.
34    ${guids}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Device GUID']['Get'][0]}
35    # Reverse the order and remove space delims.
36    ${guids}=  Split String  ${guids}
37    Reverse List  ${guids}
38    ${guids}=  Evaluate  "".join(${guids})
39
40    Redfish.Login
41    ${uuid}=  Redfish.Get Attribute  /redfish/v1/Managers/bmc  UUID
42    ${uuid}=  Remove String  ${uuid}  -
43
44    Rprint Vars  guids  uuid
45    Valid Value  uuid  ['${guids}']
46
47
48Verify Get Channel Info via IPMI
49    [Documentation]  Verify get channel info via IPMI.
50    [Tags]  Verify_Get_Channel_Info_via_IPMI
51
52    # Get channel info via ipmi command "ipmitool channel info [channel number]".
53    # Verify channel info with files "channel_access_volatile.json", "channel_access_nv.json"
54    # and "channel_config.json" in BMC.
55
56    # Example output from 'Get Channel Info':
57    # channel_info:
58    #   [channel_0x2_info]:
59    #     [channel_medium_type]:                        802.3 LAN
60    #     [channel_protocol_type]:                      IPMB-1.0
61    #     [session_support]:                            multi-session
62    #     [active_session_count]:                       0
63    #     [protocol_vendor_id]:                         7154
64    #   [volatile(active)_settings]:
65    #       [alerting]:                                 enabled
66    #       [per-message_auth]:                         enabled
67    #       [user_level_auth]:                          enabled
68    #       [access_mode]:                              always available
69    #   [Non-Volatile Settings]:
70    #       [alerting]:                                 enabled
71    #       [per-message_auth]:                         enabled
72    #       [user_level_auth]:                          enabled
73    #       [access_mode]:                              always available
74
75    ${channel_info_ipmi}=  Get Channel Info  ${CHANNEL_NUMBER}
76    ${active_channel_config}=  Get Active Channel Config
77    ${channel_volatile_data_config}=  Get Channel Access Config  /run/ipmi/channel_access_volatile.json
78    ${channel_nv_data_config}=  Get Channel Access Config  /var/lib/ipmi/channel_access_nv.json
79
80    Rprint Vars  channel_info_ipmi
81    Rprint Vars  active_channel_config
82    Rprint Vars  channel_volatile_data_config
83    Rprint Vars  channel_nv_data_config
84
85    Valid Value  medium_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_medium_type']}']
86    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['medium_type']}']
87
88    Valid Value  protocol_type_ipmi_conf_map['${channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['channel_protocol_type']}']
89    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['protocol_type']}']
90
91    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['session_support']
92    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['channel_info']['session_supported']}']
93
94    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['active_session_count']
95    ...  ['${active_channel_config['${CHANNEL_NUMBER}']['active_sessions']}']
96    # IPMI Spec: The IPMI Enterprise Number is: 7154 (decimal)
97    Valid Value  channel_info_ipmi['channel_0x${CHANNEL_NUMBER}_info']['protocol_vendor_id']  ['7154']
98
99    # Verify volatile(active)_settings
100    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['alerting']}']
101    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['alerting_disabled']}']
102
103    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['per-message_auth']}']
104    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['per_msg_auth_disabled']}']
105
106    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['user_level_auth']}']
107    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['user_auth_disabled']}']
108
109    Valid Value  access_mode_ipmi_conf_map['${channel_info_ipmi['volatile(active)_settings']['access_mode']}']
110    ...  ['${channel_volatile_data_config['${CHANNEL_NUMBER}']['access_mode']}']
111
112    # Verify Non-Volatile Settings
113    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['alerting']}']
114    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['alerting_disabled']}']
115
116    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['per-message_auth']}']
117    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['per_msg_auth_disabled']}']
118
119    Valid Value  disabled_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['user_level_auth']}']
120    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['user_auth_disabled']}']
121
122    Valid Value  access_mode_ipmi_conf_map['${channel_info_ipmi['non-volatile_settings']['access_mode']}']
123    ...  ['${channel_nv_data_config['${CHANNEL_NUMBER}']['access_mode']}']
124
125
126Test Get Channel Authentication Capabilities via IPMI
127    [Documentation]  Verify channel authentication capabilities via IPMI.
128    [Tags]  Test_Get_Channel_Authentication_Capabilities_via_IPMI
129    [Template]  Verify Channel Auth Capabilities
130
131    FOR  ${channel}  IN   @{active_channel_list}
132        FOR  ${privilege}  IN   4  3  2
133            # Input Channel     Privilege Level
134            ${channel}          ${privilege}
135        END
136    END
137
138
139Test Get Channel Authentication Capabilities IPMI Command For Invalid Channel
140    [Documentation]  Verify get channel authentication capabilities for invalid channel.
141    [Tags]  Test_Get_Channel_Authentication_Capabilities_IPMI_Command_For_Invalid_Channel
142    [Template]  Verify Channel Auth Capabilities For Invalid Channel
143
144    FOR  ${channel}  IN  @{inactive_channel_list}
145        # Input Channel
146        ${channel}
147    END
148
149
150Verify Get Channel Authentication Capabilities IPMI Raw Command With Invalid Data Length
151    [Documentation]  Verify get channel authentication capabilities IPMI raw command with invalid data length.
152    [Tags]  Verify_Get_Channel_Authentication_Capabilities_IPMI_Raw_Command_With_Invalid_Data_Length
153    [Template]  Verify Channel Auth Command For Invalid Data Length
154
155    # Bytes
156    low
157    high
158
159
160Verify Set Session Privilege Level via IPMI Raw Command
161    [Documentation]  Set session privilege with given privilege level and verify the response with
162    ...              expected level.
163    [Tags]  Verify_Set_Session_Privilege_Level_via_IPMI_Raw_Command
164    [Template]  Set Session Privilege Level And Verify
165
166    # privilege_level   expected_level
167    0x00                04
168    0x02                02
169    0x03                03
170    0x04                04
171
172
173Verify Set Invalid Session Privilege Level Via IPMI Raw Command
174    [Documentation]  Verify set invalid session privilege level via IPMI raw command.
175    [Tags]  Verify_Set_Invalid_Session_Privilege_Level_Via_IPMI_Raw_Command
176    [Template]  Set Invalid Session Privilege Level And Verify
177
178    # invalid_privilege_level
179    0x05
180    0x06
181    0x07
182    0x0F
183
184
185Verify Close Session Via IPMI
186    [Documentation]  Verify close session via IPMI.
187    [Tags]  Verify_Close_Session_Via_IPMI
188
189    # The "close session command" can be tested with any out-of-band IPMI command.
190    # When the session is about to close, it will execute the close session command at the end.
191
192    ${cmd}=  Catenate  mc info -vvv 2>&1 | grep "Closed Session"
193    ${cmd_output}=  Run External IPMI Standard Command  ${cmd}
194
195    Should Contain  ${cmd_output}  Closed Session
196
197
198Verify Chassis Identify via IPMI
199    [Documentation]  Set chassis identify using IPMI and verify.
200    [Tags]  Verify_Chassis_Identify_via_IPMI
201    [Setup]  Redfish.Login
202    [Teardown]  Redfish.logout
203
204    # Set to default "chassis identify" and verify that LED blinks for 15s.
205    Run IPMI Standard Command  chassis identify
206    Verify Identify LED State Via Redfish  Lit
207
208    Sleep  18s
209    Verify Identify LED State Via Redfish  Off
210
211    # Set "chassis identify" to 10s and verify that the LED blinks for 10s.
212    Run IPMI Standard Command  chassis identify 10
213    Verify Identify LED State Via Redfish  Lit
214
215    Sleep  12s
216    Verify Identify LED State Via Redfish  Off
217
218
219Verify Chassis Identify Off And Force Identify On via IPMI
220    [Documentation]  Set chassis identify to "off" and "force" using IPMI and verify.
221    [Tags]  Verify_Chassis_Identify_Off_And_Force_Identify_On_via_IPMI
222    [Setup]  Redfish.Login
223    [Teardown]  Redfish.logout
224
225    # Set the LED to "Force Identify On".
226    Run IPMI Standard Command  chassis identify force
227    Verify Identify LED State Via Redfish  Lit
228
229    # Set "chassis identify" to 0 and verify that the LED turns off.
230    Run IPMI Standard Command  chassis identify 0
231    Verify Identify LED State Via Redfish  Off
232
233
234*** Keywords ***
235
236IPMI General Test Suite Setup
237    [Documentation]  Get active and inactive/invalid channels from channel_config.json file
238    ...              in list type and set it as suite variable.
239
240    # Get active channel list and set as suite variable.
241    @{active_channel_list}=  Get Active Ethernet Channel List
242    Set Suite Variable  @{active_channel_list}
243
244    # Get Inactive/Invalid channel list and set as suite variable.
245    @{inactive_channel_list}=  Get Invalid Channel Number List
246    Set Suite Variable  @{inactive_channel_list}
247
248
249Set Session Privilege Level And Verify
250    [Documentation]   Set session privilege with given privilege level and verify the response with
251    ...               expected level.
252    [Arguments]  ${privilege_level}  ${expected_level}
253    # Description of argument(s):
254    # privilege_level    Requested Privilege Level.
255    # expected_level     New Privilege Level (or present level if ‘return present privilege level’
256    #                    was selected).
257
258    ${resp}=  Run External IPMI Raw Command
259    ...  0x06 0x3b ${privilege_level}
260    Should Contain  ${resp}  ${expected_level}
261
262
263Set Invalid Session Privilege Level And Verify
264    [Documentation]   Set invalid session privilege level and verify the response.
265    [Arguments]  ${privilege_level}
266    # Description of argument(s):
267    # privilege_level    Requested Privilege Level.
268
269    # Verify requested level exceeds Channel and/or User Privilege Limit.
270    ${msg}=  Run Keyword And Expect Error  *  Run External IPMI Raw Command
271    ...  0x06 0x3b ${privilege_level}
272    Should Contain  ${msg}  Unknown  rsp=0x81
273
274
275Verify Identify LED State Via Redfish
276    [Documentation]  Verify that Redfish identify LED system with given state.
277    [Arguments]  ${expected_state}
278    # Description of argument(s):
279    # expected_led_status  Expected value of Identify LED.
280
281    # Get the following URI(s) and iterate to find the attribute IndicatorLED.
282    # Example:
283    # /redfish/v1/Systems/system
284    # /redfish/v1/Systems/hypervisor
285
286    # Python module:  get_member_list(resource_path)
287    ${systems}=  Redfish_Utils.Get Member List  /redfish/v1/Systems
288    FOR  ${system}  IN  @{systems}
289        ${led_value}=  Redfish.Get Attribute  ${system}  IndicatorLED
290        # Get attribute return None if IndicatorLED does not exist in the URI.
291        Continue For Loop If  '${led_value}' == 'None'
292        Should Be True  '${led_value}' == '${expected_state}'
293    END
294
295
296Verify Channel Auth Capabilities
297    [Documentation]  Verify authentication capabilities for given channel and privilege.
298    [Arguments]  ${channel}  ${privilege_level}
299
300    # Description of argument(s):
301    # channel           Interface channel number.
302    # privilege_level   User Privilege level (e.g. 4-Administator, 3-Operator, 2-Readonly).
303
304    # Python module:  get_channel_auth_capabilities(channel_number, privilege_level)
305    ${channel_auth_cap}=  Get Channel Auth Capabilities  ${channel}  ${privilege_level}
306    Rprint Vars  channel_auth_cap
307
308    Valid Value  channel_auth_cap['channel_number']  ['${channel}']
309    Valid Value  channel_auth_cap['kg_status']  ['default (all zeroes)']
310    Valid Value  channel_auth_cap['per_message_authentication']  ['enabled']
311    Valid Value  channel_auth_cap['user_level_authentication']  ['enabled']
312    Valid Value  channel_auth_cap['non-null_user_names_exist']  ['yes']
313    Valid Value  channel_auth_cap['null_user_names_exist']  ['no']
314    Valid Value  channel_auth_cap['anonymous_login_enabled']  ['no']
315    Valid Value  channel_auth_cap['channel_supports_ipmi_v1.5']  ['no']
316    Valid Value  channel_auth_cap['channel_supports_ipmi_v2.0']  ['yes']
317
318
319Verify Channel Auth Capabilities For Invalid Channel
320    [Documentation]  Verify authentication capabilities of invalid channels.
321    [Arguments]  ${channel}
322
323    # Description of argument(s):
324    # channel   Interface channel number.
325
326    ${channel_in_hex}=  Convert To Hex  ${channel}  prefix=0x
327    ${cmd}=  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]} ${channel_in_hex} 0x04
328
329    Verify Invalid IPMI Command  ${cmd}  0xcc
330
331
332Verify Channel Auth Command For Invalid Data Length
333   [Documentation]  Verify channel authentication command for invalid data length.
334   [Arguments]  ${byte_length}
335
336   # Description of argument(s):
337   # byte_length   high or low.
338   #               e.g. high - add extra byte to request data like "0x06 0x38 0x01 0x04 0x01".
339   #               low - reduce bytes in actual request data like "0x06 0x38".
340
341   ${req_cmd}=  Run Keyword If  '${byte_length}' == 'low'
342   ...  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]}  ${CHANNEL_NUMBER}
343   ...  ELSE
344   ...  Catenate  ${IPMI_RAW_CMD['Get Channel Auth Cap']['get'][0]}  ${CHANNEL_NUMBER} 0x04 0x01
345
346   Verify Invalid IPMI Command  ${req_cmd}  0xc7
347