# Copyright 2020-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.
# FIXME Can we use the same test against BBSim and Hardware?

*** Settings ***
Documentation     Test various end-to-end scenarios
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}        120s
${of_id}          0
${logical_id}     0
${has_dataplane}    True
${teardown_device}    False
${scripts}        ../../scripts
${with_onos}    True
${values_dir}    ../data
${kind_voltha_dir}    ~/kind-voltha
# 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

${pausebeforesanity}    False
${onos_version}    ${EMPTY}

*** Test Cases ***

Sanity E2E Test for OLT/ONU on POD
    [Documentation]    Validates E2E Ping Connectivity and object states for the given scenario:
    ...    Validate successful authentication/DHCP/E2E ping for the tech profile that is used
    [Tags]    sanity    test1
    [Setup]    Run Keywords    Start Logging    SanityTest
    ...        AND             Setup
    [Teardown]    Run Keywords    Collect Logs
    ...           AND             Stop Logging    SanityTest
    Run Keyword If    ${has_dataplane}    Clean Up Linux
    Wait Until Keyword Succeeds    ${timeout}    2s    Perform Sanity Test

Start voltha containers in a specific order and run sanity test
    [Documentation]    Starts voltha containers in a specific order and run sanity test
    ...    Assuming that test1 was executed where all the ONUs are authenticated/DHCP/pingable
    ...    Two starts of voltha container in specific orders are supported:
    ...    First order: voltha, voltha-adapters-simulated, voltha-adapters-open-olt, voltha-adapters-open-onu, onos
    ...    Second order: voltha-adapters-simulated, voltha-adapters-open-olt, voltha-adapters-open-onu, voltha, onos
    ...    For both orders following scenarios will be run
    ...    - Remove helm charts
    ...    - Restart Helm Charts in a specific order
    ...    - Restart Port Forwarding
    ...    - Repeat the sanity check
    [Tags]    functional    VOL-2008    StartVolthaContainers    notready
    [Setup]    Start Logging    StartVolthaContainers
    [Teardown]    Run Keywords    Collect Logs
    ...           AND             Stop Logging    StartVolthaContainers
	${list_order}    Create List    First    Second
    # Get simulated adpters are running
    ${contains_sim}=    Set Variable   False
	${container}    Get Container Dictionary    voltha
    FOR    ${key}    IN    @{container.keys()}
        ${contains_sim}=    Evaluate    "sim-voltha-adapter" in """${key}"""
        Exit For Loop IF    ${contains_sim}
    END
    # Prepare Helm Chart list
    ${list_voltha_apps}   Create List    ofagent    rw-core
    ${list_voltha_names}   Create List    voltha-voltha-ofagent    voltha-voltha-rw-core
	${voltha}    CreateDictionary    helmchart=voltha    namespace=voltha
    ...    apps=${list_voltha_apps}    names=${list_voltha_names}
    ${list_sim_apps}   Create List    adapter-simulated-olt    adapter-simulated-onu
    ${list_sim_names}   Create List    sim-voltha-adapter-simulated-olt    sim-voltha-adapter-simulated-onu
    ${sim}    CreateDictionary    helmchart=sim    namespace=voltha
    ...    apps=${list_sim_apps}    names=${list_sim_names}
    ${list_openolt_apps}   Create List    ${OLT_ADAPTER_APP_LABEL}
    ${list_openolt_names}   Create List    open-olt-voltha-adapter-openolt
    ${open-olt}    CreateDictionary    helmchart=open-olt    namespace=voltha
    ...    apps=${list_openolt_apps}    names=${list_openolt_names}
    ${list_openonu_apps}   Create List    adapter-open-onu
    ${list_openonu_names}   Create List    open-onu-voltha-adapter-openonu
    ${open-onu}    CreateDictionary    helmchart=open-onu    namespace=voltha
    ...    apps=${list_openonu_apps}    names=${list_openonu_names}
    ${list_onos_apps}   Create List    onos-onos-classic
    ${list_onos_names}   Create List    onos-onos-classic
    ${onos}    CreateDictionary    helmchart=onos    namespace=default
    ...    apps=${list_onos_apps}    names=${list_onos_names}
    ${List_Helm_Charts}    Create List
    Run Keyword If    ${contains_sim}
    ...    Append To List    ${List_Helm_Charts}    ${voltha}    ${sim}    ${open-olt}    ${open-onu}    ${onos}
    ...    ELSE
    ...    Append To List    ${List_Helm_Charts}    ${voltha}    ${open-olt}    ${open-onu}    ${onos}
    # Start Loop over both orders
    FOR    ${order}    IN    @{list_order}
        Perfom Start voltha containers in a specific order    ${List_Helm_Charts}    ${order}    ${contains_sim}
        ...    ${with_onos}
    END

