# Copyright 2017-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.
# vgc common functions

*** Settings ***
Documentation     Library for various utilities
Library           SSHLibrary
Library           String
Library           DateTime
Library           Process
Library           Collections
Library           RequestsLibrary
Library           OperatingSystem

*** Variables ***
@{connection_list}
${alias}                  VGC_SSH
${ssh_read_timeout}       60s
${ssh_prompt}             karaf@root >
${ssh_regexp_prompt}      REGEXP:k.*a.*r.*a.*f.*@.*r.*o.*o.*t.* .*>.*
${regexp_prompt}          (?ms)(.*)k(.*)a(.*)r(.*)a(.*)f(.*)@(.*)r(.*)o(.*)o(.*)t(.*) (.*)>(.*)
${ssh_width}              400
${disable_highlighter}    setopt disable-highlighter
# ${keep_alive_interval} is set to 0s means sending the keepalive packet is disabled!
${keep_alive_interval}    0s
${INFRA_DT_NAMESPACE}      infra


*** Keywords ***
Create VGC Session
    [Documentation]    Creates a VGC session
    Create Session    VGC    http://${VGC_REST_IP}:${VGC_REST_PORT}/vgc/v1

Validate OLT Device in VGC
    #    FIXME use volt-olts to check that the OLT is VGC
    [Arguments]    ${serial_number}
    [Documentation]    Checks if olt has been connected to VGC
    Create VGC Session
    ${resp}=    Get Request    VGC    devices
    Log     ${resp}
    ${jsondata}=    To Json   ${resp.content}
    Should Not Be Empty    ${jsondata['devices']}
    ${length}=    Get Length    ${jsondata['devices']}
    @{serial_numbers}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['devices']}    ${INDEX}
        ${of_id}=    Get From Dictionary    ${value}    id
        ${sn}=    Get From Dictionary    ${value}    serial
        ${matched}=    Set Variable If    '${sn}' == '${serial_number}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for ${serial_number} found
    [Return]    ${of_id}



Validate Deleted Device Cleanup In VGC
    [Arguments]    ${ip}    ${port}    ${olt_serial_number}    ${olt_of_id}    ${maclearning_enabled}=False
    [Documentation]    The keyword verifies that ports, flows, meters, subscribers, dhcp are all cleared in VGC
    # Verify Ports are Removed
    ${ports}=    Get Request    VGC    devices/ports
    ${port_json_resp}=    To Json   ${ports.content}
    Should Not Contain    ${port_json_resp}     ${olt_of_id}    Ports have not been removed from VGC after cleanup
    # Verify Subscribers are Removed
    ${sub}=    Get Request    VGC    programmed-subscribers
    ${sub_json_resp}=    To Json   ${sub.content}
    Should Not Contain    ${sub_json_resp}     ${olt_of_id}   Subscriber have not been removed from VGC after cleanup
    # Verify Flows are Removed
    ${flows}=    Get Request    VGC    flows
    ${flow_json_resp}=    To Json   ${flows.content}
    Should Not Contain    ${flow_json_resp}     ${olt_of_id}    Flows have not been removed from VGC after cleanup
    # Verify Meters are Removed
    ${meter}=    Get Request    VGC    meters
    ${meter_json_resp}=    To Json   ${meter.content}
    Should Not Contain    ${meter_json_resp}     ${olt_of_id}   Meter have not been removed from VGC after cleanup
    # Verify AAA-Users are Removed
    # ${aaa}=    Execute ONOS CLI Command use single connection     ${ip}    ${port}
    #...    aaa-users ${olt_of_id}
    # ${aaa_count}=      Get Line Count      ${aaa}
    #Should Be Equal As Integers    ${aaa_count}    0    AAA Users have not been removed from ONOS after cleanup
    # Verify Dhcp-Allocations are Removed
    ${dhcp}=    Get Request    VGC    allocations/${olt_of_id}
    ${dhcp_json_resp}=    To Json   ${dhcp.content}
    ${dhcp_count} =    Get Length      ${dhcp_json_resp}
    #Should Be Equal    ${dhcp_json_resp}     ${None}     DHCP Allocations have not been removed from VGC after cleanup
    Should Be Equal As Integers    ${dhcp_count}    0   DHCP Allocations have not been removed from VGC after cleanup
    # Verify MAC Learner Mappings are Removed
    # ${mac}=    Run Keyword If    ${maclearning_enabled}    Execute ONOS CLI Command use single connection     ${ip}    ${port}
    # ...    mac-learner-get-mapping | grep -v INFO
    # ${mac_count}=    Run Keyword If    ${maclearning_enabled}    Get Line Count    ${mac}
    # ...    ELSE    Set Variable    0
    # Should Be Equal As Integers    ${mac_count}    0   Client MAC Learner Mappings have not been removed from ONOS after cleanup


