# Copyright 2021 - present Open Networking Foundation
#
# 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 of open ONU go adapter Flows
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
Resource          ../../libraries/onu_utilities.robot

*** Variables ***
${namespace}      voltha
${timeout}        60s
${of_id}          0
${logical_id}     0
${has_dataplane}    True
${external_libs}    True
${teardown_device}    True
${scripts}        ../../scripts
# Per-test logging on failure is turned off by default; set this variable to enable
${container_log_dir}    ${None}
# KV Store Prefix
# example: -v kvstoreprefix:voltha_voltha
${kvstoreprefix}    voltha_voltha
# determines the environment workflow: DT, TT or ATT (default)
# example: -v workflow:DT
${workflow}    ATT
# logging flag to enable Collect Logs, can be passed via the command line too
# example: -v logging:True
${logging}    False
# used tech profile, can be passed via the command line too, valid values: default (=1T1GEM), 1T4GEM, 1T8GEM
# example: -v techprofile:1T4GEM
${techprofile}    default
# if True execution will be paused before clean up, only use in case of manual testing, do not use in ci pipeline!
# example: -v pausebeforecleanup:True
${pausebeforecleanup}    False
${data_dir}    ../data

*** Test Cases ***
Flows Test
    [Documentation]    Validates onu vlan rules in etcd:
    [Tags]    functionalOnuGo    FlowsTest
    [Setup]    Start Logging    FlowsTest
    ${onu_tags_dict}=    Collect Tags Per ONU
    # Check and store vlan rules
    Wait Until Keyword Succeeds    ${timeout}    2s    Run Keyword And Continue On Failure
    ...    Validate Etcd Vlan Rules Added Subscriber    ${onu_tags_dict}    defaultkvstoreprefix=${kvstoreprefix}
    #log flows for verification
    ${flowsresult}=    Execute ONOS CLI Command use single connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    flows -s
    log     ${flowsresult}
    FOR    ${J}    IN RANGE    0    ${num_olts}
        ${olt_serial_number}=    Set Variable    ${list_olts}[${J}][sn]
        ${of_id}=    Wait Until Keyword Succeeds    ${timeout}    15s    Validate OLT Device in ONOS
        ...    ${olt_serial_number}
        # Remove subscriber
        Do Onu Subscriber Remove Per OLT    ${of_id}    ${olt_serial_number}
    END
    #log flows for verification
    ${flowsresult}=    Execute ONOS CLI Command use single connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    flows -s
    log     ${flowsresult}
    Wait Until Keyword Succeeds    ${timeout}    2s    Run Keyword And Continue On Failure    Run Keyword And Continue On Failure
    ...    Validate Etcd Vlan Rules Removed Subscriber   defaultkvstoreprefix=${kvstoreprefix}
    FOR    ${J}    IN RANGE    0    ${num_olts}
        ${olt_serial_number}=    Set Variable    ${list_olts}[${J}][sn]
        ${of_id}=    Wait Until Keyword Succeeds    ${timeout}    15s    Validate OLT Device in ONOS
        ...    ${olt_serial_number}
        Do Onu Subscriber Add Per OLT    ${of_id}    ${olt_serial_number}
    END
    #log flows for verification
    ${flowsresult}=    Execute ONOS CLI Command use single connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}    flows -s
    log     ${flowsresult}
    Wait Until Keyword Succeeds    ${timeout}    2s    Run Keyword And Continue On Failure    Run Keyword And Continue On Failure
    ...    Validate Etcd Vlan Rules Added Subscriber    ${onu_tags_dict}    defaultkvstoreprefix=${kvstoreprefix}
    [Teardown]    Run Keywords    Run Keyword If    ${logging}    Collect Logs
    ...           AND    Stop Logging    FlowsTest

