| *** Settings *** |
| Documentation Test IPMI FRU data. |
| |
| Resource ../../lib/rest_client.robot |
| Resource ../../lib/ipmi_client.robot |
| Resource ../../lib/openbmc_ffdc.robot |
| Resource ../../lib/boot_utils.robot |
| Library ../../lib/ipmi_utils.py |
| |
| Variables ../data/ipmi_rest_fru_field_map.py |
| |
| Test Teardown Test Teardown Execution |
| Suite Setup Suite Setup Execution |
| |
| |
| *** Test Cases *** |
| |
| Test FRU Info At Power On |
| [Documentation] Verify FRU info via IPMI and REST at power on. |
| [Tags] Test_FRU_Info_At_Power_On |
| [Template] Verify FRU Info |
| |
| # component_name |
| cpu |
| dimm |
| fan |
| bmc |
| system |
| powersupply |
| gv100card |
| |
| |
| *** Keywords *** |
| |
| Get Component Fru Info Via REST |
| [Documentation] Get FRU Information Via REST for the given component. |
| [Arguments] ${component_name} |
| |
| # Description of argument(s): |
| # component_name The name of the component (e.g. "cpu", "dimm", etc.). |
| |
| ${inventory_uris}= Read Properties ${HOST_INVENTORY_URI}list quiet=${1} |
| # From the inventory_uris, select just the ones for the component of |
| # interest. |
| ${component_uris}= Get Matches ${inventory_uris} |
| ... regexp=^.*[0-9a-z_].${component_name}\[0-9]*$ |
| |
| # Get the component information for each record. |
| ${component_frus}= Create List |
| : FOR ${component_uri} IN @{component_uris} |
| \ ${result}= Read Properties ${component_uri} quiet=${1} |
| \ ${component}= Fetch From Right ${component_uri} / |
| \ Set To Dictionary ${result} fru_device_description ${component} |
| \ Append To List ${component_frus} ${result} |
| [Return] ${component_frus} |
| |
| |
| Verify FRU Info |
| [Documentation] Verify FRU information of given component. |
| [Arguments] ${component_name} |
| |
| # Description of argument(s): |
| # component_name The name of the component (e.g. "cpu", "dimm", etc.). |
| |
| ${ipmi_fru_component_info}= Get Component FRU Info ${component_name} |
| ... ${fru_objs} |
| # Example of output from "Get Component FRU Info" keyword for CPU component. |
| # |
| # ipmi_fru_info: |
| # ipmi_fru_info[0]: |
| # [fru_device_description]: cpu0 (ID 1) |
| # [board_mfg_date]: Sun Dec 31 18:00:00 1995 |
| # [board_mfg]: <Manufacturer Name> |
| # [board_product]: PROCESSOR MODULE |
| # [board_serial]: YA1934301835 |
| # [board_part_number]: 02CY211 |
| # ipmi_fru_info[1]: |
| # [fru_device_description]: cpu1 (ID 2) |
| # [board_mfg_date]: Sun Dec 31 18:00:00 1995 |
| # [board_mfg]: <Manufacturer Name> |
| # [board_product]: PROCESSOR MODULE |
| # [board_serial]: YA1934301834 |
| # [board_part_number]: 02CY211 |
| |
| ${rest_fru_component_info}= Get Component FRU Info Via REST |
| ... ${component_name} |
| # Example of output from "Get Component FRU Info Via REST" keyword for |
| # CPU component. |
| # |
| # rest_fru_info: |
| # rest_fru_info[0]: |
| # [FieldReplaceable]: 1 |
| # [BuildDate]: 1996-01-01 - 00:00:00 |
| # [fru_device_description]: cpu0 |
| # [Cached]: 0 |
| # [SerialNumber]: YA1934301835 |
| # [Functional]: 1 |
| # [Version]: 22 |
| # [Model]: <blank> |
| # [PrettyName]: PROCESSOR MODULE |
| # [PartNumber]: 02CY211 |
| # [Present]: 1 |
| # [Manufacturer]: <Manufacturer Name> |
| # rest_fru_info[1]: |
| # [FieldReplaceable]: 1 |
| # [BuildDate]: 1996-01-01 - 00:00:00 |
| # [fru_device_description]: cpu1 |
| # [Cached]: 0 |
| # [SerialNumber]: YA1934301834 |
| # [Functional]: 1 |
| # [Version]: 22 |
| # [Model]: <blank> |
| # [PrettyName]: PROCESSOR MODULE |
| # [PartNumber]: 02CY211 |
| # [Present]: 1 |
| # [Manufacturer]: <Manufacturer Name> |
| |
| ${inventory_uris}= Read Properties |
| ... ${HOST_INVENTORY_URI}list quiet=${1} |
| |
| # From the inventory_uris, select just the ones for the component of |
| # interest. Example for cpu: |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0 |
| # /xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1 |
| ${component_uris}= Get Matches ${inventory_uris} |
| ... regexp=^.*[0-9a-z_].${component_name}\[0-9]*$ |
| |
| : FOR ${uri} IN @{component_uris} |
| \ ${sub_component}= Fetch From Right ${uri} / |
| \ ${ipmi_index}= Get Index Of FRU Sub Component Info |
| \ ... ${ipmi_fru_component_info} ${sub_component} |
| \ ${rest_index}= Get Index Of FRU Sub Component Info |
| \ ... ${rest_fru_component_info} ${sub_component} |
| \ ${ipmi_fru_sub_component}= |
| \ ... Get From List ${ipmi_fru_component_info} ${ipmi_index} |
| \ ${rest_fru_sub_component}= |
| \ ... Get From List ${rest_fru_component_info} ${rest_index} |
| \ Compare IPMI And REST FRU Component Info ${ipmi_fru_sub_component} |
| \ ... ${rest_fru_sub_component} ${component_name} |
| |
| |
| Get Index Of FRU Sub Component Info |
| [Documentation] Get index of FRU sub component info from FRU component |
| ... data. |
| [Arguments] ${fru_component_info} ${sub_component} |
| # fru_component_info FRU component data as a list of dictionaries. |
| # ipmi_cpu_fru_info[0]: |
| # fru_device_description: cpu0 (ID 1) |
| # board_mfg_date: Sun Dec 31 18:00:00 1995 |
| # board_mfg: <Manufacturer Name> |
| # board_product: PROCESSOR MODULE |
| # board_serial: YA1934302970 |
| # board_part_number: 02CY211 |
| # ipmi_cpu_fru_info[1]: |
| # fru_device_description: cpu1 (ID 2) |
| # board_mfg_date: Sun Dec 31 18:00:00 1995 |
| # board_mfg: <Manufacturer Name> |
| # board_product: PROCESSOR MODULE |
| # board_serial: YA1934302965 |
| # board_part_number: 02CY211 |
| # sub_component Sub component name (e.g. "cpu0", "cpu1", etc.). |
| |
| ${sub_component_count}= Get Length ${fru_component_info} |
| ${index}= Set Variable ${0} |
| |
| : FOR ${rest_fru_sub_component} IN @{fru_component_info} |
| \ ${fru_component_section}= |
| \ ... Get From List ${fru_component_info} ${index} |
| \ # Get FRU name from IPMI's fru_device_description field. |
| \ # Example "cpu0" from "cpu0 (ID 1)". |
| \ ${fru_name}= Fetch From Left |
| \ ... ${fru_component_section['fru_device_description']} ${SPACE} |
| \ ${status}= Run Keyword And Return Status Should Be Equal |
| \ ... ${fru_name} ${sub_component} |
| \ Exit For Loop If '${status}' == '${True}' |
| \ ${index}= Evaluate ${index} + 1 |
| \ Exit For Loop If ${index} >= ${sub_component_count} |
| |
| [Return] ${index} |
| |
| |
| Compare IPMI And REST FRU Component Info |
| [Documentation] Compare IPMI And REST FRU Component data objects. |
| [Arguments] ${ipmi_fru_component_obj} ${rest_fru_component_obj} |
| ... ${component_name} |
| |
| # Description of argument(s): |
| # ipmi_fru_component_obj IPMI FRU component data in dictionary. |
| # Example: |
| # fru_device_description: cpu0 (ID 1) |
| # board_mfg_date: Sun Dec 31 18:00:00 1995 |
| # board_mfg: <Manufacturer Name> |
| # board_product: PROCESSOR MODULE |
| # board_serial: YA1934302970 |
| # board_part_number: 02CY211 |
| # rest_fru_component_obj REST FRU component data in dictionary. |
| # Example: |
| # FieldReplaceable: 1 |
| # BuildDate: 1996-01-01 - 00:00:00 |
| # Cached: 0 |
| # SerialNumber: YA1934302970 |
| # Functional: 1 |
| # Version: 22 |
| # Model: <blank> |
| # PrettyName: PROCESSOR MODULE |
| # PartNumber: 02CY211 |
| # Present: 1 |
| # Manufacturer: <Manufacturer Name> |
| # component_name The name of the component (e.g. "cpu", "dimm", etc.). |
| |
| # Get key_map from ipmi_rest_fru_field_map. |
| ${key_map}= Set Variable ${ipmi_rest_fru_field_map['${component_name}']} |
| : FOR ${ipmi_key} IN @{ipmi_rest_fru_field_map['${component_name}'].keys()} |
| \ ${rest_key}= Set Variable ${key_map['${ipmi_key}']} |
| \ Should Contain ${rest_fru_component_obj['${rest_key}']} |
| ... ${ipmi_fru_component_obj['${ipmi_key}']} |
| ... msg=Comparison failed. |
| |
| |
| Test Teardown Execution |
| [Documentation] Do the post test teardown. |
| |
| FFDC On Test Case Fail |
| |
| |
| Suite Setup Execution |
| [Documentation] Do test setup initialization. |
| |
| REST Power On stack_mode=skip quiet=1 |
| ${fru_objs}= Get Fru Info |
| Set Suite Variable ${fru_objs} |
| |