Get NNI Port in VGC
    [Arguments]    ${olt_of_id}
    [Documentation]    Retrieves NNI port for the OLT in VGC
    ${resp}=    Get Request    VGC    devices/${olt_of_id}/ports
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['ports']}
    ${length}=    Get Length    ${jsondata['ports']}
    @{ports}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['ports']}    ${INDEX}
        ${annotations}=    Get From Dictionary    ${value}    annotations
        ${nni_port}=    Get From Dictionary    ${value}    port
        ${nniPortName}=    Catenate    SEPARATOR=    nni-    ${nni_port}
        ${portName}=    Get From Dictionary    ${annotations}    portName
        ${matched}=    Set Variable If    '${portName}' == '${nniPortName}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for NNI found for ${olt_of_id}
    [Return]    ${nni_port}



Get ONU Port in VGC
    [Arguments]    ${onu_serial_number}    ${olt_of_id}    ${onu_uni_id}=1
    [Documentation]    Retrieves ONU port for the ONU in VGC
    ${onu_serial_number}=    Catenate    SEPARATOR=-    ${onu_serial_number}    ${onu_uni_id}
    ${resp}=    Get Request    VGC    devices/${olt_of_id}/ports
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['ports']}
    ${length}=    Get Length    ${jsondata['ports']}
    @{ports}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['ports']}    ${INDEX}
        ${annotations}=    Get From Dictionary    ${value}    annotations
        ${onu_port}=    Get From Dictionary    ${value}    port
        ${portName}=    Get From Dictionary    ${annotations}    portName
        ${matched}=    Set Variable If    '${portName}' == '${onu_serial_number}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for ${onu_serial_number} found
    [Return]    ${onu_port}



Verify UNI Port Is Enabled
    [Arguments]      ${onu_name}    ${onu_uni_id}=1
    [Documentation]    Verifies if the ONU's UNI port is enabled in VGC
    ${onu_serial_number}=    Catenate    SEPARATOR=-    ${onu_name}    ${onu_uni_id}
    ${resp}=    Get Request    VGC    devices/ports
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['ports']}
    ${length}=    Get Length    ${jsondata['ports']}
    @{ports}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['ports']}    ${INDEX}
        ${annotations}=    Get From Dictionary    ${value}    annotations
        ${onu_port}=    Get From Dictionary    ${value}    port
        ${portName}=    Get From Dictionary    ${annotations}    portName
        ${portstatus}=    Get From Dictionary    ${value}    isEnabled
        ${matched}=    Set Variable If    '${portName}' == '${onu_serial_number}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for ${onu_serial_number} found
    Should be Equal 	${portstatus}     ${True}


Verify UNI Port Is Disabled
    [Arguments]      ${ip}    ${port}    ${onu_name}    ${onu_uni_id}=1
    [Documentation]    Verifies if the ONU's UNI port is enabled in VGC
    ${onu_serial_number}=    Catenate    SEPARATOR=-    ${onu_name}    ${onu_uni_id}
    ${resp}=    Get Request    VGC    devices/ports
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['ports']}
    ${length}=    Get Length    ${jsondata['ports']}
    @{ports}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['ports']}    ${INDEX}
        ${annotations}=    Get From Dictionary    ${value}    annotations
        ${onu_port}=    Get From Dictionary    ${value}    port
        ${portName}=    Get From Dictionary    ${annotations}    portName
        ${portstatus}=    Get From Dictionary    ${value}    isEnabled
        ${matched}=    Set Variable If    '${portName}' == '${onu_serial_number}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for ${onu_serial_number} found
    Should be Equal 	${portstatus}     ${False}

Close All VGC SSH Connections
    [Documentation]    Close all VGC Connection and clear connection list.
    SSHLibrary.Close All Connections
    @{connection_list}    Create List