*** Keywords ***
Setup Suite
    [Documentation]    Set up the test suite inclusive enable device and sanity test of given workflow
    Common Test Suite Setup
    ${techprofile}=    Set Variable If    "${techprofile}"=="1T1GEM"    default    ${techprofile}
    Set Suite Variable    ${techprofile}
    Run Keyword If    "${techprofile}"=="default"   Log To Console    \nTechProfile:default (1T1GEM)
    ...    ELSE IF    "${techprofile}"=="1T4GEM"    Set Tech Profile    1T4GEM
    ...    ELSE IF    "${techprofile}"=="1T8GEM"    Set Tech Profile    1T8GEM
    ...    ELSE    Fail    The TechProfile (${techprofile}) is not valid!
    ${switch_type}=    Get Variable Value    ${web_power_switch.type}
    Run Keyword If  "${switch_type}"!=""    Set Global Variable    ${powerswitch_type}    ${switch_type}
    Setup
    Run Keyword If    ${has_dataplane}    Clean Up Linux
    Run Keyword If    "${workflow}"=="DT"    Perform Sanity Test DT
    ...    ELSE IF    "${workflow}"=="TT"    Perform Sanity Tests TT
    ...    ELSE       Perform Sanity Test

Teardown Suite
    [Documentation]    Replaces the Suite Teardown in utils.robot.
    ...    Cleans up and checks all ONU ports disabled in ONOS.
    ...    Furthermore gives the possibility to pause the execution.
    Run Keyword If    ${pausebeforecleanup}    Import Library    Dialogs
    Run Keyword If    ${pausebeforecleanup}    Pause Execution    Press OK to continue with clean up!
    Run Keyword If    ${pausebeforecleanup}    Log    Teardown will be continued...    console=yes
    Run Keyword If    ${teardown_device}    Delete All Devices and Verify
    Wait Until Keyword Succeeds    ${timeout}    1s    Validate Onu Data In Etcd    0    ${kvstoreprefix}    without_pm_data=False
    Wait for Ports in ONOS for all OLTs      ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}  0   BBSM    ${timeout}
    Close All ONOS SSH Connections
    Remove Tech Profile

Validate Etcd Vlan Rules Added Subscriber
    [Documentation]    This keyword validates Vlan rules of openonu-go-adapter Data stored in etcd.
    ...                It checks the match_vid (=4096) and set_vid when subscriber are added.
    [Arguments]    ${onu_tags_dict}    ${reqmatchvid}=4096    ${defaultkvstoreprefix}=voltha_voltha
    ${kvstoreprefix}=    Get Kv Store Prefix    ${defaultkvstoreprefix}
    ${etcddata}=    Get ONU Go Adapter ETCD Data    ${kvstoreprefix}    True    True
    #prepare result for json convert
    ${result}=    Prepare ONU Go Adapter ETCD Data For Json    ${etcddata}
    ${jsondata}=    To Json    ${result}
    ${length}=    Get Length    ${jsondata}
    log    ${jsondata}
    Should Not Be Empty     ${jsondata}
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata}    ${INDEX}
        ${flowparams}=    Get From Dictionary    ${value['uni_config'][0]}    flow_params
        ${onu}=    Get From Dictionary    ${value}    serial_number
        Validate Flow Params Vlan Rules    ${flowparams}    ${onu_tags_dict}    ${onu}    ${reqmatchvid}
    END

Validate Flow Params Vlan Rules
    [Documentation]    This keyword validates Vlan rules of openonu-go-adapter Data iterating over passed flow params.
    ...                It checks the match_vid (=4096) and set_vid when subscriber are added.
    [Arguments]    ${flowparams}    ${onu_tags_dict}    ${onu}    ${reqmatchvid}=4096
    ${length}=    Get Length    ${flowparams}
    ${nbofexpectedrules}=    Set Variable If
    ...    "${workflow}"=="TT" and ${has_dataplane}        4
    ...    "${workflow}"=="TT" and not ${has_dataplane}    3
    ...    "${workflow}"=="DT" or "${workflow}"=="ATT"     1
    Should Be Equal As Numbers    ${length}    ${nbofexpectedrules}
    ...    msg=wrong number of vlan rules (${length} != ${nbofexpectedrules})!
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${flowparams}    ${INDEX}
        ${matchvid}=    Get From Dictionary    ${value['vlan_rule_params']}
        ...    match_vid
        Should Be Equal As Integers    ${matchvid}    ${reqmatchvid}
        ${setvid}=    Get From Dictionary    ${value['vlan_rule_params']}
        ...    set_vid
        ${c_tags_list}=    Get From Dictionary    ${onu_tags_dict['${onu}']}    c_tags
        ${tagindex}=    Get Index From List    ${c_tags_list}   ${setvid}
        Should Not Be Equal As Integers    ${tagindex}    -1    msg=set_vid out of range (${setvid})!
    END

