*** Settings ***
Documentation       This suite tests IPMI Cold Reset in OpenBMC.
...
...                 The Cold reset command directs the Responder to perform
...                 a 'Cold Reset' action, which causes default setting of
...                 interrupt enables, event message generation,sensor scanning,
...                 threshold values, and other 'power up' default state to be restored.
...
...                 The script consist of 3 testcases:
...                 -  Cold_Reset_Via_IPMI
...                 -  Cold_Reset_With_Invalid_Data_Request_Via_IPMI
...                 -  Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI
...
...                 The script verifies command execution for cold reset,
...                 invalid data request verification of cold reset and
...                 impact on sensor threshold value change with cold reset.
...
...                 The script changes sensor threshold value for Fan sensor,
...                 executes cold reset IPMI command,
...                 compares sensor threshold values of initial and reading after cold reset.
...
...                 Request data for cold reset present under data/ipmi_raw_cmd_table.py

Library             Collections
Library             ../lib/ipmi_utils.py
Resource            ../lib/ipmi_client.robot
Resource            ../lib/openbmc_ffdc.robot
Variables           ../data/ipmi_raw_cmd_table.py

Test Teardown       FFDC On Test Case Fail


*** Variables ***

${NETWORK_RESTART_TIME}    30s
@{thresholds_list}         lcr   lnc   unc   ucr


*** Test Cases ***

Cold Reset Via IPMI
    [Documentation]  Verify Cold Reset via IPMI.
    [Tags]  Cold_Reset_Via_IPMI

    # Cold Reset Via IPMI raw command.
    Run External IPMI Raw Command  ${IPMI_RAW_CMD['Cold Reset']['reset'][0]}

    # Get the BMC Status.
    Wait Until Keyword Succeeds  3 min  10 sec  Is BMC Unpingable
    Wait Until Keyword Succeeds  3 min  10 sec  Is BMC Operational

    # Verify if BMC restarted with Get Device ID command.

    ${resp}=  Run External IPMI Raw Command  ${IPMI_RAW_CMD['Device ID']['Get'][0]}
    Should Not Contain  ${resp}  ${IPMI_RAW_CMD['Device ID']['Get'][1]}


Cold Reset With Invalid Data Request Via IPMI
    [Documentation]  Verify Cold Reset with invalid data request via IPMI.
    [Tags]  Cold_Reset_With_Invalid_Data_Request_Via_IPMI

    # Verify cold reset with invalid length of the request data and expect error.
    ${resp}=  Run Keyword and Expect Error  *Request data length invalid*
    ...  Run External IPMI Raw Command  ${IPMI_RAW_CMD['Cold Reset']['reset'][0]} 0x00


Verify Cold Reset Impact On Sensor Threshold Via IPMI
    [Documentation]  Modify sensor threshold, perform cold reset,
    ...  and verify if sensor threshold reverts back to initial value.
    [Tags]  Verify_Cold_Reset_Impact_On_Sensor_Threshold_Via_IPMI

    # Get sensor list.
    ${Sensor_list}=  Get Sensor List

    # Get initial sensor threshold readings.
    ${initial_sensor_threshold}  ${sensor_name}=  Get The Sensor Name And Threshold  ${sensor_list}

    # Identify sensor threshold values to modify.
    ${threshold_list}  ${threshold_dict}=  Identify Sensor Threshold Values   ${initial_sensor_threshold}

    # Set sensor threshold for given sensor and compare with initial reading.
    ${set_sensor_threshold}=  Set Sensor Threshold For given Sensor
    ...  ${threshold_dict}  ${sensor_name}
    Should Not Be Equal  ${set_sensor_threshold}  ${initial_sensor_threshold}

    # Execute cold reset command via IPMI and check status.
    Run External IPMI Raw Command  ${IPMI_RAW_CMD['Cold Reset']['reset'][0]}
    Wait Until Keyword Succeeds  3 min  10 sec  Is BMC Unpingable
    Wait Until Keyword Succeeds  3 min  10 sec  Is BMC Operational

    # Get sensor data for the sensor identified.
    ${data_after_coldreset}=  Wait Until Keyword Succeeds  2 min  30 sec
    ...  Run IPMI Standard Command   sensor | grep -i RPM | grep "${sensor_name}"

    # Get sensor threshold readings after BMC restarts.
    ${sensor_threshold_after_reset}  ${sensor_name_after_reset}=
    ...  Get The Sensor Name And Threshold  ${data_after_coldreset}

    # Compare with initial sensor threshold values.
    Should Be Equal  ${sensor_threshold_after_reset}  ${initial_sensor_threshold}


