# Copyright 2021-2024 Open Networking Foundation (ONF) and the ONF Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

*** Settings ***
Documentation     Test ONOS Apps Software Upgrade
Suite Setup       Setup Suite
Test Setup        Setup
Test Teardown     Teardown
Suite Teardown    Teardown Suite
Library           Collections
Library           String
Library           OperatingSystem
Library           XML
Library           RequestsLibrary
Library           ../../libraries/DependencyLibrary.py
Resource          ../../libraries/onos.robot
Resource          ../../libraries/voltctl.robot
Resource          ../../libraries/voltha.robot
Resource          ../../libraries/utils.robot
Resource          ../../libraries/k8s.robot
Resource          ../../variables/variables.robot
Resource          ../../libraries/power_switch.robot

*** Variables ***
${POD_NAME}       flex-ocp-cord
${KUBERNETES_CONF}    ${KUBERNETES_CONFIGS_DIR}/${POD_NAME}.conf
${KUBERNETES_CONFIGS_DIR}    ~/pod-configs/kubernetes-configs
#${KUBERNETES_CONFIGS_DIR}    ${KUBERNETES_CONFIGS_DIR}/${POD_NAME}.conf
${KUBERNETES_YAML}    ${KUBERNETES_CONFIGS_DIR}/${POD_NAME}.yml
${HELM_CHARTS_DIR}    ~/helm-charts
${VOLTHA_POD_NUM}    8
${NAMESPACE}      voltha
${INFRA_NAMESPACE}      default
# For below variable value, using deployment name as using grep for
# parsing radius pod name, we can also use full radius pod name
${RESTART_POD_NAME}    radius
${timeout}        60s
${of_id}          0
${logical_id}     0
${uprate}         0
${dnrate}         0
${has_dataplane}    True
${teardown_device}    False
${scripts}        ../../scripts

# Per-test logging on failure is turned off by default; set this variable to enable
${container_log_dir}    ${None}

# logging flag to enable Collect Logs, can be passed via the command line too
# example: -v logging:False
${logging}    True

# ONOS Apps to Test for Software Upgrade need to be passed in the following variable in format:
# <app-name>,<version>,<oar-url>*<app-name>,<version>,<oar-url>*
# Example: org.opencord.aaa,2.3.0.SNAPSHOT,
# https://oss.sonatype.org/content/groups/public/org/opencord/aaa-app/2.3.0-SNAPSHOT/aaa-app-2.3.0-20201210.223737-1.oar*
${onos_apps_under_test}    ${EMPTY}

