| *** Settings *** |
| Documentation System inventory related test. |
| |
| Resource ../lib/rest_client.robot |
| Resource ../lib/utils.robot |
| Resource ../lib/state_manager.robot |
| Resource ../lib/openbmc_ffdc.robot |
| Resource ../lib/list_utils.robot |
| Resource ../lib/boot_utils.robot |
| Library ../lib/utilities.py |
| |
| Variables ../data/variables.py |
| Variables ../data/inventory.py |
| |
| Suite setup Test Suite Setup |
| Test Teardown FFDC On Test Case Fail |
| |
| Force Tags Inventory |
| |
| ***Variables*** |
| |
| ${stack_mode} skip |
| ${LOOP_COUNT} ${1} |
| |
| *** Test Cases *** |
| |
| Verify System Inventory Path |
| [Documentation] Check if system inventory path exist. |
| [Tags] Verify_System_Inventory_Path |
| # When the host is booted, system inventory path should exist. |
| # Example: /xyz/openbmc_project/inventory/system |
| Get Inventory system |
| |
| |
| Verify Boxelder Present Property |
| [Documentation] Boxelder should be present by default. |
| [Tags] Verify that boxelder 'Present' property is present by default. |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc": |
| # { |
| # "BuildDate": "", |
| # "FieldReplaceable": 0, |
| # "Manufacturer": "IBM", |
| # "Model": "", |
| # "PartNumber": "01DH051", |
| # "Present": 1, |
| # "PrettyName": "BMC PLANAR ", |
| # "SerialNumber": "000000000000" |
| # }, |
| ${json_data}= Get Inventory system/chassis/motherboard/boxelder/bmc |
| Should Be True ${json_data["data"]["Present"]} |
| |
| |
| Verify Boxelder MAC Address Property Is Populated |
| [Documentation] Boxelder should be present by default. |
| [Tags] Verify_Boxelder_MAC_Address_Property_Is_Populated |
| # Example: |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/boxelder/bmc/ethernet |
| # { |
| # "FieldReplaceable": 0, |
| # "MACAddress": "00:00:00:00:00:00", |
| # "Present": 1, |
| # "PrettyName": "" |
| # } |
| |
| ${json_data}= Get Inventory |
| ... system/chassis/motherboard/boxelder/bmc/ethernet |
| Should Be True ${json_data["data"]["Present"]} |
| Should Not Be Equal As Strings |
| ... ${json_data["data"]["MACAddress"]} 00:00:00:00:00:00 |
| |
| # eth0 Link encap:Ethernet HWaddr 70:E2:84:14:23:F9 |
| ${mac_addr} ${stderr} ${rc}= BMC Execute Command |
| ... /sbin/ifconfig -a | grep HWaddr | awk -F'HWaddr ' '{print $2}' |
| ... return_stderr=True |
| Should Be Empty ${stderr} |
| Should Be Equal As Strings ${json_data["data"]["MACAddress"]} ${mac_addr} |
| ... msg=MAC address configured incorrectly. |
| |
| |
| Verify Chassis Motherboard Properties |
| [Documentation] Check if chassis motherboard properties are |
| ... populated valid. |
| [Tags] Verify_Chassis_Motherboard_Properties |
| # When the host is booted, the following properties should |
| # be populated Manufacturer, PartNumber, SerialNumber and |
| # it should not be zero's. |
| # Example: |
| # "data": { |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard": { |
| # "BuildDate": "", |
| # "Manufacturer": "0000000000000000", |
| # "Model": "", |
| # "PartNumber": "0000000", |
| # "Present": 0, |
| # "PrettyName": "SYSTEM PLANAR ", |
| # "SerialNumber": "000000000000" |
| # } |
| ${properties}= Get Inventory system/chassis/motherboard |
| Should Not Be Equal As Strings |
| ... ${properties["data"]["PartNumber"]} 0000000 |
| ... msg=motherboard part number invalid. |
| Should Not Be Equal As Strings |
| ... ${properties["data"]["SerialNumber"]} 000000000000 |
| ... msg=motherboard serial number invalid. |
| |
| Verify CPU Present |
| [Documentation] Check if the FRU "Present" is set for CPU's. |
| [Tags] Verify_CPU_Present |
| # System inventory cpu list: |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1 |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0": { |
| # "FieldReplaceable": 1, |
| # "BuildDate": "", |
| # "Cached": 0, |
| # "SerialNumber": "YA3933741574", |
| # "Version": "10", |
| # "Model": "", |
| # "PrettyName": "PROCESSOR MODULE", |
| # "PartNumber": "01HL322", |
| # "Present": 1, |
| # "Manufacturer": "IBM" |
| # }, |
| # The CPU properties "Present" should be boolean 1. |
| |
| ${cpu_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system cpu |
| :FOR ${cpu_uri} IN @{cpu_list} |
| \ ${present}= Read Attribute ${cpu_uri} Present |
| \ Should Be True ${present} |
| |
| |
| Verify DIMM Present |
| [Documentation] Check if the FRU "Present" is set for DIMM's. |
| [Tags] Verify_DIMM_Present |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0": { |
| # "FieldReplaceable": 1, |
| # "BuildDate": "", |
| # "Cached": 0, |
| # "SerialNumber": "0x0300cf4f", |
| # "Version": "0x00", |
| # "Model": "M393A1G40EB1-CRC ", |
| # "PrettyName": "0x0c", |
| # "PartNumber": "", |
| # "Present": 1, |
| # "Manufacturer": "0xce80" |
| # }, |
| |
| # The DIMM properties "Present" should be boolean 1. |
| |
| ${dimm_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system dimm |
| :FOR ${dimm_uri} IN @{dimm_list} |
| \ ${present}= Read Attribute ${dimm_uri} Present |
| \ Should Be True ${present} |
| |
| |
| Verify FRU Properties |
| [Documentation] Verify the FRU properties fields. |
| [Tags] Verify_FRU_Properties |
| # Example: |
| # A FRU would have "FieldReplaceable" set to boolean 1 and should have |
| # the following entries |
| # "fru": [ |
| # "FieldReplaceable" |
| # "BuildDate", |
| # "Cached" |
| # "SerialNumber", |
| # "Version", |
| # "Model", |
| # "PrettyName", |
| # "PartNumber", |
| # "Present", |
| # "Manufacturer", |
| # ] |
| # and FRU which doesn't have one of this fields is an error. |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0": { |
| # "FieldReplaceable": 1, |
| # "BuildDate": "", |
| # "Cached": 0, |
| # "SerialNumber": "0x0300cf4f", |
| # "Version": "0x00", |
| # "Model": "M393A1G40EB1-CRC ", |
| # "PrettyName": "0x0c", |
| # "PartNumber": "", |
| # "Present": 1, |
| # "Manufacturer": "0xce80" |
| # }, |
| |
| ${system_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system * |
| ${fru_list}= Qualified FRU List @{system_list} |
| Validate FRU Properties Fields @{fru_list} |
| |
| |
| Verify Core Functional State |
| [Documentation] Verify that "Present" core property is set if "Functional" |
| ... core property is set. |
| [Tags] Verify_Core_Functional_State |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core5":{ |
| # "Functional": 1, |
| # "Present": 1, |
| # "PrettyName": "" |
| # }, |
| ${core_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system core |
| :FOR ${core_uri} IN @{core_list} |
| \ ${status}= Run Keyword And Return Status |
| ... Check URL Property If Functional ${core_uri} |
| \ Continue For Loop If '${status}' == '${False}' |
| \ ${present}= Read Attribute ${core_uri} Present |
| \ Should Be True ${present} |
| ... msg=${core_uri} is functional but not present. |
| |
| |
| Verify DIMM Functional State |
| [Documentation] Verify that "Present" DIMM property is set if "Functional" |
| ... DIMM property is set. |
| [Tags] Verify_DIMM_Functional_State |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0": { |
| # "BuildDate": "", |
| # "Cached": 0, |
| # "FieldReplaceable": 1, |
| # "Functional": 1, |
| # "Manufacturer": "0xce80", |
| # "Model": "M393A1G40EB1-CRC ", |
| # "PartNumber": "", |
| # "Present": 1, |
| # "PrettyName": "0x0c", |
| # "SerialNumber": "0x0300cf4f", |
| # "Version": "0x00" |
| # }, |
| |
| ${dimm_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system dimm |
| :FOR ${dimm_uri} IN @{dimm_list} |
| \ ${status}= Run Keyword And Return Status |
| ... Check URL Property If Functional ${dimm_uri} |
| \ Continue For Loop If '${status}' == '${False}' |
| \ ${present}= Read Attribute ${dimm_uri} Present |
| \ Should Be True ${present} |
| ... msg=${dimm_uri} is functional but not present. |
| |
| |
| Verify Fan Functional State |
| [Documentation] Verify that "Present" fan property is set if "Functional" |
| ... fan property is set. |
| [Tags] Verify_Fan_Functional_State |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/motherboard/fan0": { |
| # "Functional": 1, |
| # "Present": 1, |
| # "PrettyName": "fan0" |
| # }, |
| |
| ${fan_list}= Get Endpoint Paths ${HOST_INVENTORY_URI}system fan* |
| Should Not Be Empty ${fan_list} |
| :FOR ${fan_uri} IN @{fan_list} |
| \ ${status}= Run Keyword And Return Status |
| ... Check URL Property If Functional ${fan_uri} |
| \ Continue For Loop If '${status}' == '${False}' |
| \ ${present}= Read Attribute ${fan_uri} Present |
| \ Should Be True ${present} |
| ... msg=${fan_uri} is functional but "Present" is not set. |
| |
| Verify Inventory List After Reboot |
| [Documentation] Verify Inventory List After Reboot |
| [Tags] Verify_Inventory_List_After_Reboot |
| |
| Repeat Keyword ${LOOP_COUNT} times Verify Inventory List Before And After Reboot |
| |
| Check Air Or Water Cooled |
| [Documentation] Check if this system is Air or water cooled. |
| [Tags] Check_Air_Or_Water_Cooled |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis": { |
| # "AirCooled": 1, |
| # "WaterCooled": 0 |
| # }, |
| |
| ${air_cooled}= Read Attribute |
| ... /xyz/openbmc_project/inventory/system/chassis AirCooled |
| Log AirCooled:${air_cooled} |
| |
| ${water_cooled}= Read Attribute |
| ... /xyz/openbmc_project/inventory/system/chassis WaterCooled |
| Log WaterCooled:${water_cooled} |
| |
| Run Keyword If ${air_cooled}==${0} and ${water_cooled}==${0} |
| ... Fail Neither AirCooled or WaterCooled. |
| |
| Verify Minimal CPU Inventory |
| [Documentation] Verify minimal CPU inventory. |
| [Tags] Verify_Minimal_CPU_Inventory |
| |
| # item minimum_count |
| cpu 1 |
| [Template] Minimum Inventory |
| |
| Verify Minimal DIMM Inventory |
| [Documentation] Verify minimal DIMM inventory. |
| [Tags] Verify_Minimal_DIMM_Inventory |
| |
| # item minimum_count |
| dimm 2 |
| [Template] Minimum Inventory |
| |
| Verify Minimal Core Inventory |
| [Documentation] Verify minimal core inventory. |
| [Tags] Verify_Minimal_Core_Inventory |
| |
| # item minimum_count |
| core 1 |
| [Template] Minimum Inventory |
| |
| Verify Minimal Memory Buffer Inventory |
| [Documentation] Verify minimal memory buffer inventory. |
| [Tags] Verify_Minimal_Memory_Buffer_Inventory |
| |
| # item minimum_count |
| memory_buffer 1 |
| [Template] Minimum Inventory |
| |
| Verify Minimal Fan Inventory |
| [Documentation] Verify minimal fan inventory. |
| [Tags] Verify_Minimal_Fan_Inventory |
| |
| # item minimum_count |
| fan 2 |
| [Template] Minimum Inventory |
| |
| Verify Minimal Main Planar Inventory |
| [Documentation] Verify minimal main planar inventory. |
| [Tags] Verify_Minimal_Main_Planar_Inventory |
| |
| # item minimum_count |
| main_planar 1 |
| [Template] Minimum Inventory |
| |
| Verify Minimal System Inventory |
| [Documentation] Verify minimal system inventory. |
| [Tags] Verify_Minimal_System_Inventory |
| |
| # item minimum_count |
| system 1 |
| [Template] Minimum Inventory |
| |
| Verify Minimal Power Supply Inventory |
| [Documentation] Verify minimal power supply inventory. |
| [Tags] Verify_Minimal_Power_Supply_Inventory |
| # Example: |
| # "/xyz/openbmc_project/inventory/system/chassis/power_supply0", |
| # "/xyz/openbmc_project/inventory/system/chassis/power_supply1", |
| |
| # item minimum_count |
| power_supply 1 |
| [Template] Minimum Inventory |
| |
| *** Keywords *** |
| |
| Test Suite Setup |
| [Documentation] Do the initial suite setup. |
| |
| # Boot Host. |
| REST Power On |
| |
| Get Inventory |
| [Documentation] Get the properties of an endpoint. |
| [Arguments] ${endpoint} |
| # Description of arguments: |
| # endpoint string for which url path ending. |
| # Example: "system" is the endpoint for url |
| # /xyz/openbmc_project/inventory/system |
| ${resp}= OpenBMC Get Request ${HOST_INVENTORY_URI}${endpoint} |
| Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} |
| ${jsondata}= To JSON ${resp.content} |
| [Return] ${jsondata} |
| |
| |
| Qualified FRU List |
| [Documentation] Build the list of valid FRUs. |
| [Arguments] @{system_list} |
| # Description of arguments: |
| # system_list List of system inventory URLs. |
| # Example: |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm1 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm2 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm3 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm4 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm5 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm6 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm7 |
| |
| ${fru_list}= Create List |
| :FOR ${fru_uri} IN @{system_list} |
| \ ${resp}= OpenBMC Get Request ${fru_uri}/attr/FieldReplaceable |
| \ ${jsondata}= To JSON ${resp.content} |
| \ ${status}= Run Keyword And Return Status |
| ... Should Be True ${jsondata['data']} == ${1} |
| \ Run Keyword If '${status}' == '${True}' |
| ... Append To List ${fru_list} ${fru_uri} |
| |
| [Return] ${fru_list} |
| |
| |
| Validate FRU Properties Fields |
| [Documentation] Compare valid FRUs from system vs expected FRU set. |
| [Arguments] @{fru_list} |
| # Description of arguments: |
| # fru_list List of qualified FRU URLs. |
| |
| # Build the pre-defined set list from data/inventory.py derived from |
| # a group of YAML files. |
| # Example: |
| # set(['Version', 'PartNumber', 'SerialNumber', 'FieldReplaceable', |
| # 'BuildDate', 'Present', 'Manufacturer', 'PrettyName', 'Cached', 'Model']) |
| ${fru_set}= List To Set ${inventory_dict['fru']} |
| |
| # Iterate through the FRU's url and compare the set dictionary keys |
| # with the pre-define inventory data. |
| :FOR ${fru_url_path} IN @{fru_list} |
| \ ${fru_field}= Read Properties ${fru_url_path} |
| # ------------------------------------------------------------ |
| # ${fru_field.viewkeys()} extracts the list of keys from the |
| # JSON dictionary as a set. |
| # ------------------------------------------------------------ |
| \ Should Be Equal ${fru_field.viewkeys()} ${fru_set} |
| |
| |
| Check URL Property If Functional |
| [Arguments] ${url_path} |
| # Description of arguments: |
| # url_path Full url path of the inventory object. |
| # Example: DIMM / core property url's |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core0 |
| ${state}= Read Attribute ${url_path} Functional |
| Should Be True ${state} |
| |
| Verify Inventory List Before And After Reboot |
| [Documentation] Verify Inventory list before and after reboot. |
| |
| Initiate Host Boot |
| Wait Until Keyword Succeeds 10 min 10 sec Is OS Booted |
| ${inv_before}= Get URL List ${HOST_INVENTORY_URI} |
| Initiate Host Reboot |
| Wait Until Keyword Succeeds 10 min 10 sec Is OS Booted |
| ${inv_after}= Get URL List ${HOST_INVENTORY_URI} |
| Lists Should Be Equal ${inv_before} ${inv_after} |
| |
| Minimum Inventory |
| [Documentation] Check for minimum inventory. |
| [Arguments] ${item} ${minimum_count} |
| |
| # Description of argument(s): |
| # item Inventory name (example: "fan/cpu/dimm/etc"). |
| # minimum_count The minimum number of the given item. |
| |
| ${count}= Get Number Hardware Items ${item} |
| Should Be True ${count}>=${minimum_count} |
| |
| Get Number Hardware Items |
| [Documentation] Get the count of the total present currently on inventory. |
| [Arguments] ${item} |
| |
| # Description of argument(s): |
| # item Inventory name (example: "fan/cpu/dimm/etc"). |
| |
| ${count_inventory} Set Variable ${0} |
| ${list}= Get Endpoint Paths ${HOST_INVENTORY_URI}/system/ |
| ... ${item} |
| |
| : FOR ${element} IN @{list} |
| \ ${present}= Read Properties ${element} |
| \ ${count_inventory}= Set Variable if ${present['Present']} == 1 |
| \ ... ${count_inventory+1} ${count_inventory} |
| [return] ${count_inventory} |