1*** Settings *** 2Documentation Test IPMI sensor IDs. 3 4Resource ../lib/ipmi_client.robot 5Resource ../lib/rest_client.robot 6Resource ../lib/openbmc_ffdc.robot 7Resource ../lib/boot_utils.robot 8Resource ../lib/bmc_redfish_resource.robot 9Library ../lib/ipmi_utils.py 10Library ../lib/utilities.py 11Variables ../data/ipmi_raw_cmd_table.py 12 13Suite setup Suite Setup Execution 14Suite Teardown Redfish.Logout 15Test Teardown Test Teardown Execution 16 17Force Tags Ipmi_Sdr 18 19 20*** Test Cases *** 21 22Verify SDR Info 23 [Documentation] Verify sdr info command output. 24 [Tags] Verify_SDR_Info 25 # Example of SDR info command output: 26 # SDR Version : 0x51 27 # Record Count : 216 28 # Free Space : unspecified 29 # Most recent Addition : 30 # Most recent Erase : 31 # SDR overflow : no 32 # SDR Repository Update Support : unspecified 33 # Delete SDR supported : no 34 # Partial Add SDR supported : no 35 # Reserve SDR repository supported : no 36 # SDR Repository Alloc info supported : no 37 38 # Check if delete, partially add, reserve SDR and get SDR alloc info command are supported or not. 39 ${support_delete_sdr}= Fetch IPMI Command Support Status 40 ... ${IPMI_RAW_CMD['SDR']['Delete SDR'][0]} 41 ${support_partial_add}= Fetch IPMI Command Support Status 42 ... ${IPMI_RAW_CMD['SDR']['Partially Add SDR'][0]} 43 ${support_reserve_sdr_repository}= Fetch IPMI Command Support Status 44 ... ${IPMI_RAW_CMD['SDR']['Reserve SDR Repository'][0]} 45 ${support_sdr_repository_alloc_info}= Fetch IPMI Command Support Status 46 ... ${IPMI_RAW_CMD['SDR']['Get SDR allocation Info'][0]} 47 48 ${sdr_info}= Get SDR Info 49 Should Be Equal ${sdr_info['sdr_version']} 0x51 50 51 # Get sensor count from "sdr elist all" command output. 52 ${sensor_count}= Get Sensor Count 53 Should Be Equal As Strings 54 ... ${sdr_info['record_count']} ${sensor_count} 55 56 Should Be Equal ${sdr_info['free_space']} unspecified 57 Should Not Be Equal ${sdr_info['most_recent_addition']} ${EMPTY} 58 Should Not Be Equal ${sdr_info['most_recent_erase']} ${EMPTY} 59 Should Be Equal ${sdr_info['sdr_overflow']} yes 60 Should Be Equal ${sdr_info['sdr_repository_update_support']} unspecified 61 Should Be Equal ${sdr_info['delete_sdr_supported']} ${support_delete_sdr} 62 Should Be Equal ${sdr_info['partial_add_sdr_supported']} ${support_partial_add} 63 Should Be Equal ${sdr_info['reserve_sdr_repository_supported']} ${support_reserve_sdr_repository} 64 Should Be Equal ${sdr_info['sdr_repository_alloc_info_supported']} ${support_sdr_repository_alloc_info} 65 66 67Test CPU Core SDR Info At Power On 68 [Documentation] Verify CPU core SDR info via IPMI and Redfish at power on. 69 70 [Tags] Test_CPU_Core_SDR_Info_At_Power_On 71 72 Redfish Power On stack_mode=skip quiet=1 73 Test SDR Info core 74 75 76Test DIMM SDR Info At Power On 77 [Documentation] Verify DIMM SDR info via IPMI and Redfish at power on. 78 79 [Tags] Test_DIMM_SDR_Info_At_Power_On 80 81 Redfish Power On stack_mode=skip quiet=1 82 Test SDR Info dimm 83 84 85Test GPU SDR Info At Power On 86 [Documentation] Verify GPU SDR info via IPMI and Redfish at power on. 87 88 [Tags] Test_GPU_SDR_Info_At_Power_On 89 90 Redfish Power On stack_mode=skip quiet=1 91 Test SDR Info gv100card 92 93 94Test CPU Core SDR Info At Power Off 95 [Documentation] Verify CPU core SDR info via IPMI and Redfish at power off. 96 97 [Tags] Test_CPU_Core_SDR_Info_At_Power_Off 98 99 Redfish Hard Power Off stack_mode=skip quiet=1 100 Test SDR Info core 101 102 103Test DIMM SDR Info At Power Off 104 [Documentation] Verify DIMM SDR info via IPMI and Redfish at power off. 105 106 [Tags] Test_DIMM_SDR_Info_At_Power_Off 107 108 Redfish Hard Power Off stack_mode=skip quiet=1 109 Test SDR Info dimm 110 111 112Test Auto Reboot SDR Info 113 [Documentation] Verify auto reboot SDR info via IPMI and Redfish. 114 [Tags] Test_Auto_Reboot_SDR_Info 115 116 117 ${component_uri_list}= Get Component URIs auto_reboot 118 ${component_uri}= Get From List ${component_uri_list} 0 119 ${state_rest}= Read Attribute ${component_uri} AutoReboot 120 121 ${state_ipmi}= Get SDR Presence Via IPMI auto_reboot${SPACE} 122 123 Run Keyword If '${state_ipmi}' == 'Disabled' 124 ... Should Be True ${state_rest} == ${0} 125 ... ELSE IF '${state_ipmi}' == 'State Asserted' 126 ... Should Be True ${state_rest} == ${1} 127 128 129Test TPM Enable SDR Info 130 [Documentation] Verify auto reboot SDR info via IPMI and Redfish. 131 [Tags] Test_TPM_Enable_SDR_Info 132 133 134 ${component_uri_list}= Get Component URIs TPMEnable 135 ${component_uri}= Get From List ${component_uri_list} 0 136 ${state_rest}= Read Attribute ${component_uri} TPMEnable 137 138 ${state_ipmi}= Get SDR Presence Via IPMI auto_reboot${SPACE} 139 140 Run Keyword If '${state_ipmi}' == 'Disabled' 141 ... Should Be True ${state_rest} == ${0} 142 ... ELSE IF '${state_ipmi}' == 'State Asserted' 143 ... Should Be True ${state_rest} == ${1} 144 145 146Test Reserve SDR Repository 147 [Documentation] Verify Reserve SDR Repository IPMI command. 148 [Tags] Test_Reserve_SDR_Repository 149 150 ${reservation_id}= Get Reservation ID convert_lsb_to_msb=True 151 152 # Getting another Reservation ID and verify it is different from previous Reservation ID. 153 ${new_reservation_id}= Get Reservation ID convert_lsb_to_msb=True 154 155 Should Not Be Equal ${reservation_id} ${new_reservation_id} 156 ... msg=Getting same reservation ID for second time, reservation ID must be different. 157 158 159Test Get SDR Using Reservation ID 160 [Documentation] Verify get SDR command using reservation ID obtained from Reserve SDR repository. 161 [Tags] Test_Get_SDR_Using_Reservation_ID 162 163 ${reservation_id}= Get Reservation ID add_prefix=True 164 165 # Get SDR full without using Reservation ID. 166 Run External IPMI Raw Command ${IPMI_RAW_CMD['SDR']['Get'][0]} 167 168 # Get SDR Partially using Reservation ID. 169 ${get_sdr_raw_cmd}= Catenate 170 ... ${IPMI_RAW_CMD['Get SDR']['Get'][1]} ${reservation_id} 0x${record_id} 0x00 171 ... ${IPMI_RAW_CMD['Get SDR']['Get'][2]} 172 Run External IPMI Raw Command ${get_sdr_raw_cmd} 173 174 # Get SDR partially without using reservation ID and expect error. 175 Verify Invalid IPMI Command ${IPMI_RAW_CMD['SDR']['Get'][3]} 0xc5 176 177 178Test Get SDR Using Invalid Reservation ID 179 [Documentation] Verify get SDR command using invalid reservation ID. 180 [Tags] Test_Get_SDR_Using_Invalid_Reservation_ID 181 182 # Generate two reservation ID and verify get SDR partial using old reservation ID. 183 ${first_reservation_id}= Get Reservation ID add_prefix=True 184 ${second_reservation_id}= Get Reservation ID add_prefix=True 185 186 # Creating the raw cmd with First reservation ID. 187 ${get_sdr_raw_cmd}= Catenate 188 ... ${IPMI_RAW_CMD['Get SDR']['Get'][1]} ${first_reservation_id} 0x${record_id} 0x00 189 ... ${IPMI_RAW_CMD['Get SDR']['Get'][2]} 190 191 192Test Reserve SDR Repository After BMC Reboot 193 [Documentation] Verify reserve SDR repository reservation ID after BMC Reboot. 194 [Tags] Test_Reserve_SDR_Repository_After_BMC_Reboot 195 196 # Get Reservation ID before reboot. 197 ${reservation_id_before_reboot}= Get Reservation ID add_prefix=True 198 199 # Cold reset BMC 200 IPMI MC Reset Cold (run) 201 202 # Waiting to for sdr to populate. 203 Sleep 10s 204 205 # Create Get SDR Partially command using reservation ID which got before reboot. 206 ${get_sdr_raw_cmd}= Catenate 207 ... ${IPMI_RAW_CMD['Get SDR']['Get'][1]} ${reservation_id_before_reboot} 0x${record_id} 0x00 208 ... ${IPMI_RAW_CMD['Get SDR']['Get'][2]} 209 210 Verify Invalid IPMI Command ${get_sdr_raw_cmd} 0xc5 211 212 # Verify get SDR partially with new reservation ID after reboot. 213 ${reservation_id_after_reboot}= Get Reservation ID add_prefix=True 214 ${get_sdr_raw_cmd}= Catenate 215 ... ${IPMI_RAW_CMD['Get SDR']['Get'][1]} ${reservation_id_after_reboot} 0x${record_id} 0x00 216 ... ${IPMI_RAW_CMD['Get SDR']['Get'][2]} 217 Run External IPMI Raw Command ${get_sdr_raw_cmd} 218 219 220*** Keywords *** 221 222Get Reservation ID 223 [Documentation] Get reservation ID using reserve SDR repository. 224 [Arguments] ${add_prefix}=False ${convert_lsb_to_msb}=False 225 226 # Description of argument(s): 227 # add_prefix If True will prefix "0x" to the reservation ID. 228 # e.g. IPMI response for Reservation ID command will be like 01 00 229 # return reservation ID will be "0x01" for above response. 230 231 # convert_lsb_to_msb If True will convert the reservation ID from LSB first to MSB first. 232 # e.g. IPMI response for reservation ID command will be like 01 0a 233 # return reservation ID will be "a1" for above response. 234 235 ${reservation_id}= Run External IPMI Raw Command 236 ... ${IPMI_RAW_CMD['SDR']['Reserve SDR Repository'][0]} 237 238 ${reservation_id}= Run Keyword If ${add_prefix} 239 ... Add Prefix To String ${reservation_id} 0x 240 ... ELSE IF ${convert_lsb_to_msb} 241 ... Convert LSB To MSB ${reservation_id} 242 ... ELSE 243 ... Return From Keyword ${reservation_id} 244 245 [Return] ${reservation_id} 246 247 248Get Sensor Count 249 [Documentation] Get sensors count using "sdr elist all" command. 250 # Example of "sdr elist all" command output: 251 # BootProgress | 03h | ok | 34.2 | 252 # OperatingSystemS | 05h | ok | 35.1 | 253 # AttemptsLeft | 07h | ok | 34.1 | 254 # occ0 | 08h | ok | 210.1 | Device Disabled 255 # occ1 | 09h | ok | 210.2 | Device Disabled 256 # p0_core0_temp | 11h | ns | 3.1 | Disabled 257 # cpu0_core0 | 12h | ok | 208.1 | Presence detected 258 # p0_core1_temp | 14h | ns | 3.2 | Disabled 259 # cpu0_core1 | 15h | ok | 208.2 | Presence detected 260 # p0_core2_temp | 17h | ns | 3.3 | Disabled 261 # .. 262 # .. 263 # .. 264 # .. 265 # .. 266 # .. 267 # fan3 | 00h | ns | 29.4 | Logical FRU @35h 268 # bmc | 00h | ns | 6.1 | Logical FRU @3Ch 269 # ethernet | 00h | ns | 1.1 | Logical FRU @46h 270 271 ${output}= Run IPMI Standard Command sdr elist all 272 ${sensor_list}= Split String ${output} \n 273 ${sensor_count}= Get Length ${sensor_list} 274 [Return] ${sensor_count} 275 276 277Get Component URIs 278 [Documentation] Get URIs for given component from given URIs 279 ... and return as a list. 280 [Arguments] ${component_name} ${uri_list}=${SYSTEM_URI} 281 282 # A sample result returned for the "core" component: 283 # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core0 284 # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core1 285 # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core10 286 # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core11 287 # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core12 288 # (etc.) 289 290 # Description of argument(s): 291 # component_name Component name (e.g. "core", "dimm", etc.). 292 # uri_list URI list. 293 294 ${component_uris}= Get Matches ${uri_list} 295 ... regexp=^.*[0-9a-z_].${component_name}\[_0-9a-z]*$ 296 ... case_insensitive=${True} 297 [Return] ${component_uris} 298 299 300Get SDR Presence Via IPMI 301 [Documentation] Return presence info from IPMI sensor data record. 302 [Arguments] ${component_name} 303 304 # Description of argument(s): 305 # component_name Component name (e.g. "cpu0_core0", "dimm0", etc.). 306 307 # Example of IPMI SDR elist output. 308 # BootProgress | 03h | ok | 34.2 | 309 # OperatingSystemS | 05h | ok | 35.1 | boot completed - device not specified 310 # AttemptsLeft | 07h | ok | 34.1 | 311 # occ0 | 08h | ok | 210.1 | Device Disabled 312 # occ1 | 09h | ok | 210.2 | Device Disabled 313 # cpu0_core0 | 12h | ok | 208.1 | Presence detected 314 # cpu0_core1 | 15h | ok | 208.2 | Disabled 315 # cpu0_core2 | 18h | ok | 208.3 | Presence detected 316 # dimm0 | A6h | ok | 32.1 | Presence Detected 317 # dimm1 | A8h | ok | 32.2 | Presence Detected 318 # dimm2 | AAh | ok | 32.9 | Presence Detected 319 # gv100card0 | C5h | ok | 216.1 | 0 unspecified 320 # gv100card1 | C8h | ok | 216.2 | 0 unspecified 321 # TPMEnable | D7h | ok | 3.3 | State Asserted 322 # auto_reboot | DAh | ok | 33.2 | State Asserted 323 # volatile | DBh | ok | 33.1 | State Deasserted 324 325 ${sdr_elist_output}= Run IPMI Standard Command sdr elist 326 ${sdr_component_line}= 327 ... Get Lines Containing String ${sdr_elist_output} ${component_name} 328 ... case-insensitive 329 330 ${presence_ipmi}= Fetch From Right ${sdr_component_line} | 331 ${presence_ipmi}= Strip String ${presence_ipmi} 332 [Return] ${presence_ipmi} 333 334 335Verify SDR 336 [Documentation] Verify IPMI sensor data record for given component 337 ... with Redfish. 338 [Arguments] ${component_name} 339 340 # Description of argument(s): 341 # component_name Component name (e.g. "cpu0/core0", "dimm0", etc.). 342 343 ${presence_rest}= Read Attribute 344 ... ${HOST_INVENTORY_URI}system/chassis/motherboard/${component_name} 345 ... Present 346 ${functional_rest}= Read Attribute 347 ... ${HOST_INVENTORY_URI}system/chassis/motherboard/${component_name} 348 ... Functional 349 350 # Replace "/" with "_" if there is any "/" in component name. 351 # e.g. cpu0/core0 to cpu0_core0 352 ${component_name}= Replace String ${component_name} / _ 353 ${presence_ipmi}= Get SDR Presence Via IPMI ${component_name}${SPACE} 354 355 Run Keyword If '${presence_ipmi}' == 'Disabled' or '${presence_ipmi}' == '' 356 ... Should Be True ${presence_rest} == ${0} and ${functional_rest} == ${0} 357 ... ELSE IF '${presence_ipmi}' == 'Presence Detected' or '${presence_ipmi}' == 'Presence detected' 358 ... Should Be True ${presence_rest} == ${1} and ${functional_rest} == ${1} 359 ... ELSE IF '${presence_ipmi}' == 'State Asserted' 360 ... Should Be True ${presence_rest} == ${1} and ${functional_rest} == ${1} 361 ... ELSE IF '${presence_ipmi}' == 'State Deasserted' 362 ... Should Be True ${presence_rest} == ${1} and ${functional_rest} == ${0} 363 ... ELSE Fail msg=Invalid Presence${presence_ipmi} 364 365 366Test SDR Info 367 [Documentation] Test SDR info for given component. 368 [Arguments] ${component_name} 369 370 # Description of argument(s): 371 # component_name Component name (e.g. "core", "dimm", etc.). 372 373 ${component_uri_list}= Get Component URIs ${component_name} 374 375 FOR ${uri} IN @{component_uri_list} 376 ${component_name}= Fetch From Right ${uri} motherboard/ 377 Log To Console ${component_name} 378 Verify SDR ${component_name} 379 END 380 381Fetch IPMI Command Support Status 382 [Documentation] Return yes if IPMI command is supported. 383 [Arguments] ${ipmi_cmd} 384 385 # Description of argument(s): 386 # ipmi_cmd IPMI command. 387 388 ${resp}= Run External IPMI Raw Command ${ipmi_cmd} fail_on_err=0 389 ${resp_code_match}= Get Regexp Matches ${resp} rsp=0xc1 390 391 ${cmd_support}= Set Variable If ${resp_code_match} != [] no yes 392 393 [Return] ${cmd_support} 394 395 396Get SDR Record ID 397 [Documentation] Fetch one record ID from SDR elist IPMI cmd response. 398 399 ${resp}= Run External IPMI Standard Command sdr elist 400 ${record_id}= Get Regexp Matches ${resp} \\|\\s+([0-9]+)h\\s+\\| 1 401 402 [Return] ${record_id[0]} 403 404 405Suite Setup Execution 406 [Documentation] Do the initial suite setup. 407 408 Redfish.Login 409 Redfish Power On stack_mode=skip quiet=1 410 411 ${record_id}= Get SDR Record ID 412 Set Suite Variable ${record_id} 413 414 # If REST is supported, then the uri_list will be returned. 415 ${resp}= OpenBMC Get Request ${OPENBMC_BASE_URI} 416 IF '${resp.status_code}' == '${HTTP_OK}' 417 ${uri_list}= Read Properties ${OPENBMC_BASE_URI}list 418 Set Suite Variable ${SYSTEM_URI} ${uri_list} 419 Log ${uri_list} 420 END 421 422 423Test Teardown Execution 424 [Documentation] Do the post test teardown. 425 426 FFDC On Test Case Fail 427