*** 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
...
...                 Request data for cold reset present under data/ipmi_raw_cmd_table.py
...
...                 Python basic operations under new file lib/functions.py like
...                 threshold value calculation and striping extra characters
...                 across the strings.
...
...                 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.

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 Threshold For Sensor  ${sensor_list}

    # Identify sensor threshold values to modify.
    ${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 Threshold For Sensor  ${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 identify the sensor via IPMI sensor list.
    [Arguments]  ${data}

    # Find Sensor detail of sensor list first entry.
    # Description of Argument(s):
    #    ${data}     All the sensors listed with ipmi sensor list command.
    ${data}=  Split To Lines  ${data}
    ${data}=  Set Variable  ${data[0]}

    [Return]  ${data}


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

    # Split Sensor details in a list.
    # Description of Argument(s):
    #    ${Sensors_all}     All the sensors listed with ipmi sensor list command.
    ${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 Threshold For Sensor
    [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 Sensor Readings For The Sensor  ${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_dict}=  Identify Threshold  ${old_threshold}  ${thresholds_list}

    [Return]  ${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_list}  ${sensor}

    # Description of Argument(s):
    #    ${threshold_list}    New thresholds to be set.
    #    ${sensor}            Sensor name.

    # Set critical and non-critical values for the given sensor.
    FOR  ${criticals}  IN  @{threshold_list}
        # Set Lower/Upper critical and non-critical values if a threshold is available.
        Run keyword if  '${threshold_list['${criticals}']}' != 'na'
        ...  Run IPMI Standard Command
        ...  sensor thresh "${sensor}" ${criticals} ${threshold_list['${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 Threshold For Sensor  ${data}

    [Return]  ${threshold_new}
