chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 1 | *** Settings *** |
| 2 | Documentation This suite tests IPMI Cold Reset in OpenBMC. |
| 3 | ... |
| 4 | ... The Cold reset command directs the Responder to perform |
| 5 | ... a 'Cold Reset' action, which causes default setting of |
| 6 | ... interrupt enables, event message generation,sensor scanning, |
| 7 | ... threshold values, and other 'power up' default state to be restored. |
| 8 | ... |
| 9 | ... The script consist of 3 testcases: |
| 10 | ... - Cold_Reset_Via_IPMI |
| 11 | ... - Cold_Reset_With_Invalid_Data_Request_Via_IPMI |
| 12 | ... - Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI |
| 13 | ... |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 14 | ... The script verifies command execution for cold reset, |
| 15 | ... invalid data request verification of cold reset and |
| 16 | ... impact on sensor threshold value change with cold reset. |
| 17 | ... |
| 18 | ... The script changes sensor threshold value for Fan sensor, |
| 19 | ... executes cold reset IPMI command, |
| 20 | ... compares sensor threshold values of initial and reading after cold reset. |
chithrag | 6b279b3 | 2022-05-05 08:28:05 +0000 | [diff] [blame] | 21 | ... |
| 22 | ... Request data for cold reset present under data/ipmi_raw_cmd_table.py |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 23 | |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 24 | Resource ../lib/ipmi_client.robot |
| 25 | Resource ../lib/openbmc_ffdc.robot |
ganesanb | d0c4b80 | 2023-04-28 18:29:38 +0000 | [diff] [blame] | 26 | Library Collections |
| 27 | Library ../lib/ipmi_utils.py |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 28 | Variables ../data/ipmi_raw_cmd_table.py |
| 29 | |
chithrag | 6b279b3 | 2022-05-05 08:28:05 +0000 | [diff] [blame] | 30 | Test Teardown FFDC On Test Case Fail |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 31 | |
George Keishing | 87dc442 | 2023-10-20 12:56:30 +0530 | [diff] [blame] | 32 | Force Tags IPMI_Cold_Reset |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 33 | |
| 34 | *** Variables *** |
| 35 | |
| 36 | ${NETWORK_RESTART_TIME} 30s |
| 37 | @{thresholds_list} lcr lnc unc ucr |
| 38 | |
| 39 | |
| 40 | *** Test Cases *** |
| 41 | |
| 42 | Cold Reset Via IPMI |
| 43 | [Documentation] Verify Cold Reset via IPMI. |
| 44 | [Tags] Cold_Reset_Via_IPMI |
| 45 | |
| 46 | # Cold Reset Via IPMI raw command. |
| 47 | Run External IPMI Raw Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} |
| 48 | |
| 49 | # Get the BMC Status. |
| 50 | Wait Until Keyword Succeeds 3 min 10 sec Is BMC Unpingable |
| 51 | Wait Until Keyword Succeeds 3 min 10 sec Is BMC Operational |
| 52 | |
| 53 | # Verify if BMC restarted with Get Device ID command. |
| 54 | |
| 55 | ${resp}= Run External IPMI Raw Command ${IPMI_RAW_CMD['Device ID']['Get'][0]} |
| 56 | Should Not Contain ${resp} ${IPMI_RAW_CMD['Device ID']['Get'][1]} |
| 57 | |
| 58 | |
| 59 | Cold Reset With Invalid Data Request Via IPMI |
| 60 | [Documentation] Verify Cold Reset with invalid data request via IPMI. |
| 61 | [Tags] Cold_Reset_With_Invalid_Data_Request_Via_IPMI |
| 62 | |
| 63 | # Verify cold reset with invalid length of the request data and expect error. |
| 64 | ${resp}= Run Keyword and Expect Error *Request data length invalid* |
| 65 | ... Run External IPMI Raw Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} 0x00 |
| 66 | |
| 67 | |
| 68 | Verify Cold Reset Impact On Sensor Threshold Via IPMI |
| 69 | [Documentation] Modify sensor threshold, perform cold reset, |
| 70 | ... and verify if sensor threshold reverts back to initial value. |
| 71 | [Tags] Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI |
| 72 | |
| 73 | # Get sensor list. |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 74 | ${sensor_list}= Get Sensor List |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 75 | |
| 76 | # Get initial sensor threshold readings. |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 77 | ${sensor_name} ${sensor_threshold}= Get The Sensor Name And Threshold ${sensor_list} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 78 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 79 | ${threshold_key_list}= Get Dictionary Keys ${sensor_threshold} |
| 80 | ${random_threshold_key}= Evaluate random.choice(${threshold_key_list}) random |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 81 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 82 | ${old_threshold_value}= Get From Dictionary ${sensor_threshold} ${random_threshold_key} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 83 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 84 | # Modify Default Threshold Value For An Sensor To Set An New Threshold Value |
| 85 | ${new_settable_threshold_value}= Modify Default Sensor Threshold Value ${old_threshold_value} |
| 86 | |
| 87 | # Set/Get sensor threshold for given sensor and compare with initial reading. |
| 88 | ${new_threshold_value}= Set And Get Sensor Threshold For given Sensor ${sensor_name} ${random_threshold_key} |
| 89 | ... ${new_settable_threshold_value} |
| 90 | |
| 91 | Should Not Be Equal ${new_threshold_value} ${old_threshold_value} |
| 92 | |
| 93 | # Cold Reset Via IPMI raw command. |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 94 | Run External IPMI Raw Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 95 | |
| 96 | # Get the BMC Status. |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 97 | Wait Until Keyword Succeeds 3 min 10 sec Is BMC Unpingable |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 98 | Wait Until Keyword Succeeds 10 min 10 sec Is BMC Operational |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 99 | |
| 100 | # Get sensor data for the sensor identified. |
| 101 | ${data_after_coldreset}= Wait Until Keyword Succeeds 2 min 30 sec |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 102 | ... Run IPMI Standard Command sensor | grep -i "${sensor_name}" |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 103 | |
| 104 | # Get sensor threshold readings after BMC restarts. |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 105 | ${threshold_value_after_reset}= Getting Sensor Threshold Value Based On Threshold Key ${random_threshold_key} ${sensor_name} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 106 | |
| 107 | # Compare with initial sensor threshold values. |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 108 | Should Be Equal ${threshold_value_after_reset} ${old_threshold_value} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 109 | |
| 110 | *** Keywords *** |
| 111 | |
| 112 | Get Sensor List |
| 113 | [Documentation] To get the list of sensors via IPMI sensor list. |
| 114 | |
| 115 | # BMC may take time to populate all the sensors once BMC Cold reset completes. |
| 116 | ${data}= Wait Until Keyword Succeeds 2 min 30 sec |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 117 | ... Run IPMI Standard Command sensor |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 118 | |
| 119 | [Return] ${data} |
| 120 | |
chithrag | 6b279b3 | 2022-05-05 08:28:05 +0000 | [diff] [blame] | 121 | Get The Sensor Name And Threshold |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 122 | [Documentation] To get the sensor threshold for given sensor using IPMI. |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 123 | [Arguments] ${sensor_list} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 124 | |
| 125 | # Description of Argument(s): |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 126 | # ${sensor_list} All the sensors listed with ipmi sensor list command. |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 127 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 128 | @{tmp_list}= Create List |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 129 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 130 | @{sensor_list_lines}= Split To Lines ${sensor_list} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 131 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 132 | # Omit the discrete sensor and create an threshold sensor name list |
| 133 | FOR ${sensor} IN @{sensor_list_lines} |
| 134 | ${discrete_sensor_status}= Run Keyword And Return Status Should Contain ${sensor} discrete |
| 135 | Continue For Loop If '${discrete_sensor_status}' == 'True' |
| 136 | ${sensor_details}= Split String ${sensor} | |
| 137 | ${get_sensor_name}= Get From List ${sensor_details} 0 |
| 138 | ${sensor_name}= Set Variable ${get_sensor_name.strip()} |
| 139 | Append To List ${tmp_list} ${sensor_name} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 140 | END |
| 141 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 142 | ${sensor_count}= Get Length ${tmp_list} |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 143 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 144 | FOR ${RANGE} IN RANGE 0 ${sensor_count} |
| 145 | ${random_sensor} ${sensor_threshold}= Selecting Random Sensor Name And Threshold Value ${tmp_list} ${sensor_list} |
| 146 | ${threshold_dict_count}= Get Length ${sensor_threshold} |
| 147 | Exit For Loop If '${threshold_dict_count}' != '0' |
| 148 | Remove Values From List ${tmp_list} ${random_sensor} |
| 149 | END |
chithrag | ff43db9 | 2022-03-01 13:13:48 +0000 | [diff] [blame] | 150 | |
ganesanb | 29a2421 | 2022-05-11 19:49:40 +0530 | [diff] [blame] | 151 | [Return] ${random_sensor} ${sensor_threshold} |
| 152 | |
| 153 | Selecting Random Sensor Name And Threshold Value |
| 154 | [Documentation] Select Random Sensor Name And Threshold Values. |
| 155 | [Arguments] ${tmp_list} ${sensor_list} |
| 156 | |
| 157 | # Selecting random sensors from sensor list |
| 158 | ${random_sensor_name}= Evaluate random.choice(${tmp_list}) random |
| 159 | |
| 160 | # Create Dictionary For Threshold Key With Threshold Values |
| 161 | &{tmp_dict}= Create Dictionary |
| 162 | ${sensor_threshold}= Get Lines Containing String ${sensor_list} ${random_sensor_name} |
| 163 | @{ipmi_sensor}= Split String ${sensor_threshold} | |
| 164 | ${get_ipmi_lower_non_recoverable_threshold}= Get From List ${ipmi_sensor} 4 |
| 165 | ${ipmi_lower_non_recoverable_threshold}= Set Variable ${get_ipmi_lower_non_recoverable_threshold.strip()} |
| 166 | ${lower_non_recoverable_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 167 | ... ${ipmi_lower_non_recoverable_threshold} na |
| 168 | Run Keyword If '${lower_non_recoverable_threshold_status}' == 'True' |
| 169 | ... Set To Dictionary ${tmp_dict} lnr ${ipmi_lower_non_recoverable_threshold} |
| 170 | |
| 171 | ${get_ipmi_lower_critical_threshold}= Get From List ${ipmi_sensor} 5 |
| 172 | ${ipmi_lower_critical_threshold}= Set Variable ${get_ipmi_lower_critical_threshold.strip()} |
| 173 | ${lower_critical_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 174 | ... ${ipmi_lower_critical_threshold} na |
| 175 | Run Keyword If '${lower_critical_threshold_status}' == 'True' |
| 176 | ... Set To Dictionary ${tmp_dict} lcr ${ipmi_lower_critical_threshold} |
| 177 | |
| 178 | ${get_ipmi_lower_non_critical_threshold}= Get From List ${ipmi_sensor} 6 |
| 179 | ${ipmi_lower_non_critical_threshold}= Set Variable ${get_ipmi_lower_non_critical_threshold.strip()} |
| 180 | ${lower_non_critical_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 181 | ... ${ipmi_lower_non_critical_threshold} na |
| 182 | Run Keyword If '${lower_non_critical_threshold_status}' == 'True' |
| 183 | ... Set To Dictionary ${tmp_dict} lnc ${ipmi_lower_non_critical_threshold} |
| 184 | |
| 185 | ${get_ipmi_upper_non_critical_threshold}= Get From List ${ipmi_sensor} 7 |
| 186 | ${ipmi_upper_non_critical_threshold}= Set Variable ${get_ipmi_upper_non_critical_threshold.strip()} |
| 187 | ${upper_non_critical_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 188 | ... ${ipmi_upper_non_critical_threshold} na |
| 189 | Run Keyword If '${upper_non_critical_threshold_status}' == 'True' |
| 190 | ... Set To Dictionary ${tmp_dict} unc ${ipmi_upper_non_critical_threshold} |
| 191 | |
| 192 | ${get_ipmi_upper_critical_threshold}= Get From List ${ipmi_sensor} 8 |
| 193 | ${ipmi_upper_critical_threshold}= Set Variable ${get_ipmi_upper_critical_threshold.strip()} |
| 194 | ${upper_critical_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 195 | ... ${ipmi_upper_critical_threshold} na |
| 196 | Run Keyword If '${upper_critical_threshold_status}' == 'True' |
| 197 | ... Set To Dictionary ${tmp_dict} ucr ${ipmi_upper_critical_threshold} |
| 198 | |
| 199 | ${get_ipmi_upper_non_recoverable_threshold}= Get From List ${ipmi_sensor} 9 |
| 200 | ${ipmi_upper_non_recoverable_threshold}= Set Variable ${get_ipmi_upper_non_recoverable_threshold.strip()} |
| 201 | ${upper_non_recoverable_threshold_status}= Run Keyword And Return Status Should Not Contain |
| 202 | ... ${ipmi_upper_non_recoverable_threshold} na |
| 203 | Run Keyword If '${upper_non_recoverable_threshold_status}' == 'True' |
| 204 | ... Set To Dictionary ${tmp_dict} unr ${ipmi_upper_non_recoverable_threshold} |
| 205 | |
| 206 | [Return] ${random_sensor_name} ${tmp_dict} |
| 207 | |
| 208 | Modify Default Sensor Threshold Value |
| 209 | [Documentation] Modify Default Sensor Threshold Value with adding 100 to old threshold values. |
| 210 | [Arguments] ${old_threshold} |
| 211 | |
| 212 | ${new_threshold}= Evaluate ${old_threshold} + 100 |
| 213 | |
| 214 | [Return] ${new_threshold} |
| 215 | |
| 216 | Set And Get Sensor Threshold For given Sensor |
| 217 | [Documentation] Set/Get Sensor Threshold for given sensor Via IPMI. |
| 218 | [Arguments] ${sensor_name} ${random_threshold_key} ${new_settable_threshold_value} |
| 219 | |
| 220 | # Set New Threshold Value To The Randomly Selected Sensor. |
| 221 | Run IPMI Standard Command sensor thresh "${sensor_name}" ${random_threshold_key} ${new_settable_threshold_value} |
| 222 | |
| 223 | Sleep 10s |
| 224 | |
| 225 | ${sensor_new_threshold_value}= Getting Sensor Threshold Value Based On Threshold Key ${random_threshold_key} ${sensor_name} |
| 226 | |
| 227 | [Return] ${sensor_new_threshold_value} |
| 228 | |
| 229 | Getting Sensor Threshold Value Based On Threshold Key |
| 230 | [Documentation] Getting Particular Sensor Threshold Value Based On Sensor Name And Threshold Key. |
| 231 | [Arguments] ${threshold_key} ${sensor_name} |
| 232 | |
| 233 | # After Setting Threshold Value, Get New Sensor Threshold Value. |
| 234 | ${new_data}= Run IPMI Standard Command sensor | grep -i "${sensor_name}" |
| 235 | ${new_sensor_details}= Split String ${new_data} | |
| 236 | |
| 237 | ${index_value}= Set Variable If |
| 238 | ... '${threshold_key}' == 'lnr' ${4} |
| 239 | ... '${threshold_key}' == 'lcr' ${5} |
| 240 | ... '${threshold_key}' == 'lnc' ${6} |
| 241 | ... '${threshold_key}' == 'unc' ${7} |
| 242 | ... '${threshold_key}' == 'ucr' ${8} |
| 243 | ... '${threshold_key}' == 'unr' ${9} |
| 244 | |
| 245 | ${get_sensor_new_threshold_value}= Get From List ${new_sensor_details} ${index_value} |
| 246 | ${sensor_new_threshold_value}= Set Variable ${get_sensor_new_threshold_value.strip()} |
| 247 | |
| 248 | [Return] ${sensor_new_threshold_value} |