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