1*** Settings *** 2Documentation 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... 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. 21... 22... Request data for cold reset present under data/ipmi_raw_cmd_table.py 23 24Resource ../lib/ipmi_client.robot 25Resource ../lib/openbmc_ffdc.robot 26Library Collections 27Library ../lib/ipmi_utils.py 28Variables ../data/ipmi_raw_cmd_table.py 29 30Test Teardown FFDC On Test Case Fail 31 32Force Tags IPMI_Cold_Reset 33 34*** Variables *** 35 36${NETWORK_RESTART_TIME} 30s 37@{thresholds_list} lcr lnc unc ucr 38 39 40*** Test Cases *** 41 42Cold 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 59Cold 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 68Verify 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. 74 ${sensor_list}= Get Sensor List 75 76 # Get initial sensor threshold readings. 77 ${sensor_name} ${sensor_threshold}= Get The Sensor Name And Threshold ${sensor_list} 78 79 ${threshold_key_list}= Get Dictionary Keys ${sensor_threshold} 80 ${random_threshold_key}= Evaluate random.choice(${threshold_key_list}) random 81 82 ${old_threshold_value}= Get From Dictionary ${sensor_threshold} ${random_threshold_key} 83 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. 94 Run External IPMI Raw Command ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} 95 96 # Get the BMC Status. 97 Wait Until Keyword Succeeds 3 min 10 sec Is BMC Unpingable 98 Wait Until Keyword Succeeds 10 min 10 sec Is BMC Operational 99 100 # Get sensor data for the sensor identified. 101 ${data_after_coldreset}= Wait Until Keyword Succeeds 2 min 30 sec 102 ... Run IPMI Standard Command sensor | grep -i "${sensor_name}" 103 104 # Get sensor threshold readings after BMC restarts. 105 ${threshold_value_after_reset}= Getting Sensor Threshold Value Based On Threshold Key ${random_threshold_key} ${sensor_name} 106 107 # Compare with initial sensor threshold values. 108 Should Be Equal ${threshold_value_after_reset} ${old_threshold_value} 109 110*** Keywords *** 111 112Get 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 117 ... Run IPMI Standard Command sensor 118 119 [Return] ${data} 120 121Get The Sensor Name And Threshold 122 [Documentation] To get the sensor threshold for given sensor using IPMI. 123 [Arguments] ${sensor_list} 124 125 # Description of Argument(s): 126 # ${sensor_list} All the sensors listed with ipmi sensor list command. 127 128 @{tmp_list}= Create List 129 130 @{sensor_list_lines}= Split To Lines ${sensor_list} 131 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} 140 END 141 142 ${sensor_count}= Get Length ${tmp_list} 143 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 150 151 [Return] ${random_sensor} ${sensor_threshold} 152 153Selecting 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 208Modify 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 216Set 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 229Getting 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} 249