*** Settings ***
Documentation     Utilities for power management tests.

Resource          ../lib/rest_client.robot
Resource          ../lib/openbmc_ffdc.robot
Resource          ../lib/boot_utils.robot
Resource          ../lib/ipmi_client.robot
Library           ../lib/var_funcs.py

*** Variables ***

${power_cap_uri}    /redfish/v1/Chassis/${CHASSIS_ID}/EnvironmentMetrics

*** Keywords ***

Get System Power Cap Limit
    [Documentation]  Get the allowed MAX and MIN power limit of the chassis.

    # GET request of /redfish/v1/Chassis/chassis/EnvironmentMetrics  | grep -A5 Power
    #   "PowerLimitWatts": {
    #       "AllowableMax": 2488,
    #       "AllowableMin": 1778,
    #       "ControlMode": "Disabled",
    #       "SetPoint": 2488
    # }

    ${power_limit_watts}=  Redfish.Get Attribute  ${power_cap_uri}   PowerLimitWatts

    [return]  ${power_limit_watts}


DCMI Power Get Limits
    [Documentation]  Run dcmi power get_limit and return values as a
    ...  dictionary.

    # This keyword packages the five lines returned by dcmi power get_limit
    # command into a dictionary.  For example, the dcmi command may return:
    #  Current Limit State: No Active Power Limit
    #  Exception actions:   Hard Power Off & Log Event to SEL
    #  Power Limit:         500   Watts
    #  Correction time:     0 milliseconds
    #  Sampling period:     0 seconds
    # The power limit setting can be obtained with the following:
    # &{limits}=  DCMI Power Get Limits
    # ${power_setting}=  Set Variable  ${limits['power_limit']}

    ${output}=  Run External IPMI Standard Command  dcmi power get_limit
    ${output}=  Remove String  ${output}  Watts
    ${output}=  Remove String  ${output}  milliseconds
    ${output}=  Remove String  ${output}  seconds
    &{limits}=  Key Value Outbuf To Dict  ${output}
    [Return]  &{limits}


Get DCMI Power Limit
    [Documentation]  Return the system's current DCMI power_limit
    ...  watts setting.

    &{limits}=  DCMI Power Get Limits
    ${power_setting}=  Get From Dictionary  ${limits}  power_limit
    [Return]  ${power_setting}


Set DCMI Power Limit And Verify
    [Documentation]  Set system power limit via IPMI DCMI command.
    [Arguments]  ${power_limit}

    # Description of argument(s):
    # limit      The power limit in watts

    ${cmd}=  Catenate  dcmi power set_limit limit ${power_limit}
    Run External IPMI Standard Command  ${cmd}
    ${power}=  Get DCMI Power Limit
    Should Be True  ${power} == ${power_limit}
    ...  msg=Failed setting dcmi power limit to ${power_limit} watts.


Activate DCMI Power And Verify
    [Documentation]  Activate DCMI power limiting.

    ${resp}=  Run External IPMI Standard Command  dcmi power activate
    Should Contain  ${resp}  successfully activated
    ...  msg=Command failed: dcmi power activate.


Fail If DCMI Power Is Not Activated
    [Documentation]  Fail if DCMI power limiting is not activated.

    ${cmd}=  Catenate  dcmi power get_limit | grep State:
    ${resp}=  Run External IPMI Standard Command  ${cmd}
    Should Contain  ${resp}  Power Limit Active  msg=DCMI power is not active.


Deactivate DCMI Power And Verify
    [Documentation]  Deactivate DCMI power power limiting.

    ${cmd}=  Catenate  dcmi power deactivate | grep deactivated
    ${resp}=  Run External IPMI Standard Command  ${cmd}
    Should Contain  ${resp}  successfully deactivated
    ...  msg=Command failed: dcmi power deactivater.


Fail If DCMI Power Is Not Deactivated
    [Documentation]  Fail if DCMI power limiting is not deactivated.

    ${cmd}=  Catenate  dcmi power get_limit | grep State:
    ${resp}=  Run External IPMI Standard Command  ${cmd}
    Should Contain  ${resp}  No Active Power Limit
    ...  msg=DCMI power is not deactivated.


Get DCMI Power Limit Via REST
    [Documentation]  Return the system's current DCMI power_limit
    ...  watts setting using REST interface.

    ${power_limit}=  Read Attribute  ${CONTROL_HOST_URI}power_cap  PowerCap
    [Return]  ${power_limit}


Set DCMI Power Limit Via REST
    [Documentation]  Set system power limit via REST command.
    [Arguments]  ${power_limit}  ${verify}=${True}

    # Description of argument(s):
    # power_limit  The power limit in watts.
    # verify       If True, read the power setting to confirm.

    ${int_power_limit}=  Convert To Integer  ${power_limit}
    ${data}=  Create Dictionary  data=${int_power_limit}
    Write Attribute   ${CONTROL_HOST_URI}power_cap  PowerCap  data=${data}
    Return From Keyword If  ${verify} == ${False}
    ${power}=  Read Attribute  ${CONTROL_HOST_URI}power_cap  PowerCap
    Should Be True  ${power} == ${power_limit}
    ...  msg=Failed setting power limit to ${power_limit} watts via REST.


Activate DCMI Power Via REST
    [Documentation]  Activate DCMI power limiting via REST.
    [Arguments]  ${verify}=${True}

    # Description of argument(s):
    # verify       If True, read the setting to confirm.

    ${data}=  Create Dictionary  data=${True}
    Write Attribute   ${CONTROL_HOST_URI}power_cap  PowerCapEnable
    ...  data=${data}
    Return From Keyword If  ${verify} == ${False}
    ${setting}=  Get DCMI Power Acivation Via REST
    Should Be True  ${setting} == ${1}
    ...  msg=Failed to activate power limiting via REST.


Deactivate DCMI Power Via REST
    [Documentation]  Deactivate DCMI power limiting via REST.
    [Arguments]  ${verify}=${True}

    # Description of argument(s):
    # verify       If True, read the setting to confirm.

    ${data}=  Create Dictionary  data=${False}
    Write Attribute   ${CONTROL_HOST_URI}power_cap  PowerCapEnable
    ...  data=${data}
    Return From Keyword If  ${verify} == ${False}
    ${setting}=  Get DCMI Power Acivation Via REST
    Should Be True  ${setting} == ${0}
    ...  msg=Failed to deactivate power limiting via REST.


Get DCMI Power Acivation Via REST
    [Documentation]  Return the system's current DCMI power activation
    ...  state setting using REST interface.

    ${power_activation_setting}=  Read Attribute
    ...  ${CONTROL_HOST_URI}power_cap  PowerCapEnable
    [Return]  ${power_activation_setting}


OCC Tool Upload Setup
    [Documentation]  Upload occtoolp9 to /tmp on the OS.

    ${cmd}=  Catenate  wget --no-check-certificate
    ...  -O/tmp/occtoolp9 --content-disposition
    ...  https://github.com/open-power/occ/raw/master/src/tools/occtoolp9
    ...  && chmod 777 /tmp/occtoolp9
    ${output}  ${stderr}  ${rc}=  OS Execute Command  ${cmd}
