*** 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
    Rvalid 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
    Rvalid 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
    Rvalid 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
