blob: ed3d4f25f97c3859539a758d809c976350cc1737 [file] [log] [blame]
*** Settings ***
Documentation This suite tests IPMI Cold Reset in OpenBMC.
...
... The Cold reset command directs the Responder to perform
... a 'Cold Reset' action, which causes default setting of
... interrupt enables, event message generation,sensor scanning,
... threshold values, and other 'power up' default state to be restored.
...
... The script consist of 3 testcases:
... - Cold_Reset_Via_IPMI
... - Cold_Reset_With_Invalid_Data_Request_Via_IPMI
... - Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI
...
... The script verifies command execution for cold reset,
... invalid data request verification of cold reset and
... impact on sensor threshold value change with cold reset.
...
... The script changes sensor threshold value for Fan sensor,
... executes cold reset IPMI command,
... compares sensor threshold values of initial and reading after cold reset.
...
... Request data for cold reset present under data/ipmi_raw_cmd_table.py
Resource ../lib/ipmi_client.robot
Resource ../lib/openbmc_ffdc.robot
Library Collections
Library ../lib/ipmi_utils.py
Variables ../data/ipmi_raw_cmd_table.py
Test Teardown FFDC On Test Case Fail
Force Tags IPMI_Cold_Reset
*** Variables ***
${NETWORK_RESTART_TIME} 30s
@{thresholds_list} lcr lnc unc ucr
*** Test Cases ***
Cold Reset Via IPMI
[Documentation] Verify Cold Reset via IPMI.
[Tags] Cold_Reset_Via_IPMI
# Cold Reset Via IPMI raw command.
Run IPMI Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]}
# Get the BMC Status.
Wait Until Keyword Succeeds 3 min 10 sec Is BMC Unpingable
Wait Until Keyword Succeeds 3 min 10 sec Is BMC Operational
# Verify if BMC restarted with Get Device ID command.
${resp}= Run IPMI Command ${IPMI_RAW_CMD['Device ID']['Get'][0]}
Should Not Contain ${resp} ${IPMI_RAW_CMD['Device ID']['Get'][1]}
Cold Reset With Invalid Data Request Via IPMI
[Documentation] Verify Cold Reset with invalid data request via IPMI.
[Tags] Cold_Reset_With_Invalid_Data_Request_Via_IPMI
# Verify cold reset with invalid length of the request data and expect error.
${resp}= Run Keyword and Expect Error *Request data length invalid*
... Run IPMI Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} 0x00
Verify Cold Reset Impact On Sensor Threshold Via IPMI
[Documentation] Modify sensor threshold, perform cold reset,
... and verify if sensor threshold reverts back to initial value.
[Tags] Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI
# Get sensor list.
${sensor_list}= Get Sensor List
# Get initial sensor threshold readings.
${sensor_name} ${sensor_threshold}= Get The Sensor Name And Threshold ${sensor_list}
${threshold_key_list}= Get Dictionary Keys ${sensor_threshold}
${random_threshold_key}= Evaluate random.choice(${threshold_key_list}) random
${old_threshold_value}= Get From Dictionary ${sensor_threshold} ${random_threshold_key}
# Modify Default Threshold Value For An Sensor To Set An New Threshold Value
${new_settable_threshold_value}= Modify Default Sensor Threshold Value ${old_threshold_value}
# Set/Get sensor threshold for given sensor and compare with initial reading.
${new_threshold_value}= Set And Get Sensor Threshold For given Sensor ${sensor_name} ${random_threshold_key}
... ${new_settable_threshold_value}
Should Not Be Equal ${new_threshold_value} ${old_threshold_value}
# Cold Reset Via IPMI raw command.
Run IPMI Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]}
# Get the BMC Status.
Wait Until Keyword Succeeds 3 min 10 sec Is BMC Unpingable
Wait Until Keyword Succeeds 10 min 10 sec Is BMC Operational
# Get sensor data for the sensor identified.
${data_after_coldreset}= Wait Until Keyword Succeeds 2 min 30 sec
... Run IPMI Standard Command sensor | grep -i "${sensor_name}"
# Get sensor threshold readings after BMC restarts.
${threshold_value_after_reset}= Getting Sensor Threshold Value Based On Threshold Key ${random_threshold_key} ${sensor_name}
# Compare with initial sensor threshold values.
Should Be Equal ${threshold_value_after_reset} ${old_threshold_value}
*** Keywords ***
Get Sensor List
[Documentation] To get the list of sensors via IPMI sensor list.
# BMC may take time to populate all the sensors once BMC Cold reset completes.
${data}= Wait Until Keyword Succeeds 2 min 30 sec
... Run IPMI Standard Command sensor
RETURN ${data}
Get The Sensor Name And Threshold
[Documentation] To get the sensor threshold for given sensor using IPMI.
[Arguments] ${sensor_list}
# Description of Argument(s):
# ${sensor_list} All the sensors listed with ipmi sensor list command.
@{tmp_list}= Create List
@{sensor_list_lines}= Split To Lines ${sensor_list}
# Omit the discrete sensor and create an threshold sensor name list
FOR ${sensor} IN @{sensor_list_lines}
${discrete_sensor_status}= Run Keyword And Return Status Should Contain ${sensor} discrete
Continue For Loop If '${discrete_sensor_status}' == 'True'
${sensor_details}= Split String ${sensor} |
${get_sensor_name}= Get From List ${sensor_details} 0
${sensor_name}= Set Variable ${get_sensor_name.strip()}
Append To List ${tmp_list} ${sensor_name}
END
${sensor_count}= Get Length ${tmp_list}
FOR ${RANGE} IN RANGE 0 ${sensor_count}
${random_sensor} ${sensor_threshold}= Selecting Random Sensor Name And Threshold Value ${tmp_list} ${sensor_list}
${threshold_dict_count}= Get Length ${sensor_threshold}
Exit For Loop If '${threshold_dict_count}' != '0'
Remove Values From List ${tmp_list} ${random_sensor}
END
RETURN ${random_sensor} ${sensor_threshold}
Selecting Random Sensor Name And Threshold Value
[Documentation] Select Random Sensor Name And Threshold Values.
[Arguments] ${tmp_list} ${sensor_list}
# Selecting random sensors from sensor list
${random_sensor_name}= Evaluate random.choice(${tmp_list}) random
# Create Dictionary For Threshold Key With Threshold Values
&{tmp_dict}= Create Dictionary
${sensor_threshold}= Get Lines Containing String ${sensor_list} ${random_sensor_name}
@{ipmi_sensor}= Split String ${sensor_threshold} |
${get_ipmi_lower_non_recoverable_threshold}= Get From List ${ipmi_sensor} 4
${ipmi_lower_non_recoverable_threshold}= Set Variable ${get_ipmi_lower_non_recoverable_threshold.strip()}
${lower_non_recoverable_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_lower_non_recoverable_threshold} na
Run Keyword If '${lower_non_recoverable_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} lnr ${ipmi_lower_non_recoverable_threshold}
${get_ipmi_lower_critical_threshold}= Get From List ${ipmi_sensor} 5
${ipmi_lower_critical_threshold}= Set Variable ${get_ipmi_lower_critical_threshold.strip()}
${lower_critical_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_lower_critical_threshold} na
Run Keyword If '${lower_critical_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} lcr ${ipmi_lower_critical_threshold}
${get_ipmi_lower_non_critical_threshold}= Get From List ${ipmi_sensor} 6
${ipmi_lower_non_critical_threshold}= Set Variable ${get_ipmi_lower_non_critical_threshold.strip()}
${lower_non_critical_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_lower_non_critical_threshold} na
Run Keyword If '${lower_non_critical_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} lnc ${ipmi_lower_non_critical_threshold}
${get_ipmi_upper_non_critical_threshold}= Get From List ${ipmi_sensor} 7
${ipmi_upper_non_critical_threshold}= Set Variable ${get_ipmi_upper_non_critical_threshold.strip()}
${upper_non_critical_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_upper_non_critical_threshold} na
Run Keyword If '${upper_non_critical_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} unc ${ipmi_upper_non_critical_threshold}
${get_ipmi_upper_critical_threshold}= Get From List ${ipmi_sensor} 8
${ipmi_upper_critical_threshold}= Set Variable ${get_ipmi_upper_critical_threshold.strip()}
${upper_critical_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_upper_critical_threshold} na
Run Keyword If '${upper_critical_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} ucr ${ipmi_upper_critical_threshold}
${get_ipmi_upper_non_recoverable_threshold}= Get From List ${ipmi_sensor} 9
${ipmi_upper_non_recoverable_threshold}= Set Variable ${get_ipmi_upper_non_recoverable_threshold.strip()}
${upper_non_recoverable_threshold_status}= Run Keyword And Return Status Should Not Contain
... ${ipmi_upper_non_recoverable_threshold} na
Run Keyword If '${upper_non_recoverable_threshold_status}' == 'True'
... Set To Dictionary ${tmp_dict} unr ${ipmi_upper_non_recoverable_threshold}
RETURN ${random_sensor_name} ${tmp_dict}
Modify Default Sensor Threshold Value
[Documentation] Modify Default Sensor Threshold Value with adding 100 to old threshold values.
[Arguments] ${old_threshold}
${new_threshold}= Evaluate ${old_threshold} + 100
RETURN ${new_threshold}
Set And Get Sensor Threshold For given Sensor
[Documentation] Set/Get Sensor Threshold for given sensor Via IPMI.
[Arguments] ${sensor_name} ${random_threshold_key} ${new_settable_threshold_value}
# Set New Threshold Value To The Randomly Selected Sensor.
Run IPMI Standard Command sensor thresh "${sensor_name}" ${random_threshold_key} ${new_settable_threshold_value}
Sleep 10s
${sensor_new_threshold_value}= Getting Sensor Threshold Value Based On Threshold Key ${random_threshold_key} ${sensor_name}
RETURN ${sensor_new_threshold_value}
Getting Sensor Threshold Value Based On Threshold Key
[Documentation] Getting Particular Sensor Threshold Value Based On Sensor Name And Threshold Key.
[Arguments] ${threshold_key} ${sensor_name}
# After Setting Threshold Value, Get New Sensor Threshold Value.
${new_data}= Run IPMI Standard Command sensor | grep -i "${sensor_name}"
${new_sensor_details}= Split String ${new_data} |
${index_value}= Set Variable If
... '${threshold_key}' == 'lnr' ${4}
... '${threshold_key}' == 'lcr' ${5}
... '${threshold_key}' == 'lnc' ${6}
... '${threshold_key}' == 'unc' ${7}
... '${threshold_key}' == 'ucr' ${8}
... '${threshold_key}' == 'unr' ${9}
${get_sensor_new_threshold_value}= Get From List ${new_sensor_details} ${index_value}
${sensor_new_threshold_value}= Set Variable ${get_sensor_new_threshold_value.strip()}
RETURN ${sensor_new_threshold_value}