Verify Subscriber Access Flows Added For ONU DT in VGC
    [Arguments]    ${ip}    ${port}    ${olt_of_id}    ${onu_port}    ${nni_port}    ${s_tag}
    [Documentation]    Verifies if the Subscriber Access Flows are added in VGC for the ONU
    # Get all flows from VGC
    ${resp}=    Get Request    VGC   flows/${olt_of_id}
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['flows']}
    # Verify upstream table=0 flow
    ${length}=    Get Length    ${jsondata['flows']}
    @{flows}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${tableid}=     Get Table Id From Flow    ${flow}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${matched}=    Set Variable If
        ...    '${tableid}' == '0' and '${inport}' == '${onu_port}' and '${vlanvid}' == '4096' and '${outport}' == '1'
        ...    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for upstream table 0 flow found
    # Verify upstream table=1 flow
    ${matched1}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${subtype}=    Get Subtype From Flow   ${flow}
        ${vlanid}=     Get Vlan Id From Flow   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${onu_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '4096' and '${outport}' == '${nni_port}'
        ${res3}=    Evaluate    '${subtype}' == 'VLAN_PUSH' and '${vlanid}' == '${s_tag}'
        ${matched1}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched1}
    END
    Should Be True    ${matched1}    No match for upstream table 1 flow found
    # Verify downstream table=0 flow
    ${matched2}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${subtype}=    Get Subtype From Flow   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${nni_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${s_tag}' and '${outport}' == '1'
        ${res3}=    Evaluate    '${subtype}' == 'VLAN_POP'
        ${matched2}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched2}
    END
    Should Be True    ${matched2}    No match for downstream table 0 flow found
    # Verify downstream table=1 flow
    ${matched3}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${matched3}=    Set Variable If
        ...  '${inport}' == '${nni_port}' and '${vlanvid}' == '4096' and '${outport}' == '${onu_port}'
        ...  True    False
        Exit For Loop If    ${matched3}
    END
    Should Be True    ${matched3}    "No match for downstream table 1 flow found"

Verify Subscriber Access Flows Added for DT FTTB
    [Arguments]    ${olt_of_id}    ${onu_port}    ${nni_port}    ${s_tag}    ${c_tag}
    [Documentation]    Verifies if the Subscriber Access Flows are added in ONOS for the ONU
    # Get all flows from VGC
    ${resp}=    Get Request    VGC   flows/${olt_of_id}
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['flows']}
    # Upstream
    # ONU
    ${length}=    Get Length    ${jsondata['flows']}
    @{flows}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${tableid}=     Get Table Id From Flow    ${flow}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${matched}=    Set Variable If
        ...    '${inport}' == '${onu_port}' and '${vlanvid}' == '${c_tag}' and '${outport}' == '1'
        ...    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for upstream ONU flow found
    # OLT
    ${matched1}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${onu_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${c_tag}' and '${vlanid}' == '${s_tag}'
        ${res3}=    Evaluate    '${outport}' == '${nni_port}'
        ${matched1}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched1}
    END
    Should Be True    ${matched1}    No match for upstream OLT found
    # Downstream
    # OLT
    ${matched2}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${nni_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${s_tag}' and '${vlanid}' == '${c_tag}'
        ${res3}=    Evaluate    '${outport}' == '1'
        ${matched2}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched2}
    END
    Should Be True    ${matched2}    No match for downstream OLT found
    # ONU
    ${matched3}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${tableid}=     Get Table Id From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${nni_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${c_tag}' and '${outport}' == '${onu_port}'
        ${matched3}=     Set Variable If  ${res1} and ${res2}   True    False
        Exit For Loop If    ${matched3}
    END
    Should Be True    ${matched3}    No match for downstream ONU found

Verify DPU MGMT Flows Added for DT FTTB
    [Arguments]    ${olt_of_id}    ${onu_port}    ${nni_port}    ${s_tag}    ${c_tag}
    [Documentation]    Verifies if the DPU MGMT Flows are added in VGC for the ONU
    # Get all flows from VGC
    ${resp}=    Get Request    VGC   flows/${olt_of_id}
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata['flows']}
    # Upstream
    # ONU
    ${length}=    Get Length    ${jsondata['flows']}
    @{flows}=    Create List
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${tableid}=     Get Table Id From Flow    ${flow}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${res1}=    Evaluate    '${inport}' == '${onu_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${c_tag}' and '${vlanid}' == '${s_tag}'
        ${res3}=    Evaluate    '${outport}' == '1'
        ${matched}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for upstream ONU flow found
    # OLT
    ${matched1}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${matched1}=    Set Variable If
        ...    '${inport}' == '${onu_port}' and '${vlanvid}' == '${s_tag}' and '${outport}' == '${nni_port}'
        ...    True    False
        ${matched1}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Log To Console  "bbb",'${inport}' == '${onu_port}' '${vlanvid}' == '${s_tag}' '${outport}' == '${nni_port}'
        Exit For Loop If    ${matched1}
    END
    Should Be True    ${matched1}    No match for upstream OLT found
    # Downstream
    # OLT
    ${matched2}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${matched3}=    Set Variable If
        ...    '${inport}' == '${nni_port}' and '${vlanvid}' == '${s_tag}' and '${outport}' == '1'
        ...    True    False
        Exit For Loop If    ${matched3}
    END
    Should Be True    ${matched3}    No match for downstream OLT found
    # ONU
    ${matched4}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${vlanvid}=    Get Vlan VId From Flow    ${flow}
        ${tableid}=     Get Table Id From Flow    ${flow}
        ${outport}=    Get Out Port From Flow    ${flow}
        ${vlanid}=     Get Vlan Id From Flow For Fttb   ${flow}
        ${res1}=    Evaluate    '${inport}' == '${nni_port}'
        ${res2}=    Evaluate    '${vlanvid}' == '${s_tag}' and '${vlanid}' == '${c_tag}'
        ${res3}=    Evaluate    '${outport}' == '${onu_port}'
        ${matched4}=     Set Variable If  ${res1} and ${res2} and ${res3}   True    False
        Exit For Loop If    ${matched4}
    END
    Should Be True    ${matched4}    No match for downstream ONU found