*** Keywords ***

Get Sensor List
    [Documentation]  To get the list of sensors via IPMI sensor list.

    # BMC may take time to populate all the sensors once BMC Cold reset completes.
    ${data}=  Wait Until Keyword Succeeds  2 min  30 sec
    ...  Run IPMI Standard Command   sensor | grep -i RPM

    [Return]  ${data}

Identify Sensor
    [Documentation]  To fetch first sensor listed from sensor list IPMI command and return the sensor.
    [Arguments]  ${data}

    # Description of Argument(s):
    # ${data}     All the sensors listed with ipmi sensor list command.

    # Find Sensor detail of sensor list first entry.

    ${data}=  Split To Lines  ${data}
    ${data}=  Set Variable  ${data[0]}

    [Return]  ${data}


Get The Sensor Reading And Name
    [Documentation]  To get the sensor reading of the given sensor using IPMI.
    [Arguments]  ${Sensors_all}

    # Description of Argument(s):
    # ${Sensors_all}     All the sensors listed with ipmi sensor list command.

    # Split Sensor details in a list.

    ${sensor}=  Identify Sensor  ${Sensors_all}
    ${data}=  Split String  ${sensor}  |

    # Locate the sensor name.
    ${sensor_name}=  Set Variable  ${data[0]}
    # Function defined in lib/utils.py.
    ${sensor_name}=  Remove Whitespace  ${sensor_name}

    [Return]  ${data}  ${sensor_name}


Get The Sensor Name And Threshold
    [Documentation]  To get the sensor threshold for given sensor using IPMI.
    [Arguments]  ${Sensor_list}

    # Description of Argument(s):
    #    ${Sensor_list}    All the sensors listed with ipmi sensor list command.

    # Gets the sensor data and sensor name for the required sensor.
    ${data}  ${sensor_name}=  Get The Sensor Reading And Name  ${Sensor_list}
    # Gets the threshold values in a list.
    ${threshold}=  Set Variable  ${data[5:9]}

    [Return]  ${threshold}  ${sensor_name}


Identify Sensor Threshold Values
    [Documentation]  Identify New Sensor Threshold Values with adding 100 to old threshold values.
    [Arguments]  ${old_threshold}

    # Description of Argument(s):
    #    ${old_threshold}   original threshold values list of the given sensor.

    # Retrieves modified threshold values of the original threshold value.
    ${threshold_list}  ${threshold_dict}=  Modify And Fetch Threshold  ${old_threshold}  ${thresholds_list}

    [Return]  ${threshold_list}  ${threshold_dict}


Set Sensor Threshold For given Sensor
    [Documentation]  Set Sensor Threshold for given sensor with given Upper and Lower critical
    ...              and non-critical values Via IPMI.
    [Arguments]  ${threshold_dict}  ${sensor}

    # Description of Argument(s):
    #    ${threshold_dict}    New thresholds dictionary to be set
    #                         E.g. {'lcr': 2600, 'lnc': 'na', 'unc': 'na', 'ucr': 12200}
    #    ${sensor}            Sensor name, eg: SENSOR_1, FAN_1

    # The return data will be newly set threshold value for the given sensor.

    # Set critical and non-critical values for the given sensor.
    FOR  ${criticals}  IN  @{threshold_dict}
        # Set Lower/Upper critical and non-critical values if a threshold is available.
        Run keyword if  '${threshold_dict['${criticals}']}' != 'na'
        ...  Run IPMI Standard Command
        ...  sensor thresh "${sensor}" ${criticals} ${threshold_dict['${criticals}']}
        # Allow Network restart sleep time for the readings to get reflected.
        Sleep  ${NETWORK_RESTART_TIME}
    END

    # Get sensor list for the sensor name identified.
    ${data}=  Wait Until Keyword Succeeds  2 min  30 sec
    ...  Run IPMI Standard Command   sensor | grep -i RPM | grep "${sensor}"

    # Get new threshold value set from sensor list.
    ${threshold_new}  ${sensor_name}=  Get The Sensor Name And Threshold  ${data}

    [Return]  ${threshold_new}
