blob: 10eb7933e29d8a9533f77bb30a9f029f841afc5a [file] [log] [blame]
*** 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}