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

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_powersupplies}  1


*** Test Cases ***


Get Processor Inventory Via Redfish And Verify
    [Documentation]  Get the number of CPUs that are functional and enabled.
    [Tags]  Get_Processor_Inventory_Via_Redfish_And_Verify

    Rprint Vars  num_valid_cpus
    Rprint Vars  min_num_cpus
    Rvalid Range  num_valid_cpus  ${min_num_cpus}..


Get Available CPU Cores And Verify
    [Documentation]  Get the total number of cores in the system and
    ...              verify that it is at or above the minimum.
    [Tags]  Get_Available_CPU_Cores_And_Verify

    ${total_num_cores}=  Set Variable  ${0}

    :FOR  ${processor}  IN  @{cpu_uris}
        ${is_functional}=  Check If FRU Is Functional  ${processor}
        Run Keyword If  not ${is_functional}  Continue For Loop
        ${processor_cores}=   Get CPU TotalCores  ${processor}
        ${total_num_cores}=  Evaluate  $total_num_cores + $processor_cores
    END

    Rprint Vars  total_num_cores

    Run Keyword If  ${total_num_cores} < ${min_num_cores}
    ...  Fail  Too few CPU cores found.


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

    ${total_num_supplies}=  Set Variable  ${0}

    :FOR  ${chassis_uri}  IN  @{powersupply_uris}
        ${is_functional}=  Check If FRU Is Functional  ${chassis_uri}
        ${total_num_supplies}=  Evaluate  $total_num_supplies + $is_functional
    END

    Rprint Vars  total_num_supplies

    Run Keyword If  ${total_num_supplies} < ${min_num_powersupplies}
    ...  Fail  Too few power supplies found.


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


Get GPU Inventory Via Redfish
    [Documentation]  Get the number of GPUs.
    [Tags]  Get_GPU_Inventory_Via_Redfish

    # There may be 0-6 GPUs in a system.
    # GPUs may have one of three states:
    # "Absent", "Enabled", or "UnavailableOffline".
    # Or GPUs may not be listed at all under the URI
    # /redfish/v1/Systems/system/Processors.
    # So for now, only print the total of GPUs present.

    Rprint Vars  num_valid_gpus


*** Keywords ***


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

    ${processor_uris}=
    ...  Redfish_Utils.Get Member List  ${SYSTEM_BASE_URI}Processors
    # Example of processor_uris:
    # /redfish/v1/Systems/system/Processors/cpu0
    # /redfish/v1/Systems/system/Processors/cpu1
    # /redfish/v1/Systems/system/Processors/gv100card0
    # /redfish/v1/Systems/system/Processors/gv100card1
    # /redfish/v1/Systems/system/Processors/gv100card2
    # /redfish/v1/Systems/system/Processors/gv100card3
    # /redfish/v1/Systems/system/Processors/gv100card4

    ${cpu_uris}=  Get Matches  ${processor_uris}  *cpu*
    ${gpu_uris}=  Get Matches  ${processor_uris}  *gv*

    ${chassis_uris}=  Redfish_Utils.Get Member List  ${REDFISH_CHASSIS_URI}
    # Example of chassis_uris:
    # /redfish/v1/Chassis/chasis
    # /redfish/v1/Chassis/motherboard
    # /redfish/v1/Chassis/powersupply0
    # /redfish/v1/Chassis/powersupply1

    ${powersupply_uris}=  Get Matches  ${chassis_uris}  *powersupp*

    [Return]  ${cpu_uris}  ${gpu_uris}  ${powersupply_uris}


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}


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}.


Check If FRU Is Functional
    [Documentation]  Return 1 if a power supply is OK and either
    ...   Enabled or StandbyOffline.  Return 0 otherwise.
    [Arguments]  ${chassis_uri}

    # Description of Argument(s):
    # chassis_uri    The Redfish uri of a power supply
    #                (e.g. "/redfish/v1/Chassis/powersupply0").

    ${status}=  Redfish.Get Attribute  ${chassis_uri}  Status

    ${state_check}=  Set Variable  "${status['Health']}" == "OK" and
    ${state_check}=  Catenate  ${state_check}  ("${status['State']}" == "StandbyOffline" or
    ${state_check}=  Catenate  ${state_check}  "${status['State']}" == "Enabled")

    ${is_functional}=  Run Keyword If  ${state_check}
    ...     Set Variable  ${1}
    ...  ELSE
    ...     Set Variable  ${0}

    [Return]  ${is_functional}


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_uris}  ${gpu_uris}  ${powersupply_uris}=  Get Inventory URIs

    Set Suite Variable  ${cpu_uris}
    Set Suite Variable  ${gpu_uris}
    Set Suite Variable  ${powersupply_uris}

    ${num_valid_cpus}=  Get Length  ${cpu_uris}
    ${num_valid_gpus}=  Get Length  ${gpu_uris}

    Set Suite Variable  ${num_valid_cpus}
    Set Suite Variable  ${num_valid_gpus}


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

    FFDC On Test Case Fail
