1*** Settings *** 2Documentation This suite tests IPMI Payload in OpenBMC. 3 4Resource ../lib/ipmi_client.robot 5Resource ../lib/openbmc_ffdc.robot 6Resource ../lib/bmc_network_utils.robot 7Variables ../data/ipmi_raw_cmd_table.py 8Library ../lib/ipmi_utils.py 9 10 11Suite Setup IPMI Payload Setup Execution 12Test Teardown FFDC On Test Case Fail 13 14 15*** Variables *** 16${user_priv} 2 17${operator_priv} 3 18${admin_level_priv} 4 19${no_access_priv} 15 20${new_user_passwd} 0penBmc1 21${standard_payload_type_resp} 03 00 22${session_setup_payload_resp} 3f 00 23&{standard_payload_types} ipmi_message=0 sol=1 24&{session_setup_payload_types} RMCP+open_session_request=0x10 25 ... RMCP+open_session_response=0x11 26 ... RAKP_msg_1=0x12 27 ... RAKP_msg_2=0x13 28 ... RAKP_msg_3=0x14 29 ... RAKP_msg_4=0x15 30 31 32*** Test Cases *** 33 34Test Get Payload Activation Status 35 [Documentation] Test get payload activation status. 36 [Tags] Test_Get_Payload_Activation_Status 37 38 # SOL is the payload currently supported for payload status. 39 # Currently supports only one SOL session. 40 # Response Data 41 # 01 instance 1 is activated. 42 # 00 instance 1 is deactivated. 43 ${payload_status}= Get Payload Activation Status 44 Should Contain Any ${payload_status} 01 00 45 46 47Test Activate Payload 48 [Documentation] Test activate payload via IPMI raw command. 49 [Tags] Test_Activate_Payload 50 51 ${payload_status}= Get Payload Activation Status 52 Run Keyword If '${payload_status}' == '01' Deactivate Payload 53 54 Activate Payload 55 56 ${payload_status}= Get Payload Activation Status 57 Should Contain ${payload_status} 01 58 59 60Test Deactivate Payload 61 [Documentation] Test deactivate payload via IPMI raw command. 62 [Tags] Test_Deactivate_Payload 63 64 ${payload_status}= Get Payload Activation Status 65 Run Keyword If '${payload_status}' == '00' Activate Payload 66 67 Deactivate Payload 68 69 ${payload_status}= Get Payload Activation Status 70 Should Contain ${payload_status} 00 71 72 73Test Get Payload Instance Info 74 [Documentation] Test Get Payload Instance via IPMI raw command. 75 [Tags] Test_Get_Payload_Instance_Info 76 77 ${payload_status}= Get Payload Activation Status 78 Run keyword If '${payload_status}' == '01' 79 ... Deactivate Payload 80 81 # First four bytes should be 00 if given instance is not activated. 82 ${resp}= Run IPMI Command 83 ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} 84 Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} 85 Activate Payload 86 87 # First four bytes should be session ID when payload is activated. 88 ${resp}= Run IPMI Command 89 ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} 90 Should Not Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} 91 92 93Verify Set User Access Payload For Standard Payload SOL 94 [Documentation] Disable standard payload for SOL and verify IPMI sol activate command does not work. 95 [Tags] Verify_Set_User_Access_Payload_For_Standard_Payload_SOL 96 [Teardown] Run Keywords Set User Access Payload For Given User ${user_id_in_hex} 97 ... AND Delete Created User ${userid} 98 ... AND FFDC On Test Case Fail 99 100 ${userid} ${username}= Create And Verify IPMI User 101 ${user_id_in_hex}= Convert To Hex ${userid} 102 ${userid_in_hex_format}= Convert To Hex ${userid} prefix=0x length=2 103 104 # Get default user access payload values. 105 ${default_user_access_payload}= Get User Access Payload For Given Channel ${userid_in_hex_format} 106 107 # Disable Standard payload 1 via set user access payload command. 108 Set User Access Payload For Given User ${user_id_in_hex} Disable 109 110 Verify Standard Payload ${userid_in_hex_format} ${username} Disabled 111 112 113Verify Set User Access Payload For Operator Privileged User 114 [Documentation] Try to set user access payload using operator privileged user and expect error. 115 [Tags] Verify_Set_User_Access_Payload_For_Operator_Privileged_User 116 [Teardown] Run Keywords Delete Created User ${userid} AND FFDC On Test Case Fail 117 118 ${userid} ${username}= Create And Verify IPMI User ${operator_priv} Operator 119 120 ${payload_raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} 121 ... ${CHANNEL_NUMBER} 0x${user_id} 0x02 0x00 0x00 0x00 122 123 Run Keyword and Expect Error *Unable to establish IPMI* 124 ... Run External IPMI Raw Command ${payload_raw_cmd} U=${userid} P=${new_user_passwd} L=Operator 125 126 127Verify Set User Access Payload For Invalid User 128 [Documentation] Verify set user access payload IPMI command for invalid user. 129 [Tags] Verify_Set_User_Access_Payload_For_Invalid_User 130 131 # Get Random invalid user ID. 132 ${invalid_userid}= Get Invalid User ID 133 134 ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} 135 ... ${CHANNEL_NUMBER} ${invalid_userid} 0x02 0x00 0x00 0x00 136 137 Verify Invalid IPMI Command ${raw_cmd} 0xcc 138 139 140Verify Set User Access Payload For Invalid Channel Number 141 [Documentation] Verify set user access payload IPMI command for invalid channel number. 142 [Tags] Verify_Set_User_Access_Payload_For_Invalid_Channel_Number 143 [Teardown] Delete Created User ${userid} 144 145 ${userid} ${username}= Create And Verify IPMI User 146 147 FOR ${channel} IN @{inactive_channel_list} 148 149 Verify Set User Access Payload For Invalid Channel ${userid} ${channel} 150 END 151 152 153Verify Get User Access Payload For User Access privilege 154 [Documentation] Verify get user access payload for user access(Read-only) privileged user. 155 [Tags] Verify_Get_User_Access_Payload_For_User_Access_privilege 156 [Teardown] Delete Created User ${userid} 157 158 ${userid} ${username}= Create And Verify IPMI User ${user_priv} User 159 160 ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} 161 ... ${CHANNEL_NUMBER} ${user_id} 162 163 Run Keyword and Expect Error *Unable to establish IPMI* 164 ... Run External IPMI Raw Command ${raw_command} U=${userid} P=${new_user_passwd} L=User 165 166 167Verify Get User Access Payload For Invalid User 168 [Documentation] Verify get user access payload IPMI command for invalid user. 169 [Tags] Verify_Get_User_Access_Payload_For_Invalid_User 170 171 ${invalid_userid}= Get Invalid User ID 172 173 Verify Get User Access Payload For Invalid User Or Channel ${invalid_userid} ${CHANNEL_NUMBER} 174 175 176Verify Get User Access Payload For Invalid Channel Number 177 [Documentation] Verify get user access payload IPMI command for invalid channel number. 178 [Tags] Verify_Get_User_Access_Payload_For_Invalid_Channel_Number 179 [Teardown] Delete Created User ${userid} 180 181 ${userid} ${username}= Create And Verify IPMI User 182 #${invalid_channels}= Get Invalid Channel Number 183 184 FOR ${channel} IN @{inactive_channel_list} 185 Verify Get User Access Payload For Invalid User Or Channel ${userid} ${channel} 186 END 187 188 189Verify Get Channel Payload Version 190 [Documentation] Verify payload version for all supported payload type in 191 ... all active channels. 192 [Tags] Verify_Get_Channel_Payload_Version 193 [Template] Verify Payload Version 194 195 FOR ${channel} IN @{active_channel_list} 196 # Input Channel. 197 ${channel} 198 END 199 200Verify Get Channel Payload Version For Invalid Channel 201 [Documentation] Verify get channel payload version IPMI command for invalid channel. 202 [Tags] Verify_Get_Channel_Payload_Version_For_Invalid_Channel 203 [Template] Verify Payload Version For Invalid Channel 204 205 FOR ${invalid_channel_number} IN @{inactive_channel_list} 206 # channel number payload types. 207 ${invalid_channel_number} &{standard_payload_types} 208 ${invalid_channel_number} &{session_setup_payload_types} 209 END 210 211 212Verify Get Channel Payload Support 213 [Documentation] Verify get channel payload support IPMI command for active channels. 214 [Tags] Verify_Get_Channel_Payload_Support 215 [Template] Verify Payload Support 216 217 FOR ${channel} IN @{active_channel_list} 218 # Input channel. 219 ${channel} 220 END 221 222Verify Get Channel Payload Support For Invalid Channel 223 [Documentation] Verify get channel payload support IPMI command for invalid channels. 224 [Tags] Verify_Get_Channel_Payload_Support_For_Invalid_Channel 225 [Template] Verify Payload Support 226 227 FOR ${channel} IN @{inactive_channel_list} 228 # Input channel. Invalid channel intimation. 229 ${channel} ${1} 230 END 231 232 233*** Keywords *** 234 235IPMI Payload Setup Execution 236 [Documentation] Get active and inactive/invalid channels from channel_config.json file 237 ... in list type and set it as suite variable. 238 239 # Get active channel list and set as a suite variable. 240 @{active_channel_list}= Get Active Ethernet Channel List current_channel=1 241 Set Suite Variable @{active_channel_list} 242 243 # Get Inactive/Invalid channel list and set as a suite variable. 244 @{inactive_channel_list}= Get Invalid Channel Number List 245 Set Suite Variable @{inactive_channel_list} 246 247 248Get Payload Activation Status 249 [Documentation] Get payload activation status. 250 251 ${resp}= Run IPMI Command 252 ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Activation_Status'][0]} 253 254 @{resp}= Split String ${resp} 255 256 ${payload_status}= Set Variable ${resp[1]} 257 258 [return] ${payload_status} 259 260 261Activate Payload 262 [Documentation] Activate Payload. 263 264 ${resp}= Run IPMI Command 265 ... ${IPMI_RAW_CMD['Payload']['Activate_Payload'][0]} 266 Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Activate_Payload'][1]} 267 268 269Deactivate Payload 270 [Documentation] Deactivate Payload. 271 272 ${resp}= Run IPMI Command 273 ... ${IPMI_RAW_CMD['Payload']['Deactivate_Payload'][0]} 274 Should Be Empty ${resp} 275 276 277Get User Access Payload For Given Channel 278 [Documentation] Execute get user access payload IPMI command for given channel 279 ... and return response. 280 [Arguments] ${user_id} ${channel_number}=${CHANNEL_NUMBER} 281 282 # Description of argument(s): 283 # user_id The user ID (e.g. "1", "2", etc.). 284 # channel_number Input channel number(e.g. "1", "2"). 285 286 ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} 287 ... ${channel_number} ${user_id} 288 ${resp}= Run External IPMI Raw Command ${raw_command} 289 [Return] ${resp} 290 291 292Create And Verify IPMI User 293 [Documentation] Create IPMI User, set password, set privilege and enable the user. 294 [Arguments] ${user_privilege_level}=${admin_level_priv} ${privilege}=Administrator 295 296 # Description of argument(s): 297 # user_privilege_level User Privilege level in integer. 298 # (e.g. 4-Administrator, 3-Operator, 2-Readonly). 299 # privilege User Privilege in Wordings. 300 # (e.g. "Administrator", "Operator", "ReadOnly"). 301 302 ${random_user_id} ${random_user_name}= Create Random IPMI User 303 Set User Password ${random_user_id} ${new_user_passwd} 16 304 Set And Verify User Access Privilege ${random_user_id} ${user_privilege_level} 305 Verify Username And Password ${random_user_name} ${new_user_passwd} L=${privilege} 306 307 [Return] ${random_user_id} ${random_user_name} 308 309 310Set User Password 311 [Documentation] Set user password for given user ID. 312 [Arguments] ${user_id} ${password} ${password_option} 313 314 # Description of argument(s): 315 # user_id The user ID (e.g. "1", "2", etc.). 316 # password The user password (e.g. "0penBmc", "0penBmc1", etc.). 317 # password_option Password length option to be given in IPMI command (e.g. "16", "20"). 318 319 Run IPMI Standard Command user set password ${user_id} ${password} ${password_option} 320 321Set And Verify User Access Privilege 322 [Documentation] Set User Access Privilege, enable and verify user for given user ID. 323 [Arguments] ${user_id} ${privilege_level} 324 325 # Description of argument(s): 326 # user_id The user ID (e.g. "1", "2", etc.). 327 # privilege_level User Privilege level in hex value. 328 # (e.g. 0x04-Administrator, 0x03-Operator, 0x02-Readonly). 329 330 Set Channel Access ${_user_id} ipmi=on privilege=${privilege_level} 331 332 # Delay added for user privilege to get set. 333 Sleep 5s 334 335 Enable IPMI User And Verify ${user_id} 336 337 338Verify Username And Password 339 [Documentation] Verify that newly created user is able to run IPMI command 340 ... with given username and password. 341 [Arguments] ${username} ${password} &{options} 342 343 # Description of argument(s): 344 # username The user name (e.g. "root", "robert", etc.). 345 # password The user password (e.g. "0penBmc", "0penBmc1", etc.). 346 # options Additional ipmitool command options (e.g "-L=Operator","-C=3"). 347 348 Wait Until Keyword Succeeds 15 sec 5 sec Run External IPMI Raw Command 349 ... ${IPMI_RAW_CMD['Device GUID']['Get'][0]} U=${username} P=${password} &{options} 350 351 352Verify Standard Payload 353 [Documentation] Verify standard payload is disabled or enabled. 354 [Arguments] ${user_id} ${user_name} ${standard_payload}=Enabled 355 356 # Description of argument(s): 357 # user_id The user ID (e.g. "1", "2", etc.). 358 # username The user name (e.g. "root", "robert", etc.). 359 # standard_payload Enabled or Disabled. 360 361 # Verify the standard payload 1 (sol) is disabled. 362 ${get_user_access_payload}= Get User Access Payload For Given Channel ${user_id} 363 @{get_user_access_cmd_resp_list}= Split String ${get_user_access_payload} 364 365 Run Keyword If '${standard_payload}' == 'Disabled' 366 ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 00 367 ... ELSE 368 ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 02 369 370 Run Keyword If '${standard_payload}' == 'Disabled' 371 ... Verify Sol Activate Disabled ${user_name} 372 373 374Verify Sol Activate Disabled 375 [Documentation] Verify SOL activate IPMI command is not working. 376 [Arguments] ${user_name} 377 378 # Description of argument(s): 379 # username The user name (e.g. "root", "robert", etc.). 380 381 ${resp}= Run External IPMI Standard Command 382 ... sol activate expected_rc=${1} U=${username} P=${new_user_passwd} 383 384 Should Contain ${resp} SOL payload disabled 385 386 387Set User Access Payload For Given User 388 [Documentation] Set the user access payload on given user, channel and return response. 389 [Arguments] ${user_id} ${operation_mode}=Enable ${oempayload_value}=0x00 390 ... ${standard_payload_value}=0x02 391 392 # Description of argument(s): 393 # user_id The user ID (e.g. "1", "2", etc.). 394 # operation_mode Enable or Disable payload type. 395 # oempayload_value Oempayload in hex (e.g. "0x00", "0x01", "0x02", "0x04" etc). 396 # standard_payload_value Standard payload type IPMI or SOL. 397 # (e.g. 0x01 - IPMI, 0x02- SOL). 398 399 # If operation mode is disable 2nd byte of raw command is 4${user_id}. 400 # (e.g) 2n byte will be 0x4a (if user_id is a). 401 # If operation mode is enable 2nd byte of raw command is 0${user_id}. 402 # (e.g.) 3rd byte will be 0x0a (if user_id is a). 403 # 0x02- standard payload for SOL, 0x01 standard payload for IPMI. 404 # 3rd byte represent standard payload enables 1 (SOL). 405 # 4th to 6th byte represent standard payload enables 2 and OEM payload 1 & 2 respectively. 406 407 ${operation_mode_value}= Set Variable If '${operation_mode}' == 'Enable' 408 ... 0 4 409 ${set_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} 410 ... ${CHANNEL_NUMBER} 0x${operation_mode_value}${user_id} ${standard_payload_value} 0x00 ${oempayload_value} 0x00 411 412 ${resp}= Run IPMI Command ${set_cmd} 413 414 [Return] ${resp} 415 416 417Get Invalid User ID 418 [Documentation] Get random invalid user ID using "channel getaccess" IPMI standard command. 419 420 # Python module: get_user_info(userid, channel_number=1) 421 ${user_info}= Get User Info ${EMPTY} ${CHANNEL_NUMBER} 422 ${user_info}= Filter Struct ${user_info} [('user_name', None)] invert=1 423 ${empty_user_info}= Filter Struct ${user_info} [('user_name', '')] 424 @{invalid_userid_list}= Create List 425 FOR ${user_record} IN @{empty_user_info} 426 Append To List ${invalid_userid_list} ${user_record['user_id']} 427 END 428 ${invalid_user_id}= Evaluate random.choice(${invalid_userid_list}) random 429 430 [Return] ${invalid_user_id} 431 432 433Verify Set User Access Payload For Invalid Channel 434 [Documentation] Verify set user payload command for invalid channels. 435 [Arguments] ${user_id} ${channel_number} 436 437 # Description of argument(s): 438 # user_id The user ID (e.g. "1", "2", etc.). 439 # channel_number Input channel number. 440 441 ${channel_number}= Convert To Hex ${channel_number} prefix=0x 442 ${user_id}= Convert To Hex ${user_id} prefix=0x 443 ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} 444 ... ${channel_number} ${user_id} 0x02 0x00 0x00 0x00 445 446 Verify Invalid IPMI Command ${raw_cmd} 0xcc 447 448 449Verify Get User Access Payload For Invalid User Or Channel 450 [Documentation] Verify get user payload command for invalid userid or invalid channels. 451 [Arguments] ${user_id} ${channel_number} 452 453 # Description of argument(s): 454 # user_id The user ID (e.g. "1", "2", etc.). 455 # channel_number Input channel number. 456 457 ${channel_number}= Convert To Hex ${channel_number} prefix=0x 458 ${user_id}= Convert To Hex ${user_id} prefix=0x 459 ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} 460 ... ${channel_number} ${user_id} 461 462 Verify Invalid IPMI Command ${raw_cmd} 0xcc 463 464 465Verify Payload Type Version 466 [Documentation] Verify supported payload version. 467 [Arguments] ${channel_number} &{payload_type_dict} 468 469 # Description of argument(s): 470 # channel_number Input channel number. 471 # payload_type_dict Supported payload type in dictionary type. 472 # standard_payload_types and session_setup_payload_types which we use 473 # in this keyword are defined in variable section. 474 475 FOR ${payload_type_name} ${payload_type_number} IN &{payload_type_dict} 476 ${get_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Version'][0]} 477 ... ${channel_number} ${payload_type_number} 478 479 ${resp}= Run External IPMI Raw Command ${get_cmd} 480 ${resp}= Strip String ${resp} 481 Should Be Equal ${resp} 10 482 END 483 484 485Verify Payload Version For Invalid Channel 486 [Documentation] Verify payload version for invalid channel. 487 [Arguments] ${channel_number} &{payload_type_dict} 488 489 # Description of argument(s): 490 # channel_number Input channel number. 491 # payload_type_dict Supported payload type in dictionary type. 492 # standard_payload_types and session_setup_payload_types which we use 493 # in this keyword are defined in variable section. 494 495 ${channel_number}= Convert To Hex ${channel_number} prefix=0x 496 FOR ${payload_type_name} ${payload_type_number} IN &{payload_type_dict} 497 ${get_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Version'][0]} 498 ... ${channel_number} ${payload_type_number} 499 500 Verify Invalid IPMI Command ${get_cmd} 0xcc 501 END 502 503 504Verify Payload Version 505 [Documentation] Verify supported payload version on given channel number. 506 [Arguments] ${channel_number} 507 508 # Description of argument(s): 509 # channel_number Input channel number. 510 511 Verify Payload Type Version ${channel_number} &{standard_payload_types} 512 Verify Payload Type Version ${channel_number} &{session_setup_payload_types} 513 514 515Verify Payload Support 516 [Documentation] Verify payload support on given channel number. 517 [Arguments] ${channel_number} ${invalid_channel}=${0} 518 519 # Description of argument(s): 520 # channel_number Input channel number. 521 # invalid_channel This argument indicates whether we checking payload support command 522 # for Invalid channel or not. 523 # (e.g. 1 indicates checking for invalid channel, 0 indicates valid channel). 524 525 ${channel_number}= Convert To Hex ${channel_number} prefix=0x 526 ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Support'][0]} ${channel_number} 527 528 Run Keyword And Return If '${invalid_channel}' == '${1}' 529 ... Verify Invalid IPMI Command ${raw_cmd} 0xcc 530 531 # will be executed only if invalid_channel == 0. 532 ${resp}= Run External IPMI Raw Command ${raw_cmd} 533 534 ${resp}= Strip String ${resp} 535 ${expected_resp}= Catenate ${standard_payload_type_resp} ${session_setup_payload_resp} 00 00 00 00 536 Should Be Equal ${expected_resp} ${resp} 537