--- /dev/null
+*** Settings ***
+Documentation Test suite to validate multiple vpnservice functionality in an openstack integrated environment.
+... The assumption of this suite is that the environment is already configured with the proper
+... integration bridges and vxlan tunnels.
+Suite Setup Start Suite
+Suite Teardown OpenStackOperations.OpenStack Suite Teardown
+Test Setup SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
+Test Teardown OpenStackOperations.Get Test Teardown Debugs
+Library OperatingSystem
+Library RequestsLibrary
+Resource ../../../libraries/BgpOperations.robot
+Resource ../../../libraries/DevstackUtils.robot
+Resource ../../../libraries/OpenStackOperations.robot
+Resource ../../../libraries/OVSDB.robot
+Resource ../../../libraries/SetupUtils.robot
+Resource ../../../libraries/Tcpdump.robot
+Resource ../../../libraries/Utils.robot
+Resource ../../../libraries/VpnOperations.robot
+Resource ../../../variables/Variables.robot
+Resource ../../../variables/netvirt/Variables.robot
+
+*** Variables ***
+${NUM_OF_PORTS_PER_HOST} 3
+${NUM_OF_VMS_PER_HOST} 3
+${NUM_OF_L3VPN} 3
+${AS_ID} 100
+${DCGW_SYSTEM_IP} ${TOOLS_SYSTEM_1_IP}
+${BGP_CONFIG_SERVER_CMD} bgp-connect -h ${ODL_SYSTEM_IP} -p 7644 add
+${NET} mvpn_net_new
+${ROUTER} mvpn_router
+${LOOPBACK_IP} 5.5.5.2/32
+${CREATE_RT} ["2200:2","2300:2","2400:2"]
+${RT_LIST_1} ["2200:2","2300:2"]
+${RT_LIST_2} ["2200:2","2400:2"]
+@{SECURITY_GROUP} mvpn_sg mvpn_custom_sg
+@{REQ_PREFIXLENGTHS} 40.1.0.0/28 41.1.0.0/16
+@{REQ_SUBNETS_PREFIX} mvpn_subnet10 mvpn_subnet11
+@{NETWORKS} mvpn_net_1 mvpn_net_2 mvpn_net_3
+@{SUBNETS} mvpn_sub_1 mvpn_sub_2 mvpn_sub_3
+@{SUBNET_CIDRS} 11.1.1.0/24 22.1.1.0/24 33.1.1.0/24
+@{PORTS_HOST1} mvpn_net_1_port_1 mvpn_net_2_port_1 mvpn_net_3_port_1 mvpn_net_1_port1_csg mvpn_net_2_port1_csg
+@{PORTS_HOST2} mvpn_net_1_port_2 mvpn_net_2_port_2 mvpn_net_3_port_2 mvpn_net_2_port2_csg
+@{VMS_HOST1} mvpn_net_1_vm_1 mvpn_net_2_vm_1 mvpn_net_3_vm_1 mvpn_net_1_vm1_csg mvpn_net_2_vm1_csg
+@{VMS_HOST2} mvpn_net_1_vm_2 mvpn_net_2_vm_2 mvpn_net_3_vm_2 mvpn_net_2_vm2_csg
+@{NET_1_VMS} mvpn_net_1_vm_1 mvpn_net_1_vm_2 mvpn_net_1_vm1_csg
+@{NET_2_VMS} mvpn_net_2_vm_1 mvpn_net_2_vm_2 mvpn_net_2_vm1_csg mvpn_net_2_vm2_csg
+@{NET_3_VMS} mvpn_net_3_vm_1 mvpn_net_3_vm_2
+@{VPN_INSTANCE_IDS} 4ae8cd92-48ca-49b5-94e1-b2921a261441 4ae8cd92-48ca-49b5-94e1-b2921a261442 4ae8cd92-48ca-49b5-94e1-b2921a261443
+@{VPN_NAMES} mvpn_1 mvpn_2 mvpn_3
+@{RDS} ["2200:2"] ["2300:2"] ["2400:2"]
+@{DCGW_RD} 2200:2 2300:2 2400:2
+@{LOOPBACK_IPS} 5.5.5.2 2.2.2.2 3.3.3.3
+@{LOOPBACK_NAMES} int1 int2 int3
+
+*** Test Cases ***
+Check Datapath Traffic Across Networks With L3VPN
+ [Documentation] Datapath Test Across the networks with VPN.
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 20 @{NET_1_VM_IPS}[1]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 20 @{NET_2_VM_IPS}[1]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 20 @{NET_2_VM_IPS}[0]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[2] ping -c 20 @{NET_2_VM_IPS}[2]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[2] ping -c 20 @{NET_2_VM_IPS}[3]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+
+Verify Route Update In Bgp For Routes With Default Route And Various Prefix Lengths
+ [Documentation] Create network with different prefix lengths and check the route update in bgp.
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${SUBNET_CIDRS}
+ OpenStackOperations.Create Network ${NET}
+ ${length} = BuiltIn.Get Length ${REQ_SUBNETS_PREFIX}
+ : FOR ${idx} IN RANGE ${length}
+ \ OpenStackOperations.Create SubNet ${NET} @{REQ_SUBNETS_PREFIX}[${idx}] @{REQ_PREFIXLENGTHS}[${idx}]
+ BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${SUBNETWORK_URL} ${REQ_SUBNETS_PREFIX}
+ ${net_id} = OpenStackOperations.Get Net Id ${NET}
+ VpnOperations.Associate L3VPN To Network networkid=${net_id} vpnid=@{VPN_INSTANCE_IDS}[0]
+ VpnOperations.Verify L3VPN On ODL @{VPN_INSTANCE_IDS}[0]
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${REQ_PREFIXLENGTHS}
+ [Teardown] BuiltIn.Run Keywords VpnOperations.Dissociate L3VPN From Networks networkid=${net_id} vpnid=@{VPN_INSTANCE_IDS}[0]
+ ... AND OpenStackOperations.Delete Network ${NET}
+ ... AND Post Test Cleanup @{VPN_INSTANCE_IDS}[0]
+
+Verification Of Route Download With Three Vpns In SE And Qbgp With One-One Export Import Route Target
+ [Documentation] Check the datapath traffic with one-one export import route target with three vpns.
+ Create Multiple L3VPN @{NETWORKS}[0] ${3}
+ : FOR ${index} IN RANGE 0 ${NUM_OF_L3VPN}
+ \ BgpOperations.Configure BGP And Add Neighbor On DCGW ${DCGW_SYSTEM_IP} ${AS_ID} ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP} @{VPN_NAMES}[${index}]
+ \ ... @{DCGW_RD}[${index}] @{LOOPBACK_IPS}[${index}]
+ VpnOperations.Associate L3VPNs To Networks ${VPN_INSTANCE_IDS} ${NETWORKS}
+ ${fib_values} = BuiltIn.Create List @{NET_1_VM_IPS} @{NET_2_VM_IPS} @{NET_3_VM_IPS} @{SUBNET_CIDRS} @{LOOPBACK_IPS}
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${fib_values}
+ ${fib1_values} = BuiltIn.Create List @{NET_1_VM_IPS} @{SUBNET_CIDRS}[0] @{LOOPBACK_IPS}[0]
+ BuiltIn.Wait Until Keyword Succeeds 60s 15s BgpOperations.Verify Routes On Quagga ${DCGW_SYSTEM_IP} @{DCGW_RD}[0] ${fib1_values}
+ ${fib2_values} = BuiltIn.Create List @{NET_2_VM_IPS} @{SUBNET_CIDRS}[1] @{LOOPBACK_IPS}[1]
+ BuiltIn.Wait Until Keyword Succeeds 60s 15s BgpOperations.Verify Routes On Quagga ${DCGW_SYSTEM_IP} @{DCGW_RD}[1] ${fib2_values}
+ ${fib3_values} = BuiltIn.Create List @{NET_3_VM_IPS} @{SUBNET_CIDRS}[2] @{LOOPBACK_IPS}[2]
+ BuiltIn.Wait Until Keyword Succeeds 60s 15s BgpOperations.Verify Routes On Quagga ${DCGW_SYSTEM_IP} @{DCGW_RD}[2] ${fib3_values}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_1_VM_IPS}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_2_VM_IPS}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 3 @{NET_1_VM_IPS}[1]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] @{NET_2_VM_IPS}[0] ping -c 3 @{NET_2_VM_IPS}[1]
+ BuiltIn.Should Contain ${output} ${PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 3 @{NET_2_VM_IPS}[0]
+ BuiltIn.Should Contain ${output} ${NO_PING_REGEXP}
+ ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPS}[0] ping -c 3 @{NET_2_VM_IPS}[1]
+ BuiltIn.Should Contain ${output} ${NO_PING_REGEXP}
+ [Teardown] Post Test Cleanup @{VPN_INSTANCE_IDS}
+
+Verification Of Route Download With Three Vpns In SE And Qbgp With One-Many Export Import Route Target
+ [Documentation] Check the datapath traffic with one-many export import route target with three vpns.
+ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[0] name=@{VPN_NAMES}[0] rd=@{RDS}[0] exportrt=${CREATE_RT} importrt=@{RDS}[0]
+ : FOR ${index} IN RANGE 1 ${NUM_OF_L3VPN}
+ \ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[${index}] name=@{VPN_NAMES}[${index}] rd=@{RDS}[${index}] exportrt=@{RDS}[${index}] importrt=${RT_LIST_${index}}
+ : FOR ${index} IN RANGE 0 ${NUM_OF_L3VPN}
+ \ BgpOperations.Configure BGP And Add Neighbor On DCGW ${DCGW_SYSTEM_IP} ${AS_ID} ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP} @{VPN_NAMES}[${index}]
+ \ ... @{DCGW_RD}[${index}] @{LOOPBACK_IPS}[${index}]
+ ${networks} = BuiltIn.Create List @{NETWORKS}[0] @{NETWORKS}[1]
+ VpnOperations.Associate L3VPNs To Networks ${VPN_INSTANCE_IDS} ${networks}
+ ${fib_values} = BuiltIn.Create List @{NET_1_VM_IPS} @{NET_2_VM_IPS} @{SUBNET_CIDRS}[0] @{SUBNET_CIDRS}[1]
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${fib_values}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_1_VM_IPS}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_2_VM_IPS}
+ [Teardown] Post Test Cleanup @{VPN_INSTANCE_IDS}
+
+Verification Of Route Download With Three Vpns In SE And Qbgp With Many-One Export Import Route Target
+ [Documentation] Check the datapath traffic with many-one export import route target with three vpns.
+ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[0] name=@{VPN_NAMES}[0] rd=@{RDS}[0] exportrt=@{RDS}[0] importrt=${CREATE_RT}
+ : FOR ${index} IN RANGE 1 ${NUM_OF_L3VPN}
+ \ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[${index}] name=@{VPN_NAMES}[${index}] rd=@{RDS}[${index}] exportrt=${RT_LIST_${index}} importrt=@{RDS}[${index}]
+ : FOR ${index} IN RANGE 0 ${NUM_OF_L3VPN}
+ \ BgpOperations.Configure BGP And Add Neighbor On DCGW ${DCGW_SYSTEM_IP} ${AS_ID} ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP} @{VPN_NAMES}[${index}]
+ \ ... @{DCGW_RD}[${index}] @{LOOPBACK_IPS}[${index}]
+ ${networks} = BuiltIn.Create List @{NETWORKS}[0] @{NETWORKS}[1]
+ VpnOperations.Associate L3VPNs To Networks ${VPN_INSTANCE_IDS} ${networks}
+ ${fib_values} = BuiltIn.Create List @{NET_1_VM_IPS} @{NET_2_VM_IPS} @{SUBNET_CIDRS}[0] @{SUBNET_CIDRS}[1]
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${fib_values}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_1_VM_IPS}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_2_VM_IPS}
+ [Teardown] Post Test Cleanup @{VPN_INSTANCE_IDS}
+
+Verification Of Route Download With Three Vpns In SE And Qbgp With Many-Many Export Import Route Target
+ [Documentation] Check the datapath traffic with many-many export import route target with three vpns.
+ : FOR ${index} IN RANGE 0 ${NUM_OF_L3VPN}
+ \ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[${index}] name=@{VPN_NAMES}[${index}] rd=@{RDS}[${index}] exportrt=${CREATE_RT} importrt=${CREATE_RT}
+ : FOR ${index} IN RANGE 0 ${NUM_OF_L3VPN}
+ \ BgpOperations.Configure BGP And Add Neighbor On DCGW ${DCGW_SYSTEM_IP} ${AS_ID} ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP} @{VPN_NAMES}[${index}]
+ \ ... @{DCGW_RD}[${index}] @{LOOPBACK_IPS}[${index}]
+ ${networks} = BuiltIn.Create List @{NETWORKS}[0] @{NETWORKS}[1]
+ VpnOperations.Associate L3VPNs To Networks ${VPN_INSTANCE_IDS} ${networks}
+ ${fib_values} = BuiltIn.Create List @{NET_1_VM_IPS} @{NET_2_VM_IPS} @{SUBNET_CIDRS}[0] @{SUBNET_CIDRS}[1]
+ BuiltIn.Wait Until Keyword Succeeds 30s 10s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${fib_values}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_1_VM_IPS}
+ VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${NET_2_VM_IPS}
+
+*** Keywords ***
+Start Suite
+ [Documentation] Basic setup.
+ VpnOperations.Basic Suite Setup
+ BgpOperations.Start Quagga Processes On ODL ${ODL_SYSTEM_IP}
+ BgpOperations.Start Quagga Processes On DCGW ${DCGW_SYSTEM_IP}
+ Create Setup
+ OpenStackOperations.Show Debugs @{NET_1_VMS} @{NET_2_VMS} @{NET_3_VMS}
+ OpenStackOperations.Get Suite Debugs
+
+Create Setup
+ [Documentation] Create basic topology
+ Create Neutron Networks
+ Create Neutron Subnets
+ OpenStackOperations.Create Allow All SecurityGroup ${SECURITY_GROUP[0]}
+ Security Group Rule with Remote SG ${SECURITY_GROUP[1]}
+ Create Neutron Ports
+ Create Nova VMs
+ VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[0] name=@{VPN_NAMES}[0] rd=@{RDS}[0] exportrt=@{RDS}[0] importrt=@{RDS}[0]
+ VpnOperations.Verify L3VPN On ODL @{VPN_INSTANCE_IDS}[0]
+ : FOR ${network} IN @{NETWORKS}
+ \ ${network_id} = OpenStackOperations.Get Net Id ${network}
+ \ VpnOperations.Associate L3VPN To Network networkid=${network_id} vpnid=@{VPN_INSTANCE_IDS}[0]
+ Create BGP Config On ODL
+ Create BGP Config On DCGW
+ Create External Tunnel Endpoint
+
+Create Neutron Networks
+ [Documentation] Create required number of networks
+ : FOR ${NET} IN @{NETWORKS}
+ \ OpenStackOperations.Create Network ${NET}
+ BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${NETWORK_URL} ${NETWORKS}
+
+Create Neutron Subnets
+ [Documentation] Create required number of subnets for previously created networks
+ ${num_of_networks} = BuiltIn.Get Length ${NETWORKS}
+ : FOR ${index} IN RANGE 0 ${num_of_networks}
+ \ OpenStackOperations.Create SubNet @{NETWORKS}[${index}] @{SUBNETS}[${index}] @{SUBNET_CIDRS}[${index}]
+ BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${SUBNETWORK_URL} ${SUBNETS}
+
+Create Neutron Ports
+ [Documentation] Create required number of ports under previously created subnets
+ : FOR ${index} IN RANGE 0 ${NUM_OF_PORTS_PER_HOST}
+ \ OpenStackOperations.Create Port @{NETWORKS}[${index}] @{PORTS_HOST1}[${index}] sg=@{SECURITY_GROUP}[0]
+ : FOR ${index} IN RANGE 0 ${NUM_OF_PORTS_PER_HOST}
+ \ OpenStackOperations.Create Port @{NETWORKS}[${index}] @{PORTS_HOST2}[${index}] sg=@{SECURITY_GROUP}[0]
+ OpenStackOperations.Create Port @{NETWORKS}[0] @{PORTS_HOST1}[3] @{SECURITY_GROUP}[1]
+ OpenStackOperations.Create Port @{NETWORKS}[1] @{PORTS_HOST1}[4] @{SECURITY_GROUP}[1]
+ OpenStackOperations.Create Port @{NETWORKS}[1] @{PORTS_HOST2}[3] @{SECURITY_GROUP}[1]
+ ${PORTS} = BuiltIn.Create List @{PORTS_HOST1} @{PORTS_HOST2}
+ BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${CONFIG_API}/neutron:neutron/ports/ ${PORTS}
+
+Create Nova VMs
+ [Documentation] Create Vm instances on compute nodes
+ : FOR ${index} IN RANGE 0 ${NUM_OF_VMS_PER_HOST}
+ \ OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS_HOST1}[${index}] @{VMS_HOST1}[${index}] ${OS_CMP1_HOSTNAME} sg=@{SECURITY_GROUP}[0]
+ : FOR ${index} IN RANGE 0 ${NUM_OF_VMS_PER_HOST}
+ \ OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS_HOST2}[${index}] @{VMS_HOST2}[${index}] ${OS_CMP2_HOSTNAME} sg=@{SECURITY_GROUP}[0]
+ OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS_HOST1}[3] @{VMS_HOST1}[3] ${OS_CMP1_HOSTNAME} sg=@{SECURITY_GROUP}[1]
+ OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS_HOST1}[4] @{VMS_HOST1}[4] ${OS_CMP1_HOSTNAME} sg=@{SECURITY_GROUP}[1]
+ OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS_HOST2}[3] @{VMS_HOST2}[3] ${OS_CMP2_HOSTNAME} sg=@{SECURITY_GROUP}[1]
+ @{NET_1_VM_IPS} ${NET_1_DHCP_IP} = OpenStackOperations.Get VM IPs @{NET_1_VMS}
+ @{NET_2_VM_IPS} ${NET_2_DHCP_IP} = OpenStackOperations.Get VM IPs @{NET_2_VMS}
+ @{NET_3_VM_IPS} ${NET_3_DHCP_IP} = OpenStackOperations.Get VM IPs @{NET_3_VMS}
+ BuiltIn.Set Suite Variable @{NET_1_VM_IPS}
+ BuiltIn.Set Suite Variable @{NET_2_VM_IPS}
+ BuiltIn.Set Suite Variable @{NET_3_VM_IPS}
+ BuiltIn.Should Not Contain @{NET_1_VM_IPS} None
+ BuiltIn.Should Not Contain @{NET_2_VM_IPS} None
+ BuiltIn.Should Not Contain @{NET_3_VM_IPS} None
+ BuiltIn.Should Not Contain ${NET_1_DHCP_IP} None
+ BuiltIn.Should Not Contain ${NET_2_DHCP_IP} None
+ BuiltIn.Should Not Contain ${NET_3_DHCP_IP} None
+
+Create External Tunnel Endpoint
+ [Documentation] Create and verify external tunnel endpoint between ODL and GWIP
+ BgpOperations.Create External Tunnel Endpoint Configuration destIp=${DCGW_SYSTEM_IP}
+ ${output} = BgpOperations.Get External Tunnel Endpoint Configuration ${DCGW_SYSTEM_IP}
+ BuiltIn.Should Contain ${output} ${DCGW_SYSTEM_IP}
+
+Create BGP Config On ODL
+ [Documentation] Configure BGP Config on ODL
+ KarafKeywords.Issue Command On Karaf Console ${BGP_CONFIG_SERVER_CMD}
+ BgpOperations.Create BGP Configuration On ODL localas=${AS_ID} routerid=${ODL_SYSTEM_IP}
+ BgpOperations.AddNeighbor To BGP Configuration On ODL remoteas=${AS_ID} neighborAddr=${DCGW_SYSTEM_IP}
+ ${output} = BgpOperations.Get BGP Configuration On ODL session
+ BuiltIn.Should Contain ${output} ${DCGW_SYSTEM_IP}
+
+Create BGP Config On DCGW
+ [Documentation] Configure BGP on DCGW
+ BgpOperations.Configure BGP And Add Neighbor On DCGW ${DCGW_SYSTEM_IP} ${AS_ID} ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP} @{VPN_NAMES}[0] @{DCGW_RD}[0]
+ ... @{LOOPBACK_IPS}[0]
+ ${output} = BgpOperations.Execute Show Command On Quagga ${DCGW_SYSTEM_IP} ${RUN_CONFIG}
+ BuiltIn.Should Contain ${output} ${ODL_SYSTEM_IP}
+ ${output} = BuiltIn.Wait Until Keyword Succeeds 180s 10s BgpOperations.Verify BGP Neighbor Status On Quagga ${DCGW_SYSTEM_IP} ${ODL_SYSTEM_IP}
+
+Create Multiple L3VPN
+ [Arguments] ${network} ${num_of_l3vpns}
+ [Documentation] Creates multiple L3VPNs and then verify the same
+ : FOR ${index} IN RANGE 0 ${num_of_l3vpns}
+ \ BuiltIn.Wait Until Keyword Succeeds 40s 10s VpnOperations.VPN Create L3VPN vpnid=@{VPN_INSTANCE_IDS}[${index}] name=@{VPN_NAMES}[${index}]
+ \ ... rd=@{RDS}[${index}] exportrt=@{RDS}[${index}] importrt=@{RDS}[${index}]
+ \ VpnOperations.Verify L3VPN On ODL @{VPN_INSTANCE_IDS}[${index}]
+
+Security Group Rule with Remote SG
+ [Arguments] ${sec_grp}
+ [Documentation] Allow all TCP/UDP/ICMP packets for this suite
+ OpenStackOperations.Neutron Security Group Create ${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=ingress port_range_max=65535 port_range_min=1 protocol=tcp remote-group-id=${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=egress port_range_max=65535 port_range_min=1 protocol=tcp remote-group-id=${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=ingress protocol=icmp remote-group-id=${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=egress protocol=icmp remote-group-id=${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=ingress port_range_max=65535 port_range_min=1 protocol=udp remote_group_id=${sec_grp}
+ OpenStackOperations.Neutron Security Group Rule Create ${sec_grp} direction=egress port_range_max=65535 port_range_min=1 protocol=udp remote-group-id=${sec_grp}
+
+Post Test Cleanup
+ [Arguments] @{vpn_ids}
+ [Documentation] Test Case Cleanup.
+ VpnOperations.Delete Multiple L3VPNs @{vpn_ids}
+ BgpOperations.Delete BGP Config On Quagga ${DCGW_SYSTEM_IP} ${AS_ID}