Verify VGC Flows Added for DT FTTB
    [Arguments]    ${olt_of_id}    ${onu_port}    ${nni_port}    ${service}
    [Documentation]    Verifies if the Flows are added in ONOS for the ONU
    ${num_services}=    Get Length    ${service}
    FOR     ${I}    IN RANGE    0    ${num_services}
        ${service_name}=    Set Variable    ${service[${I}]['name']}
        ${stag}=    Set Variable    ${service[${I}]['s_tag']}
        ${ctag}=    Set Variable    ${service[${I}]['c_tag']}
        Run Keyword If    '${service_name}' == 'FTTB_SUBSCRIBER_TRAFFIC'
        ...    Verify Subscriber Access Flows Added for DT FTTB    ${olt_of_id}
        ...    ${onu_port}    ${nni_port}    ${stag}    ${ctag}
        ...    Verify DPU MGMT Flows Added for DT FTTB    ${olt_of_id}
        ...    ${onu_port}    ${nni_port}    ${stag}    ${ctag}
    END


Add Subscriber Details
    [Documentation]    Adds a particular subscriber
    [Arguments]    ${of_id}    ${onu_port}
    ${resp}=    Post Request    VGC    services/${of_id}/${onu_port}
    Log   ${resp}
    Should Be Equal As Strings    ${resp.status_code}    200

Remove Subscriber Access
    [Documentation]    Removes a particular subscriber
    [Arguments]    ${of_id}    ${onu_port}
    ${resp}=    Delete Request    VGC    services/${of_id}/${onu_port}
    Log   ${resp}
    Should Be Equal As Strings    ${resp.status_code}    200

Send File To VGC
    [Documentation]    Send the content of the file to VGC to selected section of configuration
    ...   using Post Request
    [Arguments]    ${CONFIG_FILE}    #${section}=${EMPTY}
    ${Headers}=    Create Dictionary    Content-Type    application/json
    ${File_Data}=    OperatingSystem.Get File    ${CONFIG_FILE}
    Log    ${Headers}
    Log    ${File_Data}
    ${resp}=    Post Request    VGC
    ...    network/configurations    headers=${Headers}    data=${File_Data}
    Should Be Equal As Strings    ${resp.status_code}    200