*** Keywords ***
Setup Suite
    [Documentation]    Set up the test suite
    Common Test Suite Setup
    #Restore all ONUs
    #Run Keyword If    ${has_dataplane}    RestoreONUs    ${num_onus}
    #power_switch.robot needs it to support different vendor's power switch
    ${switch_type}=    Get Variable Value    ${web_power_switch.type}
    Run Keyword If  "${switch_type}"!=""    Set Global Variable    ${powerswitch_type}    ${switch_type}

Perfom Start voltha containers in a specific order
    [Arguments]    ${List_Helm_Charts}    ${order}    ${contains_sim}    ${with_onos}
    [Documentation]    Performes start ofvoltha containers in a specific order and run sanity test
    # Repeat Teardown Suite
    Run Keyword If    ${with_onos}
	...    Log    \r\nRepeat Teardown Suite (${order} order)...    console=yes
	Run Keyword If    ${with_onos}    Teardown Suite
    # Remove Helm Charts
    Log    \r\nRemove Helm Charts (${order} order)...    console=yes
	Remove Helm Charts    ${List_Helm_Charts}
    # Restart Helm Charts
    Log    \r\nRestart Helm Charts (${order} order)...    console=yes
    Restart Helm Charts    ${List_Helm_Charts}    ${order}    ${contains_sim}
    # Restart Port Forwarding
    Log    \r\nRestart Port Forwarding (${order} order)...    console=yes
    Restart Port Forwarding
    # Push ONOS Kafka Configuration
    Run Keyword If    ${with_onos}
	...    Log    \r\nPush ONOS Kafka Configuration (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Push ONOS Kafka Configuration
    # Push ONOS DHCP L2 Relay Configuration
    Run Keyword If    ${with_onos}
	...    Log    \r\nPush ONOS DHCP L2 Relay Configuration (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Push ONOS DHCP L2 Relay Configuration
    #Enable VOLTHA ONOS EAPOL provisioning
    Run Keyword If    ${with_onos}
	...    Log    \r\nEnable VOLTHA ONOS EAPOL provisioning (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Enable VOLTHA ONOS EAPOL provisioning
    #Enable VOLTHA ONOS DHCP Provisioning
    Run Keyword If    ${with_onos}
	...    Log    \r\nEnable VOLTHA ONOS DHCP Provisioning (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Enable VOLTHA ONOS DHCP Provisioning
    #Disable VOLTHA ONOS IGMP Provisioning
    Run Keyword If    ${with_onos}
	...    Log    \r\nDisable VOLTHA ONOS IGMP Provisioning (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Disable VOLTHA ONOS IGMP Provisioning
    #Push ONOS SADIS Configuration
    Run Keyword If    ${with_onos}
	...    Log    \r\nPush ONOS SADIS Configuration (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Push ONOS SADIS Configuration
    # Configure ONOS RADIUS Connection
    Run Keyword If    ${with_onos}
	...    Log    \r\nPush ONOS RADIUS Connection (${order} order)...    console=yes
    Run Keyword If    ${with_onos}    Sleep    5s
    Run Keyword If    ${with_onos}
	...    Wait Until Keyword Succeeds    30s    3s    Configure ONOS RADIUS Connection
	Log    \r\nSleep 10s (${order} order)...    console=yes
    Sleep    10s
    # Repeat Suite Setup
    Run Keyword If    ${with_onos}
	...    Log    \r\nRepeat Suite Setup (${order} order)...    console=yes
	Run Keyword If    ${with_onos}    Common Test Suite Setup
    # Repeat Setup
    Run Keyword If    ${with_onos}
	...    Log    \r\nRepeat Setup (${order} order)...    console=yes
	Run Keyword If    ${with_onos}    Setup
    Run Keyword If    ${pausebeforesanity}    Import Library    Dialogs
    Run Keyword If    ${pausebeforesanity}    Pause Execution    Press OK to continue with Sanity Check!
    # Repeat Sanity Test E2E Test for OLT/ONU on POD
    Log    \r\nRepeat Sanity Test E2E Test for OLT/ONU on POD (${order} order)...    console=yes
    Run Keyword If    ${has_dataplane}    Clean Up Linux
    Wait Until Keyword Succeeds    ${timeout}    2s    Perform Sanity Test

Remove Helm Charts
    [Arguments]    ${List_Helm_Charts}
    [Documentation]    Removes the helm charts
    FOR    ${helm_chart}    IN    @{List_Helm_Charts}
        ${helmchartname}    Get From Dictionary    ${helm_chart}    helmchart
        ${namespace}    Get From Dictionary    ${helm_chart}    namespace
        Run Keyword If    ${with_onos} or ('${helmchartname}'!='onos')    Remove VOLTHA Helm Charts    ${helmchartname}
    ...    ${namespace}
        ${list_names}    Get From Dictionary    ${helm_chart}    names
        Run Keyword If    ${with_onos} or ('${helmchartname}'!='onos')
        ...    Wait For Pods Not Exist    ${namespace}    ${list_names}
    END

Remove VOLTHA Helm Charts
    [Arguments]    ${name}    ${namespace}
    [Documentation]    Remove VOLTHA helm charts
    ${cmd}    Catenate    helm uninstall --no-hooks --namespace '${namespace}' '${name}'
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Restart Helm Charts
    [Arguments]    ${List_Helm_Charts}    ${order}    ${contains_sim}
    [Documentation]    Restarts the helm charts
    Run Keyword If    '${order}'=='First'    Restart Voltha
    Run Keyword If    ${contains_sim}    Restart Voltha Adapters Simulated
	Restart Voltha Adapters Open OLT
    Restart Voltha Adapters Open ONU
    Run Keyword If    '${order}'=='Second'    Restart Voltha
    Run Keyword If    ${with_onos}    Restart ONOS
    FOR    ${helm_chart}    IN    @{List_Helm_Charts}
        ${helmchartname}    Get From Dictionary    ${helm_chart}    helmchart
        ${namespace}    Get From Dictionary    ${helm_chart}    namespace
        ${list_apps}    Get From Dictionary    ${helm_chart}    apps
        Run Keyword If    ${with_onos} or ('${helmchartname}'!='onos')
        ...    Wait For Pods Ready    ${namespace}    ${list_apps}
    END

Restart Voltha Adapters Simulated
    [Documentation]    Restart Voltha Adapters Simulated helm chart
    ${cmd}	Catenate
    ...    helm install -f ${values_dir}/sim-adapter-values.yaml --create-namespace
    ...    --set services.etcd.service=etcd.default.svc --set services.etcd.port=2379
    ...    --set services.etcd.address=etcd.default.svc:2379 --set kafka_broker=kafka.default.svc:9092
    ...    --set services.kafka.adapter.service=kafka.default.svc --set services.kafka.adapter.port=9092
    ...    --set services.kafka.cluster.service=kafka.default.svc --set services.kafka.cluster.port=9092
    ...    --set services.kafka.adapter.address=kafka.default.svc:9092
    ...    --set services.kafka.cluster.address=kafka.default.svc:9092 --set defaults.log_level=WARN
    ...    --namespace ${NAMESPACE} sim onf/voltha-adapter-simulated
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Restart Voltha Adapters Open OLT
    [Documentation]    Restart Voltha Adapters Open OLT helm chart
    ${cmd}	Catenate
    ...    helm install -f ${values_dir}/open-olt-values.yaml    --create-namespace
    ...    --set services.etcd.service=etcd.default.svc --set services.etcd.port=2379
    ...    --set services.etcd.address=etcd.default.svc:2379 --set kafka_broker=kafka.default.svc:9092
    ...    --set services.kafka.adapter.service=kafka.default.svc --set services.kafka.adapter.port=9092
    ...    --set services.kafka.cluster.service=kafka.default.svc --set services.kafka.cluster.port=9092
    ...    --set services.kafka.cluster.address=kafka.default.svc:9092
    ...    --set services.kafka.adapter.address=kafka.default.svc:9092 --set defaults.log_level=WARN
    ...    --namespace ${NAMESPACE} open-olt onf/voltha-adapter-openolt
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Restart Voltha Adapters Open ONU
    [Documentation]    Restart Voltha Adapters Open ONU helm chart
    ${cmd}	Catenate
    ...    helm install -f ${values_dir}/open-onu-values.yaml    --create-namespace
    ...    --set services.etcd.service=etcd.default.svc --set services.etcd.port=2379
    ...    --set services.etcd.address=etcd.default.svc:2379 --set kafka_broker=kafka.default.svc:9092
    ...    --set services.kafka.adapter.service=kafka.default.svc --set services.kafka.adapter.port=9092
    ...    --set services.kafka.cluster.service=kafka.default.svc --set services.kafka.cluster.port=9092
    ...    --set services.kafka.adapter.address=kafka.default.svc:9092
    ...    --set services.kafka.cluster.address=kafka.default.svc:9092 --set replicas.adapter_open_onu=1
    ...    --set defaults.log_level=WARN --namespace ${NAMESPACE} open-onu onf/voltha-adapter-openonu
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Restart Voltha
    [Documentation]    Restart Voltha helm chart
    ${cmd}	Catenate
    ...    helm install -f ${values_dir}/voltha-values.yaml   --create-namespace --set therecanbeonlyone=true
    ...    --set services.etcd.service=etcd.default.svc --set services.etcd.port=2379
    ...    --set services.etcd.address=etcd.default.svc:2379 --set kafka_broker=kafka.default.svc:9092
    ...    --set services.kafka.adapter.service=kafka.default.svc --set services.kafka.adapter.port=9092
    ...    --set services.kafka.cluster.service=kafka.default.svc --set services.kafka.cluster.port=9092
    ...    --set services.kafka.adapter.address=kafka.default.svc:9092
    ...    --set services.kafka.cluster.address=kafka.default.svc:9092
    ...    --set 'services.controller[0].service=onos-onos-classic-0.onos-onos-classic-hs.default.svc'
    ...    --set 'services.controller[0].port=6653'
    ...    --set 'services.controller[0].address=onos-onos-classic-0.onos-onos-classic-hs.default.svc:6653'
    ...    --set defaults.log_level=WARN --namespace ${NAMESPACE} voltha onf/voltha
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0


Restart ONOS
    [Documentation]    Restart ONOS helm chart
    ${cmd}=    Run Keyword If    '${onos_version}'=='${EMPTY}'    Catenate
    ...    helm install -f ${values_dir}/onos-values.yaml
    ...    --create-namespace --set image.repository=voltha/voltha-onos,image.tag=master,replicas=1,atomix.replicas=0
    ...    --set defaults.log_level=WARN --namespace default onos onos/onos-classic
    ...    ELSE    Catenate
    ...    helm install -f ${values_dir}/minimal-values.yaml
    ...    --create-namespace --set image.repository=voltha/voltha-onos,image.tag=master,replicas=1,atomix.replicas=0
    ...    --set defaults.log_level=WARN --namespace default --version ${onos_version} onos onos/onos-classic
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Restart Port Forwarding
    [Documentation]    Restarts the VOLTHA port forwarding rules
    ${List_Tags}    Create List    etcd-minimal    voltha-voltha-api-minimal    kafka-minimal
    ...    onos-onos-classic-hs-minimal
    FOR    ${tag}    IN    @{List_Tags}
        Run Keyword If    ${with_onos} or ('${tag}'!='onos-onos-classic-hs-minimal')
        ...    Restart VOLTHA Port Forward    ${tag}
    END

Push ONOS Kafka Configuration
    [Documentation]    Pushes the ONOS kafka Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/network/configuration/apps/org.opencord.kafka
    ...    --data '{"kafka":{"bootstrapServers":"kafka.default.svc:9092"}}'; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Push ONOS DHCP L2 Relay Configuration
    [Documentation]    Pushes the ONOS DHCP L2 Relay Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/network/configuration/apps/org.opencord.dhcpl2relay
    ...    --data @onos-files/onos-dhcpl2relay.json; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Enable VOLTHA ONOS EAPOL provisioning
    [Documentation]    Pushes the ONOS EAPOL Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/configuration/org.opencord.olt.impl.OltFlowService
    ...    --data '{"enableEapol":true}'; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Enable VOLTHA ONOS DHCP Provisioning
    [Documentation]    Pushes the ONOS OLT DHCP Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/configuration/org.opencord.olt.impl.OltFlowService
    ...    --data '{"enableDhcpOnNni":true,"enableDhcpV4":true}'; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Disable VOLTHA ONOS IGMP Provisioning
    [Documentation]    Pushes the ONOS IGMP Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/configuration/org.opencord.olt.impl.OltFlowService
    ...    --data '{"enableIgmpOnNni":false}'; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Push ONOS SADIS Configuration
    [Documentation]    Pushes the ONOS SADIS Configuration
    ${cmd}	Catenate
    ...    cd ~/kind-voltha;
    ...    curl -sSL --user karaf:karaf -w %\{http_code\} -X POST --fail -H Content-Type:application/json
    ...    http://127.0.0.1:8181/onos/v1/network/configuration/apps/org.opencord.sadis
    ...    --data @onos-files/onos-sadis-sample.json; cd -
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0

Configure ONOS RADIUS Connection
    [Documentation]    Configures the ONOS RADIUS Connection
    ${cmd}	Catenate
    ...    sed -e s/:RADIUS_SVC:/radius-freeradius.default.svc/g -e s/:RADIUS_PORT:/1812/
    ...    ${kind_voltha_dir}/onos-files/onos-aaa.json | curl --fail -sSL --user karaf:karaf -X POST
    ...    http://127.0.0.1:8181/onos/v1/network/configuration/apps/org.opencord.aaa
    ...    -H Content-type:application/json -d@-
    ${rc}    Run And Return Rc    ${cmd}
    Should Be Equal as Integers    ${rc}    0