*** Test Cases ***
Test ONOS App Minor Version Upgrade
    [Documentation]    Validates the ONOS App Minor Version Upgrade doesn't affect the system functionality
    ...    Performs the sanity and verifies all the ONUs are authenticated/DHCP/pingable
    ...    Requirement: Apps to test needs to be passed in robot command variable 'onos_apps_under_test' in the format:
    ...    <app-name>,<version>,<oar-url>*<app-name>,<version>,<oar-url>*
    ...    Check [VOL-3844] for more details
    [Tags]    functional    ONOSAppMinorVerUpgrade
    [Setup]    Run Keywords    Start Logging    ONOSAppMinorVerUpgrade
    ...        AND    Setup
    [Teardown]    Run Keywords    Collect Logs
    ...           AND             Stop Logging    ONOSAppMinorVerUpgrade
    ...           AND             Delete All Devices and Verify
    Run Keyword If    ${has_dataplane}    Clean Up Linux
    Wait Until Keyword Succeeds    ${timeout}    2s    Perform Sanity Test
    ${onos_url}=    Set Variable    http://karaf:karaf@${ONOS_REST_IP}:${ONOS_REST_PORT}
    ${num_apps_under_test}=    Get Length    ${list_onos_apps_under_test}
    # Set log level to DEBUG for all apps under test
    FOR    ${J}    IN RANGE    0    ${num_apps_under_test}
        ${app_ut}=    Set Variable    ${list_onos_apps_under_test}[${J}][app]
        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
        ...    Execute ONOS CLI Command use single connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
        ...    log:set DEBUG ${app_ut}
    END
    FOR    ${I}    IN RANGE    0    ${num_apps_under_test}
        ${app}=    Set Variable    ${list_onos_apps_under_test}[${I}][app]
        ${version}=    Set Variable    ${list_onos_apps_under_test}[${I}][version]
        ${url}=    Set Variable    ${list_onos_apps_under_test}[${I}][url]
        ${oar_file}=    Set Variable    ${CURDIR}/../../tests/data/onos-files/${app}-${version}.oar
        Download App OAR File    ${url}    ${oar_file}
        ${app_details}    Get ONOS App Details    ${onos_url}    ${app}
        Log    ${app}: before upgrade: ${app_details}
        Delete ONOS App    ${onos_url}    ${app}
        Sleep    10s
        Verify ONOS Apps Active Except App Under Test    ${onos_url}    ${app}
        Install And Activate ONOS App    ${onos_url}    ${oar_file}
        Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    2s
        ...    Verify ONOS App Active    ${onos_url}    ${app}    ${version}
        ${app_details_1}    Get ONOS App Details    ${onos_url}    ${app}
        Log    ${app}: after upgrade: ${app_details_1}
        Verify ONOS Pod Restart    False
        Wait Until Keyword Succeeds    ${timeout}    2s    Perform Sanity Test    True
    END
    # Additional Verification
    Wait Until Keyword Succeeds    ${timeout}    2s    Delete All Devices and Verify
    Setup
    Run Keyword If    ${has_dataplane}    Clean Up Linux
    Wait Until Keyword Succeeds    ${timeout}    2s    Perform Sanity Test

*** Keywords ***
Setup Suite
    [Documentation]    Set up the test suite
    Common Test Suite Setup
    Create ONOS Apps Under Test List

Teardown Suite
    [Documentation]    Replaces the Suite Teardown in utils.robot.
    ...    Cleans up and checks all ONU ports disabled in ONOS.
    Close All ONOS SSH Connections

Verify ONOS Apps Active Except App Under Test
    [Documentation]    Verifies all the apps defined in input yaml are active except for the app under test
    [Arguments]    ${onos_url}    ${app_under_test}
    ${num_onos_apps}=    Get Length    ${onos_apps}
    FOR    ${I}    IN RANGE    0    ${num_onos_apps}
        Continue For Loop If    '${app_under_test}'=='${onos_apps}[${I}]'
        Verify ONOS App Active    ${onos_url}    ${onos_apps}[${I}]
    END

Download App OAR File
    [Documentation]    This keyword downloads the app oar file from the given url to the specified location
    [Arguments]    ${oar_url}    ${oar_file}
    ${rc}    Run And Return Rc    curl --fail -sSL ${oar_url} > ${oar_file}
    Should Be Equal As Integers    ${rc}    0   Can't download ONOS app from ${oar_url}

Create ONOS Apps Under Test List
    [Documentation]    Creates a list of ONOS Apps to Test from the input variable string
    ...    The input string is expected to be in format:
    ...    <app-name>,<version>,<oar-url>*<app-name>,<version>,<oar-url>*
    ${list_onos_apps_under_test}    Create List
    @{apps_under_test_arr}=    Split String    ${onos_apps_under_test}    *
    ${num_apps_under_test}=    Get Length    ${apps_under_test_arr}
    FOR    ${I}    IN RANGE    0    ${num_apps_under_test}-1
        @{app_under_test_arr}=    Split String    ${apps_under_test_arr[${I}]}    ,
        ${app}=    Set Variable    ${app_under_test_arr[0]}
        ${version}=    Set Variable    ${app_under_test_arr[1]}
        ${url}=    Set Variable    ${app_under_test_arr[2]}
        ${app_under_test}    Create Dictionary    app    ${app}    version    ${version}    url    ${url}
        Append To List    ${list_onos_apps_under_test}    ${app_under_test}
    END
    Log    ${list_onos_apps_under_test}
    Set Suite Variable    ${list_onos_apps_under_test}
