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