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