| *** Settings *** |
| Documentation This suite tests IPMI Payload in OpenBMC. |
| |
| Resource ../lib/ipmi_client.robot |
| Resource ../lib/openbmc_ffdc.robot |
| Resource ../lib/bmc_network_utils.robot |
| Variables ../data/ipmi_raw_cmd_table.py |
| Library ../lib/ipmi_utils.py |
| |
| Suite Setup IPMI Payload Setup Execution |
| Test Teardown FFDC On Test Case Fail |
| |
| Force Tags IPMI_Payload |
| |
| *** Variables *** |
| |
| ${user_priv} 2 |
| ${operator_priv} 3 |
| ${admin_level_priv} 4 |
| ${no_access_priv} 15 |
| ${new_user_passwd} 0penBmc1 |
| ${standard_payload_type_resp} 03 00 |
| ${session_setup_payload_resp} 3f 00 |
| &{standard_payload_types} ipmi_message=0 sol=1 |
| &{session_setup_payload_types} RMCP+open_session_request=0x10 |
| ... RMCP+open_session_response=0x11 |
| ... RAKP_msg_1=0x12 |
| ... RAKP_msg_2=0x13 |
| ... RAKP_msg_3=0x14 |
| ... RAKP_msg_4=0x15 |
| |
| |
| *** Test Cases *** |
| |
| Test Get Payload Activation Status |
| [Documentation] Test get payload activation status. |
| [Tags] Test_Get_Payload_Activation_Status |
| |
| # SOL is the payload currently supported for payload status. |
| # Currently supports only one SOL session. |
| # Response Data |
| # 01 instance 1 is activated. |
| # 00 instance 1 is deactivated. |
| ${payload_status}= Get Payload Activation Status |
| Should Contain Any ${payload_status} 01 00 |
| |
| |
| Test Activate Payload |
| [Documentation] Test activate payload via IPMI raw command. |
| [Tags] Test_Activate_Payload |
| |
| ${payload_status}= Get Payload Activation Status |
| Run Keyword If '${payload_status}' == '01' Deactivate Payload |
| |
| Activate Payload |
| |
| ${payload_status}= Get Payload Activation Status |
| Should Contain ${payload_status} 01 |
| |
| |
| Test Deactivate Payload |
| [Documentation] Test deactivate payload via IPMI raw command. |
| [Tags] Test_Deactivate_Payload |
| |
| ${payload_status}= Get Payload Activation Status |
| Run Keyword If '${payload_status}' == '00' Activate Payload |
| |
| Deactivate Payload |
| |
| ${payload_status}= Get Payload Activation Status |
| Should Contain ${payload_status} 00 |
| |
| |
| Test Get Payload Instance Info |
| [Documentation] Test Get Payload Instance via IPMI raw command. |
| [Tags] Test_Get_Payload_Instance_Info |
| |
| ${payload_status}= Get Payload Activation Status |
| Run keyword If '${payload_status}' == '01' |
| ... Deactivate Payload |
| |
| # First four bytes should be 00 if given instance is not activated. |
| ${resp}= Run IPMI Command |
| ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} |
| Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} |
| Activate Payload |
| |
| # First four bytes should be session ID when payload is activated. |
| ${resp}= Run IPMI Command |
| ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][0]} |
| Should Not Contain ${resp} ${IPMI_RAW_CMD['Payload']['Get_Payload_Instance_Info'][1]} |
| |
| |
| Verify Set User Access Payload For Standard Payload SOL |
| [Documentation] Disable standard payload for SOL and verify IPMI sol activate command does not work. |
| [Tags] Verify_Set_User_Access_Payload_For_Standard_Payload_SOL |
| [Teardown] Run Keywords Set User Access Payload For Given User ${user_id_in_hex} |
| ... AND Delete Created User ${userid} |
| ... AND FFDC On Test Case Fail |
| |
| ${userid} ${username}= Create And Verify IPMI User |
| ${user_id_in_hex}= Convert To Hex ${userid} |
| ${userid_in_hex_format}= Convert To Hex ${userid} prefix=0x length=2 |
| |
| # Get default user access payload values. |
| ${default_user_access_payload}= Get User Access Payload For Given Channel ${userid_in_hex_format} |
| |
| # Disable Standard payload 1 via set user access payload command. |
| Set User Access Payload For Given User ${user_id_in_hex} Disable |
| |
| Verify Standard Payload ${userid_in_hex_format} ${username} Disabled |
| |
| |
| Verify Set User Access Payload For Operator Privileged User |
| [Documentation] Try to set user access payload using operator privileged user and expect error. |
| [Tags] Verify_Set_User_Access_Payload_For_Operator_Privileged_User |
| [Teardown] Run Keywords Delete Created User ${userid} AND FFDC On Test Case Fail |
| |
| ${userid} ${username}= Create And Verify IPMI User ${operator_priv} Operator |
| |
| ${payload_raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| ... ${CHANNEL_NUMBER} 0x${user_id} 0x02 0x00 0x00 0x00 |
| |
| Run Keyword and Expect Error *Unable to establish IPMI* |
| ... Run External IPMI Raw Command ${payload_raw_cmd} U=${userid} P=${new_user_passwd} L=Operator |
| |
| |
| Verify Set User Access Payload For Invalid User |
| [Documentation] Verify set user access payload IPMI command for invalid user. |
| [Tags] Verify_Set_User_Access_Payload_For_Invalid_User |
| |
| # Get Random invalid user ID. |
| ${invalid_userid}= Get Invalid User ID |
| |
| ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| ... ${CHANNEL_NUMBER} ${invalid_userid} 0x02 0x00 0x00 0x00 |
| |
| Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| |
| |
| Verify Set User Access Payload For Invalid Channel Number |
| [Documentation] Verify set user access payload IPMI command for invalid channel number. |
| [Tags] Verify_Set_User_Access_Payload_For_Invalid_Channel_Number |
| [Teardown] Delete Created User ${userid} |
| |
| ${userid} ${username}= Create And Verify IPMI User |
| |
| FOR ${channel} IN @{inactive_channel_list} |
| |
| Verify Set User Access Payload For Invalid Channel ${userid} ${channel} |
| END |
| |
| |
| Verify Get User Access Payload For User Access privilege |
| [Documentation] Verify get user access payload for user access(Read-only) privileged user. |
| [Tags] Verify_Get_User_Access_Payload_For_User_Access_privilege |
| [Teardown] Delete Created User ${userid} |
| |
| ${userid} ${username}= Create And Verify IPMI User ${user_priv} User |
| |
| ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| ... ${CHANNEL_NUMBER} ${user_id} |
| |
| Run Keyword and Expect Error *Unable to establish IPMI* |
| ... Run External IPMI Raw Command ${raw_command} U=${userid} P=${new_user_passwd} L=User |
| |
| |
| Verify Get User Access Payload For Invalid User |
| [Documentation] Verify get user access payload IPMI command for invalid user. |
| [Tags] Verify_Get_User_Access_Payload_For_Invalid_User |
| |
| ${invalid_userid}= Get Invalid User ID |
| |
| Verify Get User Access Payload For Invalid User Or Channel ${invalid_userid} ${CHANNEL_NUMBER} |
| |
| |
| Verify Get User Access Payload For Invalid Channel Number |
| [Documentation] Verify get user access payload IPMI command for invalid channel number. |
| [Tags] Verify_Get_User_Access_Payload_For_Invalid_Channel_Number |
| [Teardown] Delete Created User ${userid} |
| |
| ${userid} ${username}= Create And Verify IPMI User |
| #${invalid_channels}= Get Invalid Channel Number |
| |
| FOR ${channel} IN @{inactive_channel_list} |
| Verify Get User Access Payload For Invalid User Or Channel ${userid} ${channel} |
| END |
| |
| |
| Verify Get Channel Payload Version |
| [Documentation] Verify payload version for all supported payload type in |
| ... all active channels. |
| [Tags] Verify_Get_Channel_Payload_Version |
| [Template] Verify Payload Version |
| |
| FOR ${channel} IN @{active_channel_list} |
| # Input Channel. |
| ${channel} |
| END |
| |
| Verify Get Channel Payload Version For Invalid Channel |
| [Documentation] Verify get channel payload version IPMI command for invalid channel. |
| [Tags] Verify_Get_Channel_Payload_Version_For_Invalid_Channel |
| [Template] Verify Payload Version For Invalid Channel |
| |
| FOR ${invalid_channel_number} IN @{inactive_channel_list} |
| # channel number payload types. |
| ${invalid_channel_number} &{standard_payload_types} |
| ${invalid_channel_number} &{session_setup_payload_types} |
| END |
| |
| |
| Verify Get Channel Payload Support |
| [Documentation] Verify get channel payload support IPMI command for active channels. |
| [Tags] Verify_Get_Channel_Payload_Support |
| [Template] Verify Payload Support |
| |
| FOR ${channel} IN @{active_channel_list} |
| # Input channel. |
| ${channel} |
| END |
| |
| Verify Get Channel Payload Support For Invalid Channel |
| [Documentation] Verify get channel payload support IPMI command for invalid channels. |
| [Tags] Verify_Get_Channel_Payload_Support_For_Invalid_Channel |
| [Template] Verify Payload Support |
| |
| FOR ${channel} IN @{inactive_channel_list} |
| # Input channel. Invalid channel intimation. |
| ${channel} ${1} |
| END |
| |
| |
| *** Keywords *** |
| |
| IPMI Payload Setup Execution |
| [Documentation] Get active and inactive/invalid channels from channel_config.json file |
| ... in list type and set it as suite variable. |
| |
| # Get active channel list and set as a suite variable. |
| @{active_channel_list}= Get Active Ethernet Channel List current_channel=1 |
| Set Suite Variable @{active_channel_list} |
| |
| # Get Inactive/Invalid channel list and set as a suite variable. |
| @{inactive_channel_list}= Get Invalid Channel Number List |
| Set Suite Variable @{inactive_channel_list} |
| |
| |
| Get Payload Activation Status |
| [Documentation] Get payload activation status. |
| |
| ${resp}= Run IPMI Command |
| ... ${IPMI_RAW_CMD['Payload']['Get_Payload_Activation_Status'][0]} |
| |
| @{resp}= Split String ${resp} |
| |
| ${payload_status}= Set Variable ${resp[1]} |
| |
| [return] ${payload_status} |
| |
| |
| Activate Payload |
| [Documentation] Activate Payload. |
| |
| ${resp}= Run IPMI Command |
| ... ${IPMI_RAW_CMD['Payload']['Activate_Payload'][0]} |
| Should Contain ${resp} ${IPMI_RAW_CMD['Payload']['Activate_Payload'][1]} |
| |
| |
| Deactivate Payload |
| [Documentation] Deactivate Payload. |
| |
| ${resp}= Run IPMI Command |
| ... ${IPMI_RAW_CMD['Payload']['Deactivate_Payload'][0]} |
| Should Be Empty ${resp} |
| |
| |
| Get User Access Payload For Given Channel |
| [Documentation] Execute get user access payload IPMI command for given channel |
| ... and return response. |
| [Arguments] ${user_id} ${channel_number}=${CHANNEL_NUMBER} |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # channel_number Input channel number(e.g. "1", "2"). |
| |
| ${raw_command}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| ... ${channel_number} ${user_id} |
| ${resp}= Run External IPMI Raw Command ${raw_command} |
| [Return] ${resp} |
| |
| |
| Create And Verify IPMI User |
| [Documentation] Create IPMI User, set password, set privilege and enable the user. |
| [Arguments] ${user_privilege_level}=${admin_level_priv} ${privilege}=Administrator |
| |
| # Description of argument(s): |
| # user_privilege_level User Privilege level in integer. |
| # (e.g. 4-Administrator, 3-Operator, 2-Readonly). |
| # privilege User Privilege in Wordings. |
| # (e.g. "Administrator", "Operator", "ReadOnly"). |
| |
| ${random_user_id} ${random_user_name}= Create Random IPMI User |
| Set User Password ${random_user_id} ${new_user_passwd} 16 |
| Set And Verify User Access Privilege ${random_user_id} ${user_privilege_level} |
| Verify Username And Password ${random_user_name} ${new_user_passwd} L=${privilege} |
| |
| [Return] ${random_user_id} ${random_user_name} |
| |
| |
| Set User Password |
| [Documentation] Set user password for given user ID. |
| [Arguments] ${user_id} ${password} ${password_option} |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # password The user password (e.g. "0penBmc", "0penBmc1", etc.). |
| # password_option Password length option to be given in IPMI command (e.g. "16", "20"). |
| |
| Run IPMI Standard Command user set password ${user_id} ${password} ${password_option} |
| |
| Set And Verify User Access Privilege |
| [Documentation] Set User Access Privilege, enable and verify user for given user ID. |
| [Arguments] ${user_id} ${privilege_level} |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # privilege_level User Privilege level in hex value. |
| # (e.g. 0x04-Administrator, 0x03-Operator, 0x02-Readonly). |
| |
| Set Channel Access ${_user_id} ipmi=on privilege=${privilege_level} |
| |
| # Delay added for user privilege to get set. |
| Sleep 5s |
| |
| Enable IPMI User And Verify ${user_id} |
| |
| |
| Verify Username And Password |
| [Documentation] Verify that newly created user is able to run IPMI command |
| ... with given username and password. |
| [Arguments] ${username} ${password} &{options} |
| |
| # Description of argument(s): |
| # username The user name (e.g. "root", "robert", etc.). |
| # password The user password (e.g. "0penBmc", "0penBmc1", etc.). |
| # options Additional ipmitool command options (e.g "-L=Operator","-C=3"). |
| |
| Wait Until Keyword Succeeds 15 sec 5 sec Run External IPMI Raw Command |
| ... ${IPMI_RAW_CMD['Device GUID']['Get'][0]} U=${username} P=${password} &{options} |
| |
| |
| Verify Standard Payload |
| [Documentation] Verify standard payload is disabled or enabled. |
| [Arguments] ${user_id} ${user_name} ${standard_payload}=Enabled |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # username The user name (e.g. "root", "robert", etc.). |
| # standard_payload Enabled or Disabled. |
| |
| # Verify the standard payload 1 (sol) is disabled. |
| ${get_user_access_payload}= Get User Access Payload For Given Channel ${user_id} |
| @{get_user_access_cmd_resp_list}= Split String ${get_user_access_payload} |
| |
| Run Keyword If '${standard_payload}' == 'Disabled' |
| ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 00 |
| ... ELSE |
| ... Should Be Equal ${get_user_access_cmd_resp_list}[0] 02 |
| |
| Run Keyword If '${standard_payload}' == 'Disabled' |
| ... Verify Sol Activate Disabled ${user_name} |
| |
| |
| Verify Sol Activate Disabled |
| [Documentation] Verify SOL activate IPMI command is not working. |
| [Arguments] ${user_name} |
| |
| # Description of argument(s): |
| # username The user name (e.g. "root", "robert", etc.). |
| |
| ${resp}= Run External IPMI Standard Command |
| ... sol activate expected_rc=${1} U=${username} P=${new_user_passwd} |
| |
| Should Contain ${resp} SOL payload disabled |
| |
| |
| Set User Access Payload For Given User |
| [Documentation] Set the user access payload on given user, channel and return response. |
| [Arguments] ${user_id} ${operation_mode}=Enable ${oempayload_value}=0x00 |
| ... ${standard_payload_value}=0x02 |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # operation_mode Enable or Disable payload type. |
| # oempayload_value Oempayload in hex (e.g. "0x00", "0x01", "0x02", "0x04" etc). |
| # standard_payload_value Standard payload type IPMI or SOL. |
| # (e.g. 0x01 - IPMI, 0x02- SOL). |
| |
| # If operation mode is disable 2nd byte of raw command is 4${user_id}. |
| # (e.g) 2n byte will be 0x4a (if user_id is a). |
| # If operation mode is enable 2nd byte of raw command is 0${user_id}. |
| # (e.g.) 3rd byte will be 0x0a (if user_id is a). |
| # 0x02- standard payload for SOL, 0x01 standard payload for IPMI. |
| # 3rd byte represent standard payload enables 1 (SOL). |
| # 4th to 6th byte represent standard payload enables 2 and OEM payload 1 & 2 respectively. |
| |
| ${operation_mode_value}= Set Variable If '${operation_mode}' == 'Enable' |
| ... 0 4 |
| ${set_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| ... ${CHANNEL_NUMBER} 0x${operation_mode_value}${user_id} ${standard_payload_value} 0x00 ${oempayload_value} 0x00 |
| |
| ${resp}= Run IPMI Command ${set_cmd} |
| |
| [Return] ${resp} |
| |
| |
| Get Invalid User ID |
| [Documentation] Get random invalid user ID using "channel getaccess" IPMI standard command. |
| |
| # Python module: get_user_info(userid, channel_number=1) |
| ${user_info}= Get User Info ${EMPTY} ${CHANNEL_NUMBER} |
| ${user_info}= Filter Struct ${user_info} [('user_name', None)] invert=1 |
| ${empty_user_info}= Filter Struct ${user_info} [('user_name', '')] |
| @{invalid_userid_list}= Create List |
| FOR ${user_record} IN @{empty_user_info} |
| Append To List ${invalid_userid_list} ${user_record['user_id']} |
| END |
| ${invalid_user_id}= Evaluate random.choice(${invalid_userid_list}) random |
| |
| [Return] ${invalid_user_id} |
| |
| |
| Verify Set User Access Payload For Invalid Channel |
| [Documentation] Verify set user payload command for invalid channels. |
| [Arguments] ${user_id} ${channel_number} |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # channel_number Input channel number. |
| |
| ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| ${user_id}= Convert To Hex ${user_id} prefix=0x |
| ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Set_User_Access_Payload'][0]} |
| ... ${channel_number} ${user_id} 0x02 0x00 0x00 0x00 |
| |
| Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| |
| |
| Verify Get User Access Payload For Invalid User Or Channel |
| [Documentation] Verify get user payload command for invalid userid or invalid channels. |
| [Arguments] ${user_id} ${channel_number} |
| |
| # Description of argument(s): |
| # user_id The user ID (e.g. "1", "2", etc.). |
| # channel_number Input channel number. |
| |
| ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| ${user_id}= Convert To Hex ${user_id} prefix=0x |
| ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_User_Access_Payload'][0]} |
| ... ${channel_number} ${user_id} |
| |
| Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| |
| |
| Verify Payload Type Version |
| [Documentation] Verify supported payload version. |
| [Arguments] ${channel_number} &{payload_type_dict} |
| |
| # Description of argument(s): |
| # channel_number Input channel number. |
| # payload_type_dict Supported payload type in dictionary type. |
| # standard_payload_types and session_setup_payload_types which we use |
| # in this keyword are defined in variable section. |
| |
| FOR ${payload_type_name} ${payload_type_number} IN &{payload_type_dict} |
| ${get_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Version'][0]} |
| ... ${channel_number} ${payload_type_number} |
| |
| ${resp}= Run External IPMI Raw Command ${get_cmd} |
| ${resp}= Strip String ${resp} |
| Should Be Equal ${resp} 10 |
| END |
| |
| |
| Verify Payload Version For Invalid Channel |
| [Documentation] Verify payload version for invalid channel. |
| [Arguments] ${channel_number} &{payload_type_dict} |
| |
| # Description of argument(s): |
| # channel_number Input channel number. |
| # payload_type_dict Supported payload type in dictionary type. |
| # standard_payload_types and session_setup_payload_types which we use |
| # in this keyword are defined in variable section. |
| |
| ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| FOR ${payload_type_name} ${payload_type_number} IN &{payload_type_dict} |
| ${get_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Version'][0]} |
| ... ${channel_number} ${payload_type_number} |
| |
| Verify Invalid IPMI Command ${get_cmd} 0xcc |
| END |
| |
| |
| Verify Payload Version |
| [Documentation] Verify supported payload version on given channel number. |
| [Arguments] ${channel_number} |
| |
| # Description of argument(s): |
| # channel_number Input channel number. |
| |
| Verify Payload Type Version ${channel_number} &{standard_payload_types} |
| Verify Payload Type Version ${channel_number} &{session_setup_payload_types} |
| |
| |
| Verify Payload Support |
| [Documentation] Verify payload support on given channel number. |
| [Arguments] ${channel_number} ${invalid_channel}=${0} |
| |
| # Description of argument(s): |
| # channel_number Input channel number. |
| # invalid_channel This argument indicates whether we checking payload support command |
| # for Invalid channel or not. |
| # (e.g. 1 indicates checking for invalid channel, 0 indicates valid channel). |
| |
| ${channel_number}= Convert To Hex ${channel_number} prefix=0x |
| ${raw_cmd}= Catenate ${IPMI_RAW_CMD['Payload']['Get_Channel_Payload_Support'][0]} ${channel_number} |
| |
| Run Keyword And Return If '${invalid_channel}' == '${1}' |
| ... Verify Invalid IPMI Command ${raw_cmd} 0xcc |
| |
| # will be executed only if invalid_channel == 0. |
| ${resp}= Run External IPMI Raw Command ${raw_cmd} |
| |
| ${resp}= Strip String ${resp} |
| ${expected_resp}= Catenate ${standard_payload_type_resp} ${session_setup_payload_resp} 00 00 00 00 |
| Should Be Equal ${expected_resp} ${resp} |