blob: 4f4b8f3569a81f4cb0d5b1789d9266c7d09ec70c [file] [log] [blame]
*** 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
${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 IPMI 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 IPMI 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 IPMI 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 IPMI 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}