Verify No Pending Flows For ONU
    [Arguments]    ${ip}    ${port}    ${onu_port}
    [Documentation]    Verifies that there are no flows "PENDING" state for the ONU in VGC
    ${resp}=    Get Request    VGC   flows/pending
    ${jsondata}=    To Json    ${resp.content}
    ${length}=    Get Length    ${jsondata['flows']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${flow}=    Get From List    ${jsondata['flows']}    ${INDEX}
        ${inport}=     Get In Port From Flow    ${flow}
        ${matched}=     Run Keyword If   '${inport}' == '${onu_port}'   Set Variable    ${TRUE}
        Exit For Loop If    ${matched}
    END
    Should Be Equal   ${matched}     False    No match for  pending flow  found

Get Pending Flow Count
    [Documentation]    Get the count for flows "PENDING" state for the ONU in VGC
    ${resp}=    Get Request    VGC   flows/pending
    ${jsondata}=    To Json    ${resp.content}
    ${length}=    Get Length    ${jsondata['flows']}
    [Return]    ${length}

Get In Port From Flow
    [Documentation]    Fetches the port Record for IN_PORT
    [Arguments]    ${flow}
    ${selector}=    Get From Dictionary    ${flow}    selector
    ${len}=    Get Length    ${selector['criteria']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${criteria}=    Get From List    ${selector['criteria']}    ${INDEX}
           ${type}=       Get From Dictionary    ${criteria}    type
           ${port}=     Run Keyword If    '${type}' == 'IN_PORT'       Get From Dictionary    ${criteria}    port
           ${matched}=    Set Variable If    '${type}' == 'IN_PORT'    True    False
           Exit For Loop If    ${matched}
    END
    [Return]    ${port}



Get Vlan VId From Flow
    [Documentation]    Fetches the vlan Id
    [Arguments]    ${flow}
    ${selector}=    Get From Dictionary    ${flow}    selector
    ${len}=    Get Length    ${selector['criteria']}
    ${matched}=    Set Variable    False
    ${vlanid}=     Set Variable
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${criteria}=    Get From List    ${selector['criteria']}    ${INDEX}
           ${type}=       Get From Dictionary    ${criteria}    type
           ${vlanid}=     Run Keyword If    '${type}' == 'VLAN_VID'       Get From Dictionary    ${criteria}    vlanId
           ${matched}=    Set Variable If    '${type}' == 'VLAN_VID'    True    False
           Exit For Loop If    ${matched}
    END
    [Return]    ${vlanid}


Get Out Port From Flow
    [Documentation]    Fetches the port for OUTPUT
    [Arguments]    ${flow}
    ${treatment}=    Get From Dictionary    ${flow}    treatment
    ${len}=    Get Length    ${treatment['instructions']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${instructions}=    Get From List    ${treatment['instructions']}    ${INDEX}
           ${type}=       Get From Dictionary    ${instructions}    type
           ${outport}=    Run Keyword If    '${type}' == 'OUTPUT'      Get From Dictionary    ${instructions}    port
           ${matched}=    Set Variable If    '${type}' == 'OUTPUT'    True    False
           Exit For Loop If    ${matched}
    END
    [Return]    ${outport}


Get Subtype From Flow
    [Documentation]    Fetches the L2MODIFICATION subtype
    [Arguments]    ${flow}
    ${treatment}=    Get From Dictionary    ${flow}    treatment
    ${len}=    Get Length    ${treatment['instructions']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${instructions}=    Get From List    ${treatment['instructions']}    ${INDEX}
           ${type}=       Get From Dictionary    ${instructions}    type
           ${subtype}=    Run Keyword If    '${type}' == 'L2MODIFICATION'      Get From Dictionary    ${instructions}    subtype
           ${matched}=    Set Variable If    '${type}' == 'L2MODIFICATION'   True    False
           Exit For Loop If    ${matched}
    END
    [Return]    ${subtype}

Get Vlan Id From Flow For Fttb
    [Documentation]    Fetch the VLAN id for L2MODIFICATION
    [Arguments]    ${flow}
    ${treatment}=    Get From Dictionary    ${flow}    treatment
    ${len}=    Get Length    ${treatment['instructions']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${instructions}=    Get From List    ${treatment['instructions']}    ${INDEX}
           ${type}=       Get From Dictionary    ${instructions}    type
           ${subtype}=    Run Keyword If    '${type}' == 'L2MODIFICATION'      Get From Dictionary    ${instructions}    subtype
           ${vlanId}=    Run Keyword If    '${type}' == 'L2MODIFICATION' and '${subtype}' == 'VLAN_SET'
           ...    Get From Dictionary    ${instructions}    vlanId
           ${matched}=    Set Variable If    '${type}' == 'L2MODIFICATION' and '${subtype}' == 'VLAN_SET'   True    False
           Exit For Loop If    ${matched}
    END
    [Return]      ${vlanId}

Get Table Id From Flow
    [Documentation]    Fetch the TableId
    [Arguments]    ${flow}
    ${tableid}=    Get From Dictionary    ${flow}    tableId
    [Return]    ${tableid}

Get Vlan Id From Flow
    [Documentation]    Fetch the VLAN id for L2MODIFICATION
    [Arguments]    ${flow}
    ${treatment}=    Get From Dictionary    ${flow}    treatment
    ${len}=    Get Length    ${treatment['instructions']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${len}
           ${instructions}=    Get From List    ${treatment['instructions']}    ${INDEX}
           ${type}=       Get From Dictionary    ${instructions}    type
           ${subtype}=    Run Keyword If    '${type}' == 'L2MODIFICATION'      Get From Dictionary    ${instructions}    subtype
           ${vlanId}=    Run Keyword If    '${type}' == 'L2MODIFICATION' and '${subtype}' == 'VLAN_ID'
           ...    Get From Dictionary    ${instructions}    vlanId
           ${matched}=    Set Variable If    '${type}' == 'L2MODIFICATION' and '${subtype}' == 'VLAN_ID'   True    False
           Exit For Loop If    ${matched}
    END
    [Return]      ${vlanId}

Get Subscribers for a Particular Service
    [Documentation]    Filters the subscriber for a particular service
    [Arguments]    ${olt_of_id}    ${subscriber_json}    ${filter}
    ${subscribers_info}=    Get From Dictionary    ${subscriber_json}    subscribers
    ${num_subscribers}=    Get Length    ${subscribers_info}
    ${subscriber_list}    Create List
    Return From Keyword If  '${filter}' == '${EMPTY}'   ${subscribers_info}
    FOR    ${INDEX}    IN RANGE    0    ${num_subscribers}
        ${subscriber}=    Get From List    ${subscribers_info}    ${INDEX}
        ${res1}=    Evaluate    '${olt_of_id}' == '${subscriber["location"]}'
        ${tag_subscriber_info}=    Get From Dictionary    ${subscriber}    tagInfo
        ${ServiceName}=    Get From Dictionary    ${tag_subscriber_info}    serviceName
        ${res2}=    Evaluate    '${filter}' == '${ServiceName}'
        Run Keyword If    ${res1} and ${res2}
        ...    Append To List    ${subscriber_list}    ${subscriber}
        ${matched}=     Set Variable If  ${res1} and ${res2}   True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No matching subscriber for OLT
    [Return]    ${subscriber_list}

Get Programmed Subscribers
    [Arguments]    ${olt_of_id}    ${onu_port}    ${filter}=${EMPTY}
    [Documentation]    Retrieves the subscriber details at a given location
    ${programmed_sub}=      Get Request    VGC    programmed-subscribers
    ${programmed_sub_json_resp}=    To Json   ${programmed_sub.content}
    ${filtered_subscriber_list}=    Get Subscribers for a Particular Service    ${olt_of_id}    ${programmed_sub_json_resp}
    ...    ${filter}
    [Return]    ${filtered_subscriber_list}

Verify Programmed Subscribers DT FTTB
    [Arguments]    ${olt_of_id}    ${onu_port}    ${service}
    [Documentation]    Verifies the subscriber is present at a given location
    ${num_services}=    Get Length    ${service}
    FOR    ${I}    IN RANGE    0    ${num_services}
        ${service_name}=    Set Variable    ${service[${I}]['name']}
        ${programmed_subscriber}=    Get Programmed Subscribers    ${olt_of_id}    ${onu_port}
        ...    ${service_name}
        Log    ${programmed_subscriber}
        Should Not Be Empty    ${programmed_subscriber}
    END

Verify Meters in VGC Ietf
    [Arguments]    ${ip}    ${port}    ${olt_of_id}    ${onu_port}    ${filter}=${EMPTY}
    [Documentation]    Verifies the meters with BW Ietf format (currently, DT workflow uses this format)
    ${programmed_sub_json_resp}=    Get Programmed Subscribers    ${olt_of_id}    ${onu_port}
    ...    ${filter}
    Log    ${programmed_sub_json_resp}
    ${us_bw_profile}    ${ds_bw_profile}    Get Upstream and Downstream Bandwidth Profile Name
    ...    ${programmed_sub_json_resp}
    # Get upstream bandwidth profile details
    ${us_cir}    ${us_cbs}    ${us_pir}    ${us_pbs}    ${us_gir}    Get Bandwidth Profile Details Ietf Rest
    ...    ${us_bw_profile}
    # Verify meter for upstream bandwidth profile
    ${meter}=      Get Request    VGC    meters
    ${meter_json_resp}=    To Json   ${meter.content}
    Log    ${meter_json_resp}
    ${rate}    ${burst_size}   Get Meter Param In Details
    ...    ${meter_json_resp}  1
    Log    ${rate}
    Log    ${burst_size}
    # for cir & cbs
    ${matched}=    Set Variable If    '${rate}' == '${us_cir}' and '${burst_size}' == '${us_cbs}'   True    False
    Should Be True    ${matched}
    ${res1}=    Evaluate    '${rate}' == '${us_cir}' and '${burst_size}' == '${us_cbs}'
    #for pir & pbs
    ${rate}    ${burst_size}   Get Meter Param In Details
    ...    ${meter_json_resp}  2
    ${matched}=    Set Variable If    '${rate}' == '${us_pir}' and '${burst_size}' == '${us_pbs}'   True    False
    Should Be True    ${matched}
    ${res2}=    Evaluate    '${rate}' == '${us_pir}' and '${burst_size}' == '${us_pbs}'
    #for gir
    Run Keyword if  ${us_gir} != 0    Validate Guarenteed Information Rate    ${us_gir}  ${meter_json_resp}
    # Get downstream bandwidth profile details
    ${ds_cir}    ${ds_cbs}    ${ds_pir}    ${ds_pbs}    ${ds_gir}    Get Bandwidth Profile Details Ietf Rest
    ...    ${ds_bw_profile}
    # Verify meter for downstream bandwidth profile
    ${meter}=      Get Request    VGC    meters
    ${meter_json_resp}=    To Json   ${meter.content}
    Log    ${meter_json_resp}
    ${rate}    ${burst_size}   Get Meter Param In Details
    ...    ${meter_json_resp}  1
    Log    ${rate}
    Log    ${burst_size}
    # for cir & cbs
    ${matched}=    Set Variable If    '${rate}' == '${ds_cir}' and '${burst_size}' == '${ds_cbs}'    True    False
    Should Be True    ${matched}
    #for pir & pbs
    ${rate}    ${burst_size}   Get Meter Param In Details
    ...    ${meter_json_resp}  2
    ${matched}=    Set Variable If    '${rate}' == '${ds_pir}' and '${burst_size}' == '${ds_pbs}'  True    False
    Should Be True    ${matched}
    #for gir
    Run Keyword If    ${ds_gir} != 0
    ...    Validate Guarenteed Information Rate    ${ds_gir}  ${meter_json_resp}

Validate Guarenteed Information Rate
    [Documentation]    Validate gir for both upstream and downstream meters
    [Arguments]    ${gir}    ${meter_json_resp}
    ${rate}    ${burst_size}   Get Meter Param In Details
    ...    ${meter_json_resp}  3
    ${matched}=    Set Variable If    '${rate}' == '${gir}' and '${burst_size}' == '0'  True    False
    Should Be True    ${matched}
    [Return]    ${matched}

Get Bandwidth Profile Details Ietf Rest
    [Arguments]    ${bw_profile_id}
    [Documentation]    Retrieves the details of the given Ietf standard based bandwidth profile using REST API
    ${bw_profile_id}=    Remove String    ${bw_profile_id}    '    "
    ${resp}=    Get Request    VGC    profiles/${bw_profile_id}
    Log     ${resp}
    ${jsondata}=    To Json    ${resp.content}
    Should Not Be Empty    ${jsondata}
    ${matched}=    Set Variable    False
    ${bw_id}=    Get From Dictionary    ${jsondata}    id
    ${matched}=    Set Variable If    '${bw_id}' == '${bw_profile_id}'    True    False
    ${pir}=    Get From Dictionary    ${jsondata}    pir
    ${pbs}=    Get From Dictionary    ${jsondata}    pbs
    ${cir}=    Get From Dictionary    ${jsondata}    cir
    ${cbs}=    Get From Dictionary    ${jsondata}    cbs
    ${gir}=    Get From Dictionary    ${jsondata}    gir
    Should Be True    ${matched}    No bandwidth profile found for id: ${bw_profile_id}
    [Return]    ${cir}    ${cbs}    ${pir}    ${pbs}    ${gir}


Get Upstream and Downstream Bandwidth Profile Name
    [Arguments]    ${programmed_sub}
    [Documentation]    Retrieves the upstream and downstream bandwidth profile name
    ...    from the programmed subscriber
    ${length}=    Get Length    ${programmed_sub}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${programmed_sub}    ${INDEX}
        ${tagInfo_id}=    Get From Dictionary    ${value}    tagInfo
        Log    ${tagInfo_id}
        ${us_bw_profile}=    Get From Dictionary    ${tagInfo_id}    upstreamBandwidthProfile
        Log    ${us_bw_profile}
        ${ds_bw_profile}=    Get From Dictionary    ${tagInfo_id}    downstreamBandwidthProfile
        Log    ${ds_bw_profile}
    END
    [Return]    ${us_bw_profile}    ${ds_bw_profile}

Verify Subscriber Access Flows Added Count DT
    [Arguments]    ${ip}    ${port}    ${olt_of_id}    ${expected_flows}
    [Documentation]    Matches for total number of subscriber access flows added for all onus
    ${resp}=    Get Request    VGC   flows/${olt_of_id}
    ${jsondata}=    To Json    ${resp.content}
    ${access_flows_added_count}=      Get Length      ${jsondata['flows']}
    Should Be Equal As Integers    ${access_flows_added_count}    ${expected_flows}

Get Meter Param In Details
    [Arguments]    ${meter_json}    ${length}
    [Documentation]    Retrieves the meter rate state burst-size
    ${metername}=    Get From Dictionary    ${meter_json}    meters
    Log    ${metername}
    ${value}=    Get From List    ${metername}  0
    ${bands_info}=    Get From Dictionary    ${value}    bands
    Log    ${bands_info}
    FOR    ${INDEX}    IN RANGE    0    ${length}
         ${value}=    Get From List    ${bands_info}    ${INDEX}
         ${burst_size}=    Get From Dictionary    ${value}    burstSize
         ${rate}=        Get From Dictionary    ${value}    rate
    END
    [Return]    ${rate}    ${burst_size}

Delete Subscribers And BW Profile In VGC
    [Documentation]    Delete Subscribers and bw profile  In VGC
    Create VGC Session
    ${resp}=    Get Request    VGC    programmed-subscribers
    Log     ${resp}
    ${jsondata}=    To Json   ${resp.content}
    ${length}=    Get Length    ${jsondata['subscribers']}
    @{serial_numbers}=    Create List
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['subscribers']}    ${INDEX}
        ${taginfo}=    Get From Dictionary    ${value}    tagInfo
        ${service_id}=    Get From Dictionary    ${taginfo}    serviceName
        ${upstream_bw_id}=    Get From Dictionary    ${taginfo}    upstreamBandwidthProfile
        ${downstream_bw_id}=    Get From Dictionary   ${taginfo}    downstreamBandwidthProfile
        Delete Request    VGC    subscribers/${service_id}
        Delete Request    VGC    profiles/${upstream_bw_id}
        Delete Request    VGC    profiles/${downstream_bw_id}
    END

Deactivate Subscribers In VGC
    [Documentation]    Deactivate Subscribers In VGC
    Create VGC Session
    ${resp}=    Get Request    VGC    devices/ports
    Log     ${resp}
    ${jsondata}=    To Json   ${resp.content}
    ${length}=    Get Length    ${jsondata['ports']}
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['ports']}    ${INDEX}
        ${annotations}=    Get From Dictionary    ${value}    annotations
        ${portname}=    Get From Dictionary    ${annotations}    portName
        Delete Request    VGC    services/${portname}
    END

Verify Device Flows Removed
    [Arguments]    ${ip}    ${port}    ${olt_of_id}
    [Documentation]    Verifies all flows are removed from the device
    ${resp}=    Get Request    VGC   flows/${olt_of_id}
    ${jsondata}=    To Json    ${resp.content}
    ${flow_count}=      Get Length      ${jsondata['flows']}
    Should Be Equal As Integers    ${flow_count}    0     Flows not removed

Device Is Available In VGC
    [Arguments]      ${olt_of_id}    ${available}=true
    [Documentation]    Validates the device exists and it has the expected availability in VGC
    ${resp}=    Get Request    VGC    devices
    ${jsondata}=    To Json   ${resp.content}
    Should Not Be Empty    ${jsondata['devices']}
    ${length}=    Get Length    ${jsondata['devices']}
    ${matched}=    Set Variable    False
    FOR    ${INDEX}    IN RANGE    0    ${length}
        ${value}=    Get From List    ${jsondata['devices']}    ${INDEX}
        ${of_id}=    Get From Dictionary    ${value}    id
        ${availability}=    Get From Dictionary    ${value}    available
        Log    ${olt_of_id}
        Log    ${of_id}
        ${matched}=    Set Variable If    '${of_id}' == '${olt_of_id}' and '${available}' == '${availability}'    True    False
        Exit For Loop If    ${matched}
    END
    Should Be True    ${matched}    No match for '${olt_of_id}' found
    Should Be Equal    ${available}    ${availability}

