blob: fa98b93e2dc5ddb0a518b10a11a8974a49ced098 [file] [log] [blame]
# 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']} No devices data found in VGC
${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']} No ports data found for OLT ${olt_of_id} in VGC
${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']} No ports data found for OLT ${olt_of_id} in VGC
${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']} No devices ports data in VGC
${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']} No devices ports data in VGC
${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']} No flows data found for OLT ${olt_of_id} in VGC
# 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']} No ports data found for OLT ${olt_of_id} in VGC
# 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']} No ports data found for OLT ${olt_of_id} in VGC
# 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} No programmed subscribers found for ${service_name}
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} Could not find data for bandwidth profile ${bw_profile_id} in VGC
${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']} No devices data found in VGC
${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}