*** Settings ***
Documentation   Power cycle loop. This is to test where network service
...             becomes unavailable during AC-Cycle stress test.

Resource        ../lib/rest_client.robot
Resource        ../lib/pdu/pdu.robot
Resource        ../lib/utils.robot
Resource        ../lib/openbmc_ffdc.robot
Resource        ../lib/state_manager.robot
Resource        ../lib/boot_utils.robot
Resource        ../lib/code_update_utils.robot
Library         ../lib/bmc_ssh_utils.py

Test Teardown   Test Teardown Execution
Suite Setup     Suite Setup Execution

*** Variables ***
${LOOP_COUNT}          ${50}
${CHECK_FOR_ERRORS}    ${1}

# Error strings to check from journald.
${ERROR_REGEX}     SEGV|core-dump|FAILURE|Failed to start

*** Test Cases ***

Run Multiple Power Cycle
    [Documentation]  Execute multiple power cycles.
    [Setup]  Validate Parameters
    [Tags]  Run_Multiple_Power_Cycle

    # By default run test for 50 loops, else user input iteration.
    # Fails immediately if any of the execution rounds fail and
    # check if BMC is still pinging and FFDC is collected.
    Repeat Keyword  ${LOOP_COUNT} times  Power Cycle System Via PDU


Run Multiple BMC Reset Via Redfish
    [Documentation]  Execute multiple reboots via REST.
    [Tags]  Run_Multiple_BMC_Reset_Via_Redfish

    # By default run test for 50 loops, else user input iteration.
    # Fails immediately if any of the execution rounds fail and
    # check if BMC is still pinging and FFDC is collected.
    Repeat Keyword  ${LOOP_COUNT} times  BMC Redfish Reset Cycle


Run Multiple BMC Reset Via Reboot
    [Documentation]  Execute multiple reboots via "reboot" command.
    [Tags]  Run_Multiple_BMC_Reset_Via_Reboot

    # By default run test for 50 loops, else user input iteration.
    # Fails immediately if any of the execution rounds fail and
    # check if BMC is still pinging and FFDC is collected.
    Repeat Keyword  ${LOOP_COUNT} times  BMC Reboot Cycle


Run Multiple BMC Reset When Host Is Booted Via Redfish
    [Documentation]  Execute multiple reboots via redfish.
    [Tags]  Run_Multiple_BMC_Reset_When_Host_Is_Booted_Via_Redfish

    # By default run test for 50 loops, else user input iteration.
    # Fails immediately if any of the execution rounds fail and
    # check if BMC is still pinging and FFDC is collected.
    Repeat Keyword  ${LOOP_COUNT} times  BMC Redfish Reset Runtime Cycle

*** Keywords ***

Power Cycle System Via PDU
    [Documentation]  Power cycle system and wait for BMC to reach Ready state.

    PDU Power Cycle
    Check If BMC Is Up  5 min  10 sec

    Wait Until Keyword Succeeds  10 min  10 sec  Is BMC Ready
    Verify BMC RTC And UTC Time Drift


BMC Redfish Reset Cycle
    [Documentation]  Reset BMC via Redfish and verify required states.

    Redfish OBMC Reboot (off)

    ${bmc_version}=  Get BMC Version
    Valid Value  bmc_version  valid_values=['${initial_bmc_version}']

    Run Keyword If  '${CHECK_FOR_ERRORS}' == '${1}'
    ...  Check For Regex In Journald  ${ERROR_REGEX}  error_check=${0}  boot=-b

    Verify BMC RTC And UTC Time Drift


BMC Redfish Reset Runtime Cycle
    [Documentation]  Reset BMC via Redfish and verify required states.

    Redfish OBMC Reboot (run)

    ${bmc_version}=  Get BMC Version
    Valid Value  bmc_version  valid_values=['${initial_bmc_version}']

    Run Keyword If  '${CHECK_FOR_ERRORS}' == '${1}'
    ...  Check For Regex In Journald  ${ERROR_REGEX}  error_check=${0}  boot=-b

    Verify BMC RTC And UTC Time Drift


BMC Reboot Cycle
    [Documentation]  Reboot BMC and wait for ready state.

    OBMC Reboot (off)  stack_mode=normal
    ${bmc_version}=  Get BMC Version
    Valid Value  bmc_version  ["${initial_bmc_version}"]
    Verify BMC RTC And UTC Time Drift
    Check For Regex In Journald  ${ERROR_REGEX}  error_check=${0}  boot=-b
    ${boot_side}=  Get BMC Flash Chip Boot Side
    Valid Value  boot_side  ['0']


Test Teardown Execution
    [Documentation]  Do test case tear-down.
    Ping Host  ${OPENBMC_HOST}
    FFDC On Test Case Fail


Validate Parameters
    [Documentation]  Validate PDU parameters.
    Should Not Be Empty   ${PDU_IP}
    Should Not Be Empty   ${PDU_TYPE}
    Should Not Be Empty   ${PDU_SLOT_NO}
    Should Not Be Empty   ${PDU_USERNAME}
    Should Not Be Empty   ${PDU_PASSWORD}


Suite Setup Execution
    [Documentation]  Do suite setup.

    ${bmc_version}=  Get BMC Version
    Set Suite Variable  ${initial_bmc_version}  ${bmc_version}