*** Settings ***
Documentation       Get the system power supply readings and power mode settings.

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

# Power Mode Settings
@{VALID_POWER_MODES}    Static  PowerSaving  MaximumPerformance


*** Test Cases ***

Verify Current Power Mode Setting
    [Documentation]  Verify the current power mode setting.
    [Tags]  Verify_Current_Power_Mode_Setting

    # Example:
    # /redfish/v1/Systems/system
    #
    # "PartNumber": "",
    # "PowerMode": "MaximumPerformance",
    # "PowerMode@Redfish.AllowableValues": [
    #    "Static",
    #    "MaximumPerformance",
    #    "PowerSaving"
    # ],

    ${current_power_mode}=  Redfish.Get Attribute  ${SYSTEM_BASE_URI}  PowerMode
    Rprint Vars  current_power_mode

    Valid Value  current_power_mode  valid_values=${VALID_POWER_MODES}


Verify Allowable Power Mode Settings
    [Documentation]  Verify the allowable power mode settings.
    [Tags]  Verify_Allowable_Power_Mode_Settings

    ${allowed_power_modes}=  Redfish.Get Attribute  ${SYSTEM_BASE_URI}  PowerMode@Redfish.AllowableValues
    Rprint Vars  allowed_power_modes

    Valid List  allowed_power_modes  valid_values=${VALID_POWER_MODES}


Verify Allowable Power Mode Settings Switch At Runtime
    [Documentation]  Check the allowable power modes are set successfully at runtime.
    [Tags]  Verify_Allowable_Power_Mode_Settings_Switch_At_Runtime
    [Template]  Set and Verify Power Mode Switches

    # power_mode_type
    Static
    PowerSaving
    MaximumPerformance


Verify State Of PowerSubsystem PowerSupplies
    [Documentation]  Verify the state of the system's powersupplies is ok and enabled.
    [Tags]  Verify_State_Of_PowerSubsystem_PowerSupplies

    ${total_num_supplies}=  Get Total Number Of PowerSupplies
    Rprint Vars  total_num_supplies

    ${resp}=  Redfish.Get  ${REDFISH_CHASSIS_URI}/${CHASSIS_ID}/PowerSubsystem/PowerSupplies
    FOR  ${entry}  IN RANGE  0  ${total_num_supplies}
         ${resp_resource}=  Redfish.Get  ${resp.dict["Members"][${entry}]["@odata.id"]}
         # Example:
         # "Status": {
         #     "Health": "OK",
         #     "State": "Enabled"
         # },
         Should Be Equal As Strings  ${resp_resource.dict["Status"]["Health"]}  OK
         Should Be Equal As Strings  ${resp_resource.dict["Status"]["State"]}  Enabled
    END


Verify PowerSubsystem Efficiency Percent For All PowerSupplies
    [Documentation]  Verify the efficiency percent for all powersupplies.
    [Tags]  Verify_PowerSubsystem_Efficiency_Percent_For_All_PowerSupplies

    ${total_num_supplies}=  Get Total Number Of PowerSupplies
    Rprint Vars  total_num_supplies

    # Example output:
    # - Executing: get('/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply0')
    # resp_resource:
    #   [0]:
    #     [EfficiencyPercent]:                          90
    # - Executing: get('/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply1')
    # resp_resource:
    #   [0]:
    #     [EfficiencyPercent]:                          90

    ${resp}=  Redfish.Get  ${REDFISH_CHASSIS_URI}/${CHASSIS_ID}/PowerSubsystem/PowerSupplies
    FOR  ${entry}  IN RANGE  0  ${total_num_supplies}
        ${resp_resource}=  Redfish.Get Attribute
        ...  ${resp.dict["Members"][${entry}]["@odata.id"]}  EfficiencyRatings
        Rprint Vars  resp_resource
        ${efficiency_percentages}=  Nested Get  EfficiencyPercent  ${resp_resource}
        Valid List  efficiency_percentages  [90]
    END



*** Keywords ***

Get Total Number Of PowerSupplies
    [Documentation]  Return total number of powersupplies.
    ${total_num_powersupplies}=  Redfish.Get Attribute
    ...  ${REDFISH_CHASSIS_URI}/${CHASSIS_ID}/PowerSubsystem/PowerSupplies  Members@odata.count

    # Entries "Members@odata.count": 4,
    # {'@odata.id': '/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply0'}
    # {'@odata.id': '/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply1'}
    # {'@odata.id': '/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply2'}
    # {'@odata.id': '/redfish/v1/Chassis/chassis/PowerSubsystem/PowerSupplies/powersupply3'}
    RETURN  ${total_num_powersupplies}


Set and Verify Power Mode Switches
    [Documentation]  Verify the power mode switches successfully at standby or runtime.
    [Arguments]  ${power_mode}

    # Description of Arguments(s):
    # power_mode       Read the allowable power modes (e.g. "Static")

    Redfish.Login

    Redfish.patch  ${SYSTEM_BASE_URI}
    ...  body={"PowerMode":"${power_mode}"}  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]
    ${current_power_mode}=  Redfish.Get Attribute  ${SYSTEM_BASE_URI}  PowerMode
    Should Be Equal As Strings  ${power_mode}  ${current_power_mode}
    ...  msg=The thermal mode does not match the current fan mode.
    Rprint Vars  current_power_mode


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

    Redfish.Logout


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

    Printn
    Redfish.Login


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

    FFDC On Test Case Fail
