Add suite setups for remaining modules
[integration/test.git] / csit / suites / netvirt / vpnservice / vpn_basic_dualstack_one_router.robot
1 *** Settings ***
2 Documentation     Test suite to validate dualstack (IPv4 + IPv6) vpnservice functionality in an Openstack
3 ...               integrated environment.
4 ...               The assumption of this suite is that the environment is already configured with the proper
5 ...               integration bridges and vxlan tunnels.
6 Suite Setup       Suite Setup
7 Suite Teardown    Suite Teardown
8 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
9 Test Teardown     OpenStackOperations.Get Test Teardown Debugs
10 Library           Collections
11 Library           OperatingSystem
12 Library           RequestsLibrary
13 Resource          ../../../libraries/Utils.robot
14 Resource          ../../../libraries/OpenStackOperations.robot
15 Resource          ../../../libraries/DevstackUtils.robot
16 Resource          ../../../libraries/VpnOperations.robot
17 Resource          ../../../libraries/OVSDB.robot
18 Resource          ../../../libraries/SetupUtils.robot
19 Resource          ../../../libraries/Tcpdump.robot
20 Resource          ../../../variables/Variables.robot
21 Resource          ../../../variables/netvirt/Variables.robot
22
23 *** Variables ***
24 ${SECURITY_GROUP}    vpn_sg_dualstack
25 @{NETWORKS}       vpn_net_1_dualstack    vpn_net_2_dualstack
26 @{SUBNETS4}       vpn_net_ipv4_1_dualstack    vpn_net_ipv4_2_dualstack
27 @{SUBNETS6}       vpn_net_ipv6_1_dualstack    vpn_net_ipv6_2_dualstack
28 @{SUBNETS4_CIDR}    30.1.1.0/24    40.1.1.0/24
29 @{SUBNETS6_CIDR}    2001:db5:0:2::/64    2001:db5:0:3::/64
30 ${SUBNET_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac
31 @{PORTS}          vpn_port_1_dualstack    vpn_port_2_dualstack    vpn_port_3_dualstack    vpn_port_4_dualstack
32 @{NET_1_VM_INSTANCES}    vpn_net_1_vm_1_dualstack    vpn_net_1_vm_2_dualstack
33 @{NET_2_VM_INSTANCES}    vpn_net_2_vm_1_dualstack    vpn_net_2_vm_2_dualstack
34 @{EXTRA_NW_IPV4}    76.1.1.2    77.1.1.2
35 @{EXTRA_NW_IPV6}    3001:db9:cafe:d::10    3001:db9:abcd:d::20
36 @{EXTRA_NW_SUBNET_IPv4}    76.1.1.0/24    77.1.1.0/24
37 @{EXTRA_NW_SUBNET_IPv6}    3001:db9:cafe:d::/64    3001:db9:abcd:d::/64
38 ${ROUTER}         vpn_router_dualstack
39 ${UPDATE_NETWORK}    UpdateNetwork_dualstack
40 ${UPDATE_SUBNET}    UpdateSubnet_dualstack
41 ${UPDATE_PORT}    UpdatePort_dualstack
42 @{VPN_INSTANCE_ID}    1bc8cd92-48ca-49b5-94e1-b2921a261661    1bc8cd92-48ca-49b5-94e1-b2921a261662    1bc8cd92-48ca-49b5-94e1-b2921a261663
43 @{VPN_NAME}       vpn1_dualstack    vpn2_dualstack    vpn3_dualstack
44 @{RDS}            ["2506:2"]    ["2606:2"]    ["2706:2"]
45
46 *** Test Cases ***
47 Check ELAN Datapath Traffic Within The Networks
48     [Documentation]    Checks datapath within the same network with different vlans.
49     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ping -I ${NET_1_VM_IPV4[0]} -c 3 ${NET_1_VM_IPV4[1]}
50     BuiltIn.Should Contain    ${output}    64 bytes
51     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV6[0]}    ping6 -I ${NET_1_VM_IPV6[0]} -c 3 ${NET_1_VM_IPV6[1]}
52     BuiltIn.Should Contain    ${output}    64 bytes
53     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ping -I ${NET_2_VM_IPV4[0]} -c 3 ${NET_2_VM_IPV4[1]}
54     BuiltIn.Should Contain    ${output}    64 bytes
55     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[0]}    ping6 -I ${NET_2_VM_IPV6[0]} -c 3 ${NET_2_VM_IPV6[1]}
56     BuiltIn.Should Contain    ${output}    64 bytes
57
58 Create Router
59     [Documentation]    Create Router.
60     OpenStackOperations.Create Router    ${ROUTER}
61     @{ROUTER_LIST} =    BuiltIn.Create List    ${ROUTER}
62     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${ROUTER_URL}    ${ROUTER_LIST}
63
64 Add Router Ports
65     [Documentation]    Add created subnets to router.
66     : FOR    ${PORT}    IN    @{SUBNETS4}
67     \    OpenStackOperations.Add Router Interface    ${ROUTER}    ${PORT}
68     ${interface_output} =    OpenStackOperations.Show Router Interface    ${ROUTER}
69     ${GW1_MAC_ADDRS}    ${GW_IPV4_ADDRS} =    VpnOperations.Get Gateway MAC And IP Address    ${ROUTER}
70     : FOR    ${PORT}    IN    @{SUBNETS6}
71     \    OpenStackOperations.Add Router Interface    ${ROUTER}    ${PORT}
72     ${interface_output} =    OpenStackOperations.Show Router Interface    ${ROUTER}
73     ${GW2_MAC_ADDRS}    ${GW_IPV6_ADDRS} =    VpnOperations.Get Gateway MAC And IP Address    ${ROUTER}    ${IP6_REGEX}
74     ${GW_MAC_ADDRS} =    BuiltIn.Create List    @{GW1_MAC_ADDRS}    @{GW2_MAC_ADDRS}
75     BuiltIn.Set Suite Variable    ${GW1_MAC_ADDRS}
76     BuiltIn.Set Suite Variable    ${GW2_MAC_ADDRS}
77     BuiltIn.Set Suite Variable    ${GW_MAC_ADDRS}
78     BuiltIn.Set Suite Variable    ${GW_IPV4_ADDRS}
79     BuiltIn.Set Suite Variable    ${GW_IPV6_ADDRS}
80
81 Check L3_Datapath Traffic Across Networks With Router
82     [Documentation]    L3 Datapath test across networks using previously created router.
83     BuiltIn.Log    Verification of FIB Entries and Flow
84     @{tcpdump_conn_ids} =    OpenStackOperations.Start Packet Capture On Nodes    tcpdump_vpn_ds    ${EMPTY}    @{OS_ALL_IPS}
85     ${vm_instances} =    BuiltIn.Create List    @{NET_1_VM_IPV4}    @{NET_2_VM_IPV4}    @{NET_1_VM_IPV6}    @{NET_2_VM_IPV6}
86     BuiltIn.Wait Until Keyword Succeeds    30s    5s    Utils.Check For Elements At URI    ${FIB_ENTRY_URL}    ${vm_instances}
87     : FOR    ${VM}    IN    ${vm_instances}
88     \    BuiltIn.Wait Until Keyword Succeeds    30s    5s    VpnOperations.Verify Flows Are Present For L3VPN    ${OS_CMP1_IP}    ${VM}
89     BuiltIn.Wait Until Keyword Succeeds    30s    5s    VpnOperations.Verify GWMAC Entry On ODL    ${GW_MAC_ADDRS}
90     Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
91     BuiltIn.Log    L3 Datapath test across the networks using router
92     ${dst_ipv4_list1} =    BuiltIn.Create List    ${NET_1_VM_IPV4[1]}    @{NET_2_VM_IPV4}
93     Test Operations From Vm Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ${dst_ipv4_list1}
94     ${dst_ipv4_list2} =    BuiltIn.Create List    ${NET_2_VM_IPV4[1]}    @{NET_1_VM_IPV4}
95     Test Operations From Vm Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ${dst_ipv4_list2}
96     ${dst_ipv6_list1} =    BuiltIn.Create List    ${NET_1_VM_IPV6[1]}    @{NET_2_VM_IPV6}
97     Test Operations From Vm Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV6[0]}    ${dst_ipv6_list1}
98     ${dst_ipv6_list2} =    BuiltIn.Create List    ${NET_2_VM_IPV6[1]}    @{NET_1_VM_IPV6}
99     Test Operations From Vm Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[0]}    ${dst_ipv6_list2}
100     [Teardown]    VpnOperations.Test Teardown With Tcpdump Stop    ${tcpdump_conn_ids}
101
102 Add Multiple Extra Routes And Check Datapath Before L3VPN Creation
103     [Documentation]    Add multiple extra routes and check data path before L3VPN creation.
104     BuiltIn.Log    Add extraroutes to VM
105     : FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV4}
106     \    ${cmd} =    BuiltIn.Catenate    sudo ip addr add ${extra_ip}/24 dev eth0
107     \    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV4}[0]    ${cmd}
108     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV4}[0]    ip a
109     \    BuiltIn.Should Contain    ${output}    ${extra_ip}/24
110     ${ext_rt1} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV4}[0],gateway=@{NET_1_VM_IPV4}[0]
111     ${ext_rt2} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV4}[1],gateway=@{NET_1_VM_IPV4}[0]
112     ${cmd} =    BuiltIn.Catenate    ${RT_OPTIONS}    ${ext_rt1}    ${RT_OPTIONS}    ${ext_rt2}
113     OpenStackOperations.Update Router    ${ROUTER}    ${cmd}
114     OpenStackOperations.Show Router    ${ROUTER}    -D
115     : FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV6}
116     \    ${cmd} =    BuiltIn.Catenate    sudo ip -6 addr add ${extra_ip}/64 dev eth0
117     \    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV6}[0]    ${cmd}
118     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV6}[0]    ip -6 a
119     \    BuiltIn.Should Contain    ${output}    ${extra_ip}/64
120     ${ext_rt3} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV6}[0],gateway=@{NET_1_VM_IPV6}[0]
121     ${ext_rt4} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV6}[1],gateway=@{NET_1_VM_IPV6}[0]
122     ${cmd} =    BuiltIn.Catenate    ${RT_OPTIONS}    ${ext_rt3}    ${RT_OPTIONS}    ${ext_rt4}
123     OpenStackOperations.Update Router    ${ROUTER}    ${cmd}
124     OpenStackOperations.Show Router    ${ROUTER}    -D
125     BuiltIn.Log    Verify FIB table
126     ${vm_ips} =    BuiltIn.Create List    @{EXTRA_NW_SUBNET_IPV4}    @{EXTRA_NW_SUBNET_IPV6}
127     BuiltIn.Wait Until Keyword Succeeds    30s    5s    Utils.Check For Elements At URI    ${FIB_ENTRY_URL}    ${vm_ips}
128     : FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV4}
129     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[1]}    ping -c 3 ${extra_ip}
130     \    BuiltIn.Should Contain    ${output}    64 bytes
131     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ping -c 3 ${extra_ip}
132     \    BuiltIn.Should Contain    ${output}    64 bytes
133     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[1]}    ping -c 3 ${extra_ip}
134     \    BuiltIn.Should Contain    ${output}    64 bytes
135     : FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV6}
136     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV6[1]}    ping6 -c 3 ${extra_ip}
137     \    BuiltIn.Should Contain    ${output}    64 bytes
138     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[0]}    ping6 -c 3 ${extra_ip}
139     \    BuiltIn.Should Contain    ${output}    64 bytes
140     \    ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[1]}    ping6 -c 3 ${extra_ip}
141     \    BuiltIn.Should Contain    ${output}    64 bytes
142
143 Delete And Recreate Extra Route
144     [Documentation]    Delete IPv4 and IPv6 extra routes and recreate it.
145     ...    Then check data path before L3VPN creation.
146     BuiltIn.Log    Delete all extra routes
147     OpenStackOperations.Update Router    ${ROUTER}    ${RT_CLEAR}
148     OpenStackOperations.Show Router    ${ROUTER}    -D
149     ${cmd}=    BuiltIn.Catenate    sudo ip addr add @{EXTRA_NW_IPV4}[0]/24 dev eth0
150     OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV4}[0]    ${cmd}
151     ${ext_rt_ipv4} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV4}[0],gateway=@{NET_1_VM_IPV4}[0]
152     ${cmd} =    BuiltIn.Catenate    ${RT_OPTIONS}    ${ext_rt_ipv4}
153     OpenStackOperations.Update Router    ${ROUTER}    ${cmd}
154     OpenStackOperations.Show Router    ${ROUTER}    -D
155     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV4}[1]    ping -c 3 @{EXTRA_NW_IPV4}[0]
156     BuiltIn.Should Contain    ${output}    64 bytes
157     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPV4}[0]    ping -c 3 @{EXTRA_NW_IPV4}[0]
158     BuiltIn.Should Contain    ${output}    64 bytes
159     ${cmd} =    BuiltIn.Catenate    sudo ip -6 addr add @{EXTRA_NW_IPV6}[0]/64 dev eth0
160     OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV6}[0]    ${cmd}
161     ${ext_rt2} =    BuiltIn.Set Variable    destination=@{EXTRA_NW_SUBNET_IPV6}[0],gateway=@{NET_1_VM_IPV6}[0]
162     ${cmd} =    BuiltIn.Catenate    ${RT_OPTIONS}    ${ext_rt2}
163     OpenStackOperations.Update Router    ${ROUTER}    ${cmd}
164     OpenStackOperations.Show Router    ${ROUTER}    -D
165     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPV6}[1]    ping6 -c 3 @{EXTRA_NW_IPV6}[0]
166     BuiltIn.Should Contain    ${output}    64 bytes
167     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPV6}[0]    ping6 -c 3 @{EXTRA_NW_IPV6}[0]
168     BuiltIn.Should Contain    ${output}    64 bytes
169     # clear off extra-routes before the next set of tests
170     OpenStackOperations.Update Router    ${ROUTER}    ${RT_CLEAR}
171     [Teardown]    BuiltIn.Run Keywords    OpenStackOperations.Update Router    ${ROUTER}    ${RT_CLEAR}
172     ...    AND    OpenStackOperations.Show Router    ${ROUTER}    -D
173     ...    AND    OpenStackOperations.Get Test Teardown Debugs
174
175 Create L3VPN
176     ${net_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
177     ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${net_id}
178     VpnOperations.VPN Create L3VPN    vpnid=${VPN_INSTANCE_ID[0]}    name=${VPN_NAME[0]}    rd=@{RDS}[0]    exportrt=@{RDS}[0]    importrt=@{RDS}[0]    tenantid=${tenant_id}
179     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
180     BuiltIn.Should Contain    ${resp}    ${VPN_INSTANCE_ID[0]}
181
182 Associate L3VPN To Routers
183     [Documentation]    Associating router to L3VPN.
184     ${router_id} =    OpenStackOperations.Get Router Id    ${ROUTER}
185     VpnOperations.Associate VPN to Router    routerid=${router_id}    vpnid=${VPN_INSTANCE_ID[0]}
186     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
187     BuiltIn.Should Contain    ${resp}    ${router_id}
188
189 Verify L3VPN Datapath With Router Association
190     [Documentation]    Datapath test across networks using L3VPN associated with router.
191     BuiltIn.Log    Verify VPN interfaces, FIB entries and Flow table
192     BuiltIn.Wait Until Keyword Succeeds    30s    5s    Utils.Check For Elements At URI    ${VPN_IFACES_URL}    ${VM_IPS}
193     ${RD} =    Strip String    ${RDS[0]}    characters="[]
194     BuiltIn.Wait Until Keyword Succeeds    60s    15s    Utils.Check For Elements At URI    ${CONFIG_API}/odl-fib:fibEntries/vrfTables/${RD}/    ${VM_IPS}
195     Verify Flows Are Present For L3VPN On All Compute Nodes    ${VM_IPS}
196     BuiltIn.Wait Until Keyword Succeeds    30s    5s    VpnOperations.Verify GWMAC Entry On ODL    ${GW_MAC_ADDRS}
197     Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
198     BuiltIn.Log    L3 Datapath test across the networks using L3VPN
199     ${dst_ipv4_list1} =    BuiltIn.Create List    ${NET_1_VM_IPV4[1]}    @{NET_2_VM_IPV4}
200     Test Operations From Vm Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ${dst_ipv4_list1}
201     ${dst_ipv4_list2} =    BuiltIn.Create List    ${NET_2_VM_IPV4[1]}    @{NET_1_VM_IPV4}
202     Test Operations From Vm Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ${dst_ipv4_list2}
203     ${dst_ipv6_list1} =    BuiltIn.Create List    ${NET_1_VM_IPV6[1]}    @{NET_2_VM_IPV6}
204     Test Operations From Vm Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV6[0]}    ${dst_ipv6_list1}
205     ${dst_ipv6_list2} =    BuiltIn.Create List    ${NET_2_VM_IPV6[1]}    @{NET_1_VM_IPV6}
206     Test Operations From Vm Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[0]}    ${dst_ipv6_list2}
207
208 Delete IPv6 Subnet And Check IPv4 datapath
209     [Documentation]    Delete IPv6 subnet from router and check IPv4 datapath before L3VPN creation.
210     ...    Then recreate IPv6 subnet.
211     BuiltIn.Log    Delete extra routes
212     OpenStackOperations.Update Router    ${ROUTER}    ${RT_CLEAR}
213     OpenStackOperations.Show Router    ${ROUTER}    -D
214     BuiltIn.Log    Delete IPv6 subnet
215     : FOR    ${PORT}    IN    @{SUBNETS6}
216     \    Remove Interface    ${ROUTER}    ${PORT}
217     BuiltIn.Log    Test L2 datapath
218     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ping -I ${NET_1_VM_IPV4[0]} -c 3 ${NET_1_VM_IPV4[1]}
219     BuiltIn.Should Contain    ${output}    64 bytes
220     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ping -I ${NET_2_VM_IPV4[0]} -c 3 ${NET_2_VM_IPV4[1]}
221     BuiltIn.Should Contain    ${output}    64 bytes
222     BuiltIn.Log    Test L3 datapath
223     ${dst_ipv4_list1} =    BuiltIn.Create List    ${NET_1_VM_IPV4[1]}    @{NET_2_VM_IPV4}
224     Test Operations From Vm Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ${dst_ipv4_list1}
225     ${dst_ipv4_list2} =    BuiltIn.Create List    ${NET_2_VM_IPV4[1]}    @{NET_1_VM_IPV4}
226     Test Operations From Vm Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ${dst_ipv4_list2}
227
228 Dissociate L3VPN From Routers
229     [Documentation]    Dissociating router from L3VPN.
230     ${router_id} =    OpenStackOperations.Get Router Id    ${ROUTER}
231     VpnOperations.Dissociate VPN to Router    routerid=${router_id}    vpnid=${VPN_INSTANCE_ID[0]}
232     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
233     BuiltIn.Should Not Contain    ${resp}    ${router_id}
234
235 Delete Router And Router Interfaces With L3VPN
236     [Documentation]    Delete associate with L3VPN Router and its Ports.
237     # Asscoiate router with L3VPN
238     ${router_id} =    OpenStackOperations.Get Router Id    ${ROUTER}
239     VpnOperations.Associate VPN to Router    routerid=${router_id}    vpnid=${VPN_INSTANCE_ID[0]}
240     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
241     BuiltIn.Should Contain    ${resp}    ${router_id}
242     # Delete Interface
243     : FOR    ${iface}    IN    @{SUBNETS4}
244     \    Remove Interface    ${ROUTER}    ${iface}
245     \    ${subnet_id} =    Get Subnet Id    ${iface}
246     \    ${rt_port_list} =    OpenStackOperations.Show Router Interface    ${ROUTER}
247     \    BuiltIn.Should Not Contain    ${rt_port_list}    ${subnet_id}
248     # Delete Router and Interface to the subnets.
249     Delete Router    ${ROUTER}
250     ${router_output} =    OpenStackOperations.List Routers
251     BuiltIn.Should Not Contain    ${router_output}    ${ROUTER}
252     ${router_list} =    BuiltIn.Create List    ${ROUTER}
253     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements Not At URI    ${ROUTER_URL}    ${router_list}
254     # Verify Router Entry removed from L3VPN
255     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
256     BuiltIn.Should Not Contain    ${resp}    ${router_id}
257     Verify GWMAC Flow Entry Removed From Flow Table On All Compute Nodes
258
259 Delete Router With NonExistentRouter Name
260     [Documentation]    Delete router with nonExistentRouter name.
261     ${rc}    ${output} =    Run And Return Rc And Output    openstack router delete nonExistentRouter
262     BuiltIn.Should Match Regexp    ${output}    Failed to delete router with name or ID 'nonExistentRouter'|Failed to delete router\\(s\\) with name or ID\\(s\\) 'nonExistentRouter'
263
264 Associate L3VPN To Networks
265     [Documentation]    Associates L3VPN to networks.
266     ${network1_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
267     ${network2_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[1]
268     VpnOperations.Associate L3VPN To Network    networkid=${network1_id}    vpnid=${VPN_INSTANCE_ID[0]}
269     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
270     BuiltIn.Should Contain    ${resp}    ${network1_id}
271     VpnOperations.Associate L3VPN To Network    networkid=${network2_id}    vpnid=${VPN_INSTANCE_ID[0]}
272     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
273     BuiltIn.Should Contain    ${resp}    ${network2_id}
274
275 Dissociate L3VPN From Networks
276     [Documentation]    Dissociate L3VPN from networks.
277     ${network1_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
278     ${network2_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[1]
279     VpnOperations.Dissociate L3VPN From Networks    networkid=${network1_id}    vpnid=${VPN_INSTANCE_ID[0]}
280     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
281     BuiltIn.Should Not Contain    ${resp}    ${network1_id}
282     VpnOperations.Dissociate L3VPN From Networks    networkid=${network2_id}    vpnid=${VPN_INSTANCE_ID[0]}
283     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
284     BuiltIn.Should Not Contain    ${resp}    ${network2_id}
285
286 Delete L3VPN
287     [Documentation]    Delete L3VPN.
288     VpnOperations.VPN Delete L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
289
290 Create Multiple L3VPN
291     [Documentation]    Creates three L3VPNs and then check the same.
292     ${net_id} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
293     ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${net_id}
294     VpnOperations.VPN Create L3VPN    vpnid=${VPN_INSTANCE_ID[0]}    name=${VPN_NAME[0]}    rd=${RDS[0]}    exportrt=${RDS[0]}    importrt=${RDS[0]}    tenantid=${tenant_id}
295     VpnOperations.VPN Create L3VPN    vpnid=${VPN_INSTANCE_ID[1]}    name=${VPN_NAME[1]}    rd=${RDS[1]}    exportrt=${RDS[1]}    importrt=${RDS[1]}    tenantid=${tenant_id}
296     VpnOperations.VPN Create L3VPN    vpnid=${VPN_INSTANCE_ID[2]}    name=${VPN_NAME[2]}    rd=${RDS[2]}    exportrt=${RDS[2]}    importrt=${RDS[2]}    tenantid=${tenant_id}
297     ${resp} =    VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
298     BuiltIn.Should Contain    ${resp}    ${VPN_INSTANCE_ID[0]}
299     ${resp} =    VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[1]}
300     BuiltIn.Should Contain    ${resp}    ${VPN_INSTANCE_ID[1]}
301     ${resp} =    VPN Get L3VPN    vpnid=${VPN_INSTANCE_ID[2]}
302     BuiltIn.Should Contain    ${resp}    ${VPN_INSTANCE_ID[2]}
303
304 *** Keywords ***
305 Suite Setup
306     VpnOperations.Basic Suite Setup
307     OpenStackOperations.Create Network    @{NETWORKS}[0]
308     OpenStackOperations.Create Network    @{NETWORKS}[1]
309     ${NET_LIST} =    OpenStackOperations.List Networks
310     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${NETWORK_URL}    ${NETWORKS}
311     OpenStackOperations.Update Network    @{NETWORKS}[0]    additional_args=--description ${UPDATE_NETWORK}
312     ${output} =    OpenStackOperations.Show Network    @{NETWORKS}[0]
313     BuiltIn.Should Contain    ${output}    ${UPDATE_NETWORK}
314     OpenStackOperations.Create SubNet    @{NETWORKS}[0]    @{SUBNETS4}[0]    @{SUBNETS4_CIDR}[0]
315     OpenStackOperations.Create SubNet    @{NETWORKS}[0]    @{SUBNETS6}[0]    @{SUBNETS6_CIDR}[0]    ${SUBNET_ADDITIONAL_ARGS}
316     OpenStackOperations.Create SubNet    @{NETWORKS}[1]    @{SUBNETS4}[1]    @{SUBNETS4_CIDR}[1]
317     OpenStackOperations.Create SubNet    @{NETWORKS}[1]    @{SUBNETS6}[1]    @{SUBNETS6_CIDR}[1]    ${SUBNET_ADDITIONAL_ARGS}
318     ${SUB_LIST} =    OpenStackOperations.List Subnets
319     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${SUBNETWORK_URL}    ${SUBNETS4}
320     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${SUBNETWORK_URL}    ${SUBNETS6}
321     OpenStackOperations.Update SubNet    @{SUBNETS4}[0]    additional_args=--description ${UPDATE_SUBNET}
322     ${output} =    OpenStackOperations.Show SubNet    @{SUBNETS4}[0]
323     BuiltIn.Should Contain    ${output}    ${UPDATE_SUBNET}
324     OpenStackOperations.Create Allow All SecurityGroup    ${SECURITY_GROUP}    IPv4
325     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=ingress    ethertype=IPv6    port_range_max=65535    port_range_min=1    protocol=tcp
326     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=egress    ethertype=IPv6    port_range_max=65535    port_range_min=1    protocol=tcp
327     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=ingress    ethertype=IPv6    protocol=icmp
328     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=egress    ethertype=IPv6    protocol=icmp
329     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=ingress    ethertype=IPv6    port_range_max=65535    port_range_min=1    protocol=udp
330     OpenStackOperations.Neutron Security Group Rule Create    ${SECURITY_GROUP}    direction=egress    ethertype=IPv6    port_range_max=65535    port_range_min=1    protocol=udp
331     ${allowed_address_pairs_args} =    BuiltIn.Set Variable    --allowed-address ip-address=@{EXTRA_NW_SUBNET_IPV4}[0] --allowed-address ip-address=@{EXTRA_NW_SUBNET_IPV4}[1] --allowed-address ip-address=@{EXTRA_NW_SUBNET_IPV6}[0] --allowed-address ip-address=@{EXTRA_NW_SUBNET_IPV6}[1]
332     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[0]    sg=${SECURITY_GROUP}    additional_args=${allowed_address_pairs_args}
333     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[1]    sg=${SECURITY_GROUP}    additional_args=${allowed_address_pairs_args}
334     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[2]    sg=${SECURITY_GROUP}    additional_args=${allowed_address_pairs_args}
335     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[3]    sg=${SECURITY_GROUP}    additional_args=${allowed_address_pairs_args}
336     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${PORT_URL}    ${PORTS}
337     ${PORTS_MACADDR} =    OpenStackOperations.Get Ports MacAddr    ${PORTS}
338     BuiltIn.Set Suite Variable    ${PORTS_MACADDR}
339     OpenStackOperations.Update Port    @{PORTS}[0]    additional_args=--name ${UPDATE_PORT}
340     ${output} =    Show Port    ${UPDATE_PORT}
341     BuiltIn.Should Contain    ${output}    ${UPDATE_PORT}
342     OpenStackOperations.Update Port    ${UPDATE_PORT}    additional_args=--name @{PORTS}[0]
343     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[0]    ${NET_1_VM_INSTANCES[0]}    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
344     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[1]    ${NET_1_VM_INSTANCES[1]}    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
345     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[2]    ${NET_2_VM_INSTANCES[0]}    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
346     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[3]    ${NET_2_VM_INSTANCES[1]}    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
347     ${VM_INSTANCES} =    BuiltIn.Create List    @{NET_1_VM_INSTANCES}    @{NET_2_VM_INSTANCES}
348     BuiltIn.Set Suite Variable    ${VM_INSTANCES}
349     BuiltIn.Wait Until Keyword Succeeds    30s    10s    OpenStackOperations.Wait For Routes To Propogate    ${NETWORKS}    ${SUBNETS4_CIDR}
350     BuiltIn.Wait Until Keyword Succeeds    30s    10s    OpenStackOperations.Wait For Routes To Propogate    ${NETWORKS}    ${SUBNETS6_CIDR}
351     @{NET_1_VM_IPV4}    ${NET_1_DHCP_IPV4} =    OpenStackOperations.Get VM IPs    @{NET_1_VM_INSTANCES}
352     @{NET_2_VM_IPV4}    ${NET_2_DHCP_IPV4} =    OpenStackOperations.Get VM IPs    @{NET_2_VM_INSTANCES}
353     BuiltIn.Should Not Contain    ${NET_1_VM_IPV4}    None
354     BuiltIn.Should Not Contain    ${NET_2_VM_IPV4}    None
355     BuiltIn.Should Not Contain    ${NET_1_DHCP_IPV4}    None
356     BuiltIn.Should Not Contain    ${NET_2_DHCP_IPV4}    None
357     BuiltIn.Log    Collect VMs IPv6 addresses
358     ${prefix_net10} =    String.Replace String    @{SUBNETS6_CIDR}[0]    ${IP6_SUBNET_CIDR_SUFFIX}    ${IP6_ADDR_SUFFIX}
359     ${prefix_net20} =    String.Replace String    @{SUBNETS6_CIDR}[1]    ${IP6_SUBNET_CIDR_SUFFIX}    ${IP6_ADDR_SUFFIX}
360     ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
361     ...    true    ${NET_1_VM_INSTANCES}    @{NETWORKS}[0]    ${prefix_net10}
362     ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Wait Until Keyword Succeeds    3x    60s    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
363     ...    true    ${NET_2_VM_INSTANCES}    @{NETWORKS}[1]    ${prefix_net20}
364     ${NET_1_VM_IPV6} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    false    ${NET_1_VM_INSTANCES}    @{NETWORKS}[0]    ${prefix_net10}
365     ${NET_2_VM_IPV6} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses    false    ${NET_2_VM_INSTANCES}    @{NETWORKS}[1]    ${prefix_net20}
366     ${LOOP_COUNT}    Get Length    ${NET_1_VM_INSTANCES}
367     : FOR    ${index}    IN RANGE    0    ${LOOP_COUNT}
368     \    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    @{NET_1_VM_IPV6}[${index}]    None
369     \    Run Keyword If    '${status}' == 'FAIL'    Write Commands Until Prompt    nova console-log @{NET_1_VM_INSTANCES}[${index}]    30s
370     \    ${status}    ${message}    Run Keyword And Ignore Error    BuiltIn.Should Not Contain    @{NET_2_VM_IPV6}[${index}]    None
371     \    Run Keyword If    '${status}' == 'FAIL'    Write Commands Until Prompt    nova console-log @{NET_2_VM_INSTANCES}[${index}]    30s
372     BuiltIn.Set Suite Variable    ${NET_1_VM_IPV4}
373     BuiltIn.Set Suite Variable    ${NET_2_VM_IPV4}
374     BuiltIn.Set Suite Variable    ${NET_1_VM_IPV6}
375     BuiltIn.Set Suite Variable    ${NET_2_VM_IPV6}
376     ${VM_IPS} =    BuiltIn.Create List    @{NET_1_VM_IPV4}    @{NET_2_VM_IPV4}    @{NET_1_VM_IPV6}    @{NET_2_VM_IPV6}
377     BuiltIn.Set Suite Variable    ${VM_IPS}
378     OpenStackOperations.Show Debugs    @{NET_1_VM_INSTANCES}    @{NET_2_VM_INSTANCES}
379     OpenStackOperations.Get Suite Debugs
380
381 Suite Teardown
382     [Documentation]    Delete the setup
383     BuiltIn.Run Keyword And Ignore Error    VpnOperations.VPN Delete L3VPN    vpnid=@{VPN_INSTANCE_ID}[0]
384     BuiltIn.Run Keyword And Ignore Error    VpnOperations.VPN Delete L3VPN    vpnid=@{VPN_INSTANCE_ID}[1]
385     BuiltIn.Run Keyword And Ignore Error    VpnOperations.VPN Delete L3VPN    vpnid=@{VPN_INSTANCE_ID}[2]
386     OpenStackOperations.OpenStack Suite Teardown
387
388 Verify GWMAC Flow Entry On Flow Table
389     [Arguments]    ${cnIp}
390     [Documentation]    Verify GWMAC Table, ARP Response table and Dispatcher table.
391     ${flow_output} =    Run Command On Remote System    ${cnIp}    sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
392     ${group_output} =    Run Command On Remote System    ${cnIp}    sudo ovs-ofctl -O OpenFlow13 dump-groups ${INTEGRATION_BRIDGE}
393     BuiltIn.Should Contain    ${flow_output}    table=${DISPATCHER_TABLE}
394     ${dispatcher_table} =    Get Lines Containing String    ${flow_output}    table=${DISPATCHER_TABLE}
395     BuiltIn.Should Contain    ${dispatcher_table}    goto_table:${GWMAC_TABLE}
396     BuiltIn.Should Not Contain    ${dispatcher_table}    goto_table:${ARP_RESPONSE_TABLE}
397     BuiltIn.Should Contain    ${flow_output}    table=${GWMAC_TABLE}
398     ${gwmac_table} =    Get Lines Containing String    ${flow_output}    table=${GWMAC_TABLE}
399     # Verify GWMAC address present in table ${L3_TABLE}
400     : FOR    ${macAdd}    IN    @{GW_MAC_ADDRS}
401     \    BuiltIn.Should Contain    ${gwmac_table}    dl_dst=${macAdd} actions=goto_table:${L3_TABLE}
402     # Verify Miss entry
403     BuiltIn.Should Contain    ${gwmac_table}    actions=resubmit(,17)
404     # Verify ARP_CHECK_TABLE - ${ARP_CHECK_TABLE}
405     ${arpchk_table} =    Get Lines Containing String    ${flow_output}    table=${ARP_CHECK_TABLE}
406     BuiltIn.Should Match Regexp    ${arpchk_table}    ${ARP_RESPONSE_REGEX}
407     ${match} =    BuiltIn.Should Match Regexp    ${arpchk_table}    ${ARP_REQUEST_REGEX}
408     ${groupID} =    Split String    ${match}    separator=:
409     BuiltIn.Should Contain    ${flow_output}    table=${IPV6_TABLE}
410     ${icmp_ipv6_flows} =    Get Lines Containing String    ${flow_output}    icmp_type=${ICMP_TYPE}
411     # Verify IPv6 icmp_type=135
412     : FOR    ${ip_addr}    IN    @{GW_IPV6_ADDRS}
413     \    ${rule} =    BuiltIn.Set Variable    icmp_type=${ICMP_TYPE},icmp_code=0,nd_target=${ip_addr} actions=CONTROLLER:65535
414     \    BuiltIn.Should Match Regexp    ${icmp_ipv6_flows}    ${rule}
415     VpnOperations.Verify ARP REQUEST in groupTable    ${group_output}    ${groupID[1]}
416     # Verify ARP_RESPONSE_TABLE - ${ARP_RESPONSE_TABLE}
417     BuiltIn.Should Contain    ${flow_output}    table=${ARP_RESPONSE_TABLE}
418     ${arpResponder_table} =    Get Lines Containing String    ${flow_output}    table=${ARP_RESPONSE_TABLE}
419     BuiltIn.Should Contain    ${arpResponder_table}    priority=0 actions=drop
420     : FOR    ${macAdd}    ${ipAdd}    IN ZIP    ${GW1_MAC_ADDRS}    ${GW_IPV4_ADDRS}
421     \    ${ARP_RESPONSE_IP_MAC_REGEX} =    BuiltIn.Set Variable    arp_tpa=${ipAdd},arp_op=1 actions=.*,set_field:${macAdd}->eth_src
422     \    BuiltIn.Should Match Regexp    ${arpResponder_table}    ${ARP_RESPONSE_IP_MAC_REGEX}