*** Settings ***
Documentation       Inventory of hardware FRUs under redfish.

Resource            ../../lib/bmc_redfish_resource.robot
Resource            ../../lib/bmc_redfish_utils.robot
Resource            ../../lib/openbmc_ffdc.robot
Library             ../../lib/gen_robot_valid.py

Suite Setup         Suite Setup Execution
Suite Teardown      Suite Teardown Execution
Test Setup          Printn
Test Teardown       Test Teardown Execution

*** Variables ***

# The passing criteria.  Must have at least this many.
${min_num_dimms}   2
${min_num_cpus}    1
${min_num_cores}   18
${min_num_power_supplies}  1


*** Test Cases ***


Verify CPU And Core Count
    [Documentation]  Get the total number of CPUs and cores in the system.
    ...              Verify counts are above minimums.
    [Tags]  Verify_CPU_And_Core_Count

    # Select only CPUs with Health = "OK".
    ${cpus_ok}=  Filter Struct  ${cpu_info}  [('Health', 'OK')]
    ${num_cpus}=   Get Length  ${cpus_ok}

    Rprint Vars  num_cpus  min_num_cpus

    # Assert that num_cpus is greater than or equal to min_num_cpus.
    Valid Range  num_cpus  ${min_num_cpus}

    # Get the number of cores.
    ${total_num_cores}=  Set Variable  ${0}
    :FOR  ${cpu}  IN  @{cpus_ok}
        ${cores}=   Get CPU TotalCores  ${cpu}
        ${total_num_cores}=  Evaluate  $total_num_cores + ${cores}
    END

    Rprint Vars  total_num_cores  min_num_cores

    # Assert that total_num_cores is greater than or equal to
    # min_num_cores.
    Valid Range  total_num_cores  ${min_num_cores}


Get Memory Inventory Via Redfish And Verify
    [Documentation]  Get the number of DIMMs that are functional and enabled.
    [Tags]  Get_Memory_Inventory_Via_Redfish_And_Verify

    Verify FRU Inventory Minimums  Memory  ${min_num_dimms}


Get System Serial And Verify Populated
    [Documentation]  Check that the System SerialNumber is non-blank.
    [Tags]  Get_System_Serial_And_Verify_Populated

    ${serial_number}=  Redfish.Get Attribute  ${SYSTEM_BASE_URI}  SerialNumber
    Valid Value  serial_number
    Rprint Vars  serial_number


Get Model And Verify Populated
    [Documentation]  Check that the Model is non-blank.
    [Tags]  Get_Model_And_Verify_Populated

    ${model}=  Redfish.Get Attribute  ${SYSTEM_BASE_URI}  Model
    Valid Value  model
    Rprint Vars  model


Get Available Power Supplies And Verify
    [Documentation]  Get the number of functional power supplies and
    ...              verify that it is at or above the minimum.
    [Tags]  Get_Available_Power_Supplies_And_Verify

    # Select only power supplies with Health = "OK".
    ${power_supplies_ok}=  Filter Struct  ${power_supplies}  [('Health', 'OK')]

    # Count the power supplies that are Enabled or StandbyOffline.
    ${total_num_supplies}=  Set Variable  ${0}
    :FOR  ${power_supply}  IN  @{power_supplies_ok}
        # Example of power_supply:
        # power_supply = {'@odata.id': '/redfish/v1/Chassis/chassis/Power#/PowerSupplies/0',
        # 'Manufacturer': '', 'MemberId': 'powersupply0', 'Model': '2100', 'Name':
        # 'powersupply0', 'PartNumber': 'PNPWR123', 'PowerInputWatts': 394.0,
        # 'SerialNumber': '75B12W', 'Status': {'Health': 'OK', 'State': 'Enabled'}}
        ${state}=  Set Variable  ${power_supply['Status']['State']}
        ${good_state}=  Evaluate
        ...  any(x in '${state}' for x in ('Enabled', 'StandbyOffline'))
        Run Keyword If  not ${good_state}  Continue For Loop
        ${total_num_supplies}=  Evaluate  $total_num_supplies + ${1}
    END

    Rprint Vars  total_num_supplies  min_num_power_supplies

    Valid Range  total_num_supplies  ${min_num_power_supplies}


