*** Settings ***
Documentation  Verify Auto Restart policy for set of mission critical
...            services needed for functioning on BMC.

Resource         ../../lib/resource.robot
Resource         ../../lib/connection_client.robot
Resource         ../../lib/openbmc_ffdc.robot
Resource         ../../lib/utils.robot
Library          ../../data/platform_variables.py

Suite Setup      Open Connection And Log In
Suite Teardown   Close All Connections
Test Teardown    FFDC On Test Case Fail

*** Variables ***
${LOG_SERVICE}  xyz.openbmc_project.Logging.service

*** Test Cases ***

Verify OpenBMC Services Auto Restart Policy
    [Documentation]  Kill active services and expect auto restart.
    [Tags]  Verify_OpenBMC_Services_Auto_Restart_Policy
    # The services listed below restart policy should be "always"
    # Command output:
    # systemctl -p Restart show xyz.openbmc_project.Logging.service | cat
    # Restart=always
    @{services}=
    ...  Create List  xyz.openbmc_project.Logging.service
    ...               xyz.openbmc_project.ObjectMapper.service
    ...               xyz.openbmc_project.State.BMC.service
    ...               xyz.openbmc_project.State.Chassis.service
    ...               xyz.openbmc_project.State.Host.service
    FOR  ${SERVICE}  IN  @{services}
      Check Service Autorestart  ${SERVICE}
    END


Kill Services And Expect Service Restart
    [Documentation]  Kill the service and it must restart.
    [Tags]  Kill_Services_And_Expect_Service_Restart

    # Get the MainPID and service state.
    ${MainPID}=  Get Service Attribute  MainPID  ${LOG_SERVICE}
    Should Not Be Equal  ${0}  ${MainPID}
    ...  msg=Logging service not restarted.

    ${ActiveState}=  Get Service Attribute  ActiveState  ${LOG_SERVICE}
    Should Be Equal  active  ${ActiveState}
    ...  msg=Logging Service not in active state.

    BMC Execute Command  kill -9 ${MainPID}
    Sleep  10s  reason=Wait for service to restart.

    ${MainPID}=  Get Service Attribute  MainPID  ${LOG_SERVICE}
    Should Not Be Equal  ${0}  ${MainPID}
    ...  msg=Logging service not restarted.

    ${ActiveState}=  Get Service Attribute  ActiveState  ${LOG_SERVICE}
    Should Be Equal  active  ${ActiveState}
    ...  msg=Logging service not in active state.

Kill The List Of Services And Expect Killed Service Get Restarted
    [Documentation]  Kill the given services and expect again services get restarted automatically.
    [Tags]  Kill_The_List_Of_Services_And_Expect_Killed_Service_Gets_Restarted

    # Create a list of services in respective server model python file
    # like romulus.py, witherspoon.py on openbmc-test-automation/data directory etc.
    # Example of creating a list of services in their respective server model python file
    # SERVICES = {
    # "BMC_SERVICES": ['xyz.openbmc_project.Logging.service', 'xyz.openbmc_project.ObjectMapper.service',
    # 'xyz.openbmc_project.State.BMC.service', 'xyz.openbmc_project.State.Chassis.service',
    # 'xyz.openbmc_project.State.Host.service']

    @{auto_restart_policy_always_services}=  Create List
    @{incorrect_auto_restart_policy_services}=  Create List
    @{service_not_started}=  Create List

    # Creating an list of services which needs to be validated.

    ${services}=  Get Service Restart Policy Services  ${OPENBMC_MODEL}
    ${service_list}=  Get From Dictionary  ${services}  BMC_SERVICES
    ${length_services}=  Get Length  ${service_list}

    # From service list it will check service auto-restart policy
    # If incorrect those services will be appended to incorrect_auto_restart_policy_services list
    # Proper restart policy services will be appended to auto_restart_policy_always_services list.

    FOR  ${service}  IN  @{service_list}
      ${service_status}=  Run Keyword And Return Status  Check Service Autorestart  ${service}
      Run Keyword If  ${service_status} == False
      ...    Append To List  ${incorrect_auto_restart_policy_services}  ${service}
      ...  ELSE
      ...    Append To List  ${auto_restart_policy_always_services}  ${service}
    END

    ${length_incorrect_autorestart_policy}=  Get Length  ${incorrect_auto_restart_policy_services}
    Run Keyword If  ${length_incorrect_autorestart_policy} != 0 and ${length_incorrect_autorestart_policy} == ${length_services}
    ...    Run Keywords  Log  ${incorrect_auto_restart_policy_services}  AND
    ...    Fail  msg=All the given services have incorrect auto-restart policy.
    ...  ELSE IF  ${length_incorrect_autorestart_policy} != 0 and ${length_incorrect_autorestart_policy} != ${length_services}
    ...    Run Keywords  Log  ${incorrect_auto_restart_policy_services}  AND
    ...    Run Keyword And Continue On Failure  Fail  msg=Listed services are having incorrect auto-restart policy.

    # This will get process id and check the service active state before killing the services.
    # If service process id was 0 or service was not in active state then those services will get
    # appended to service_not_started list.
    # Only services with process ID and in active state get killed and checked whether
    # they automatically restart and put into active state.

    FOR  ${service}  IN  @{auto_restart_policy_always_services}
      ${Old_MainPID}=  Get Service Attribute  MainPID  ${service}
      ${ActiveState}=  Get Service Attribute  ActiveState  ${service}
      ${main_pid_status}=  Run Keyword And Return Status  Should Not Be Equal  ${0}  ${Old_MainPID}
      ${active_state_status}=  Run Keyword And Return Status  Should Be Equal  active  ${ActiveState}
      Run Keyword If  ${main_pid_status} == False or ${active_state_status} == False
      ...  Run Keywords  Append To List  ${service_not_started}  ${service}  AND  Continue For Loop

      BMC Execute Command  kill -9 ${Old_MainPID}
      Sleep  10s  reason=Wait for service to restart.

      ${New_MainPID}=  Get Service Attribute  MainPID  ${service}
      Run Keyword And Continue On Failure  Should Not Be Equal  ${0}  ${New_MainPID}
      ...  msg=${service} service not restarted.
      Run Keyword And Continue On Failure  Should Not Be Equal  ${Old_MainPID}  ${New_MainPID}
      ...  msg=Old process ID is mapped to ${service} service after service restart..

      ${ActiveState}=  Get Service Attribute  ActiveState  ${service}
      Run Keyword And Continue On Failure  Should Be Equal  active  ${ActiveState}
      ...  msg=${service} service not in active state.
    END

    ${length_service_not_started}=  Get Length  ${service_not_started}
    ${incorrect_services}=  Evaluate  ${length_incorrect_autorestart_policy} + ${length_service_not_started}

    Run Keyword If  ${incorrect_services} == ${length_services} and ${length_service_not_started} != 0
    ...    Run Keywords  Log  ${service_not_started}  AND  Fail  msg=All the services were either not started or not in active state by default.
    ...  ELSE IF  ${incorrect_services} != ${length_services} and ${length_service_not_started} != 0
    ...    Run Keywords  Log  ${service_not_started}  AND  Fail  msg=Few listed services were either not started or not in active state by default.

*** Keywords ***

Check Service Autorestart
    [Documentation]  Check if given policy is "always".
    [Arguments]  ${servicename}
    # servicename  Qualified service name
    ${restart_policy}=  Get Service Attribute  Restart  ${servicename}
    Should Be Equal  always  ${restart_policy}
    ...  msg=Incorrect policy for ${servicename}