Validate Etcd Vlan Rules Removed Subscriber
    [Documentation]    This keyword validates Vlan rules of openonu-go-adapter Data stored in etcd.
    ...                It checks the match_vid (=4096) and set_vid when subscriber are removed.
    [Arguments]    ${reqmatchvid}=4096    ${defaultkvstoreprefix}=voltha_voltha
    ${kvstoreprefix}=    Get Kv Store Prefix    ${defaultkvstoreprefix}
    ${etcddata}=    Get ONU Go Adapter ETCD Data    ${kvstoreprefix}        True    True
    #prepare result for json convert
    ${result}=    Prepare ONU Go Adapter ETCD Data For Json    ${etcddata}
    ${jsondata}=    To Json    ${result}
    ${length}=    Get Length    ${jsondata}
    log    ${jsondata}
    Should Not Be Empty     ${jsondata}
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata}    ${INDEX}
        @{result_values}=    Run Keyword And Ignore Error
        ...    Get From Dictionary    ${value['uni_config'][0]['flow_params'][0]['vlan_rule_params']}    match_vid
        ${result}=       Set Variable    @{result_values}[0]
        ${matchvid}=     Set Variable    @{result_values}[1]
        Run Keyword If    "${workflow}"=="ATT"    Should Be Equal As Integers    ${matchvid}    ${reqmatchvid}
        ...    ELSE       Should Be Equal As Strings    ${result}    FAIL
        @{result_values}=    Run Keyword And Ignore Error
        ...    Get From Dictionary    ${value['uni_config'][0]['flow_params'][0]['vlan_rule_params']}   set_vid
        ${result}=       Set Variable    @{result_values}[0]
        ${setvid}=       Set Variable    @{result_values}[1]
        ${evalresult}=    Run Keyword If    "${workflow}"=="ATT"    Evaluate    ${setvid} == 4091
        ...               ELSE              Evaluate    "${result}" == "FAIL"
        Should Be True    ${evalresult}    msg=set_vid out of range (${setvid})!
    END

Collect Tags Per ONU
    [Documentation]    This keyword collects the s- and c-tags per ONU.
    ${onu_tags_dict}=     Create Dictionary
    FOR    ${I}    IN RANGE    0    ${num_all_onus}
        ${src}=    Set Variable    ${hosts.src[${I}]}
        ${onu_tags_dict}=    Run Keyword If  '${src['onu']}' in ${onu_tags_dict}   Update ONU Tags Dict    ${onu_tags_dict}
        ...                                  ${src['onu']}    ${src['c_tag']}    ${src['s_tag']}
        ...    ELSE    Append To ONU Tags Dict    ${onu_tags_dict}
        ...                                  ${src['onu']}    ${src['c_tag']}    ${src['s_tag']}
    END
    log    ${onu_tags_dict}
    [return]    ${onu_tags_dict}

Update ONU Tags Dict
    [Documentation]    This keyword update passed dictionary with the s- and c-tags for passed ONU.
    [Arguments]    ${onu_tags_dict}    ${onu}    ${c_tag}    ${s_tag}
    ${c_tag}=    Convert To Integer    ${c_tag}
    ${s_tag}=    Convert To Integer    ${s_tag}
    ${c_tags_list}=    Get From Dictionary    ${onu_tags_dict['${onu}']}    c_tags
    Append To List    ${c_tags_list}    ${c_tag}
    ${s_tags_list}=    Get From Dictionary    ${onu_tags_dict['${onu}']}    s_tags
    Append To List    ${s_tags_list}    ${s_tag}
    Set To Dictionary    ${onu_tags_dict['${onu}']}    c_tags    ${c_tags_list}    s_tags    ${s_tags_list}
    [return]    ${onu_tags_dict}

Append To ONU Tags Dict
    [Documentation]    This keyword append the s- and c-tags of passed ONU to passed dictionary .
    [Arguments]    ${onu_tags_dict}    ${onu}    ${c_tag}    ${s_tag}
    ${c_tag}=    Convert To Integer    ${c_tag}
    ${s_tag}=    Convert To Integer    ${s_tag}
    ${c_tags_list}=    Create List    ${c_tag}
    ${s_tags_list}=    Create List    ${s_tag}
    ${onu_dict}=    Create Dictionary    c_tags    ${c_tags_list}    s_tags    ${s_tags_list}
    Set To Dictionary    ${onu_tags_dict}    ${onu}    ${onu_dict}
    [return]    ${onu_tags_dict}