Get Motherboard Serial And Verify Populated
    [Documentation]  Check that the Motherboard SerialNumber is non-blank.
    [Tags]  Get_Motherboard_Serial_And_Verify_Populated

    ${serial_number}=  Redfish.Get Attribute
    ...  ${REDFISH_CHASSIS_URI}motherboard  SerialNumber
    Valid Value  serial_number
    Rprint Vars  serial_number


Check GPU States When Power On
    [Documentation]  Check the State of each of the GPUs
    ...              in the system.  A system may have 0-6 GPUs.
    [Tags]  Check_GPU_States_When_Power_On

    # System was powered-on in Suite Setup.
    GPU State Check


Check GPU States When Power Off
    [Documentation]  Check the State of the GPUs when power is Off.
    [Tags]  Check_GPU_States_When_Power_Off

    Redfish Power Off
    Redfish.Login
    GPU State Check


*** Keywords ***


Get CPU TotalCores
    [Documentation]  Return the TotalCores of a CPU.
    ...              Return 0 if this attribute is missing or NONE.
    [Arguments]      ${processor}

    # Description of Argument(s):
    # processor     The Redfish URI of a CPU (e.g.
    #               "/redfish/v1/Systems/system/Processors/cpu0").

    ${total_cores}=  Redfish.Get Attribute  ${processor}  TotalCores
    Return From Keyword If  ${total_cores} is ${NONE}  ${0}
    [Return]  ${total_cores}


GPU State Check
    [Documentation]  The state of every "OK" GPU should be
    ...              "Absent", "Enabled", or "UnavailableOffline".

    # Select only GPUs with Health = "OK".
    ${gpus_ok}=  Filter Struct  ${gpu_info}  [('Health', 'OK')]

    :FOR  ${gpu}  IN  @{gpus_ok}
        ${status}=  Redfish.Get Attribute  ${gpu}  Status
        ${state}=  Set Variable  ${status['State']}
        ${good_state}=  Evaluate
        ...  any(x in '${state}' for x in ('Absent', 'Enabled', 'UnavailableOffline'))
        Rprint Vars  gpu  state
        Run Keyword If  not ${good_state}  Fail
        ...  msg=GPU State is not Absent, Enabled, or UnavailableOffline.
    END


Get Inventory URIs
    [Documentation]  Get and return a tuple of lists of URIs for CPU,
    ...              GPU and PowerSupplies.

    ${processor_info}=  Redfish_Utils.Enumerate Request
    ...  ${SYSTEM_BASE_URI}Processors  return_json=0

    ${cpu_info}=  Filter Struct  ${processor_info}
    ...  [('ProcessorType', 'CPU')]  regex=1

    ${gpu_info}=  Filter Struct  ${processor_info}
    ...  [('ProcessorType', 'Accelerator')]  regex=1

    ${power_supplies}=  Redfish.Get Attribute
    ...  ${REDFISH_CHASSIS_POWER_URI}  PowerSupplies

    [Return]  ${cpu_info}  ${gpu_info}  ${power_supplies}


Verify FRU Inventory Minimums
    [Documentation]  Verify a minimum number of FRUs.
    [Arguments]  ${fru_type}  ${min_num_frus}

    # Description of Argument(s):
    # fru_type      The type of FRU (e.g. "Processors", "Memory", etc.).
    # min_num_frus  The minimum acceptable number of FRUs found.

    # A valid FRU  will have a "State" key of "Enabled" and a "Health" key
    # of "OK".

    ${status}  ${num_valid_frus}=  Run Key U  Get Num Valid FRUs \ ${fru_type}

    Rprint Vars  fru_type  num_valid_frus  min_num_frus

    Return From Keyword If  ${num_valid_frus} >= ${min_num_frus}
    Fail  Too few "${fru_type}" FRUs found, found only ${num_valid_frus}.


Suite Teardown Execution
    [Documentation]  Do the post suite teardown.

    Redfish.Logout


Suite Setup Execution
    [Documentation]  Do test case setup tasks.

    Redfish Power On  stack_mode=skip
    Redfish.Login

    ${cpu_info}  ${gpu_info}  ${power_supplies}=  Get Inventory URIs

    Set Suite Variable  ${cpu_info}
    Set Suite Variable  ${gpu_info}
    Set Suite Variable  ${power_supplies}


Test Teardown Execution
    [Documentation]  Do the post test teardown.

    FFDC On Test Case Fail
