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.
8 Library OperatingSystem
9 Library RequestsLibrary
10 Resource ../../../libraries/Utils.robot
11 Resource ../../../libraries/OpenStackOperations.robot
12 Resource ../../../libraries/DevstackUtils.robot
13 Resource ../../../libraries/VpnOperations.robot
14 Resource ../../../libraries/OVSDB.robot
15 Resource ../../../libraries/SetupUtils.robot
16 Resource ../../../libraries/Tcpdump.robot
17 Resource ../../../variables/Variables.robot
18 Resource ../../../variables/netvirt/Variables.robot
20 Suite Setup Suite Setup
21 Suite Teardown Suite Teardown
22 Test Setup SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
23 Test Teardown OpenStackOperations.Get Test Teardown Debugs
27 ${SECURITY_GROUP} vpn_sg_dualstack
28 @{NETWORKS} vpn_net_1_dualstack vpn_net_2_dualstack
29 @{SUBNETS4} vpn_net_ipv4_1_dualstack vpn_net_ipv4_2_dualstack
30 @{SUBNETS6} vpn_net_ipv6_1_dualstack vpn_net_ipv6_2_dualstack
31 @{SUBNETS4_CIDR} 30.1.1.0/24 40.1.1.0/24
32 @{SUBNETS6_CIDR} 2001:db5:0:2::/64 2001:db5:0:3::/64
33 ${SUBNET_ADDITIONAL_ARGS} --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac
35 ... vpn_port_1_dualstack
36 ... vpn_port_2_dualstack
37 ... vpn_port_3_dualstack
38 ... vpn_port_4_dualstack
39 @{NET_1_VM_INSTANCES} vpn_net_1_vm_1_dualstack vpn_net_1_vm_2_dualstack
40 @{NET_2_VM_INSTANCES} vpn_net_2_vm_1_dualstack vpn_net_2_vm_2_dualstack
41 @{EXTRA_NW_IPV4} 76.1.1.2 77.1.1.2
42 @{EXTRA_NW_IPV6} 3001:db9:cafe:d::10 3001:db9:abcd:d::20
43 @{EXTRA_NW_SUBNET_IPv4} 76.1.1.0/24 77.1.1.0/24
44 @{EXTRA_NW_SUBNET_IPv6} 3001:db9:cafe:d::/64 3001:db9:abcd:d::/64
45 ${ROUTER} vpn_router_dualstack
46 ${UPDATE_NETWORK} UpdateNetwork_dualstack
47 ${UPDATE_SUBNET} UpdateSubnet_dualstack
48 ${UPDATE_PORT} UpdatePort_dualstack
50 ... 1bc8cd92-48ca-49b5-94e1-b2921a261661
51 ... 1bc8cd92-48ca-49b5-94e1-b2921a261662
52 ... 1bc8cd92-48ca-49b5-94e1-b2921a261663
53 @{VPN_NAME} vpn1_dualstack vpn2_dualstack vpn3_dualstack
54 @{RDS} ["2506:2"] ["2606:2"] ["2706:2"]
58 Check ELAN Datapath Traffic Within The Networks
59 [Documentation] Checks datapath within the same network with different vlans.
60 ${output} = OpenStackOperations.Execute Command on VM Instance
62 ... ${NET_1_VM_IPV4[0]}
63 ... ping -I ${NET_1_VM_IPV4[0]} -c 3 ${NET_1_VM_IPV4[1]}
64 BuiltIn.Should Contain ${output} 64 bytes
65 ${output} = OpenStackOperations.Execute Command on VM Instance
67 ... ${NET_1_VM_IPV6[0]}
68 ... ping6 -I ${NET_1_VM_IPV6[0]} -c 3 ${NET_1_VM_IPV6[1]}
69 BuiltIn.Should Contain ${output} 64 bytes
70 ${output} = OpenStackOperations.Execute Command on VM Instance
72 ... ${NET_2_VM_IPV4[0]}
73 ... ping -I ${NET_2_VM_IPV4[0]} -c 3 ${NET_2_VM_IPV4[1]}
74 BuiltIn.Should Contain ${output} 64 bytes
75 ${output} = OpenStackOperations.Execute Command on VM Instance
77 ... ${NET_2_VM_IPV6[0]}
78 ... ping6 -I ${NET_2_VM_IPV6[0]} -c 3 ${NET_2_VM_IPV6[1]}
79 BuiltIn.Should Contain ${output} 64 bytes
82 [Documentation] Create Router.
83 OpenStackOperations.Create Router ${ROUTER}
84 @{ROUTER_LIST} = BuiltIn.Create List ${ROUTER}
85 BuiltIn.Wait Until Keyword Succeeds
88 ... Utils.Check For Elements At URI
93 [Documentation] Add created subnets to router.
94 FOR ${PORT} IN @{SUBNETS4}
95 OpenStackOperations.Add Router Interface ${ROUTER} ${PORT}
97 ${interface_output} = OpenStackOperations.Show Router Interface ${ROUTER}
98 ${GW1_MAC_ADDRS} ${GW_IPV4_ADDRS} = VpnOperations.Get Gateway MAC And IP Address ${ROUTER}
99 FOR ${PORT} IN @{SUBNETS6}
100 OpenStackOperations.Add Router Interface ${ROUTER} ${PORT}
102 ${interface_output} = OpenStackOperations.Show Router Interface ${ROUTER}
103 ${GW2_MAC_ADDRS} ${GW_IPV6_ADDRS} = VpnOperations.Get Gateway MAC And IP Address ${ROUTER} ${IP6_REGEX}
104 ${GW_MAC_ADDRS} = BuiltIn.Create List @{GW1_MAC_ADDRS} @{GW2_MAC_ADDRS}
105 BuiltIn.Set Suite Variable ${GW1_MAC_ADDRS}
106 BuiltIn.Set Suite Variable ${GW2_MAC_ADDRS}
107 BuiltIn.Set Suite Variable ${GW_MAC_ADDRS}
108 BuiltIn.Set Suite Variable ${GW_IPV4_ADDRS}
109 BuiltIn.Set Suite Variable ${GW_IPV6_ADDRS}
111 Check L3_Datapath Traffic Across Networks With Router
112 [Documentation] L3 Datapath test across networks using previously created router.
113 BuiltIn.Log Verification of FIB Entries and Flow
114 @{tcpdump_conn_ids} = OpenStackOperations.Start Packet Capture On Nodes
118 ${vm_instances} = BuiltIn.Create List
123 BuiltIn.Wait Until Keyword Succeeds
126 ... Utils.Check For Elements At URI
129 FOR ${VM} IN ${vm_instances}
130 BuiltIn.Wait Until Keyword Succeeds
133 ... VpnOperations.Verify Flows Are Present For L3VPN
137 BuiltIn.Wait Until Keyword Succeeds 30s 5s VpnOperations.Verify GWMAC Entry On ODL ${GW_MAC_ADDRS}
138 Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
139 BuiltIn.Log L3 Datapath test across the networks using router
140 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
141 Test Operations From Vm Instance ${NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
142 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
143 Test Operations From Vm Instance ${NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
144 ${dst_ipv6_list1} = BuiltIn.Create List ${NET_1_VM_IPV6[1]} @{NET_2_VM_IPV6}
145 Test Operations From Vm Instance ${NETWORKS}[0] ${NET_1_VM_IPV6[0]} ${dst_ipv6_list1}
146 ${dst_ipv6_list2} = BuiltIn.Create List ${NET_2_VM_IPV6[1]} @{NET_1_VM_IPV6}
147 Test Operations From Vm Instance ${NETWORKS}[1] ${NET_2_VM_IPV6[0]} ${dst_ipv6_list2}
148 [Teardown] VpnOperations.Test Teardown With Tcpdump Stop ${tcpdump_conn_ids}
150 Add Multiple Extra Routes And Check Datapath Before L3VPN Creation
151 [Documentation] Add multiple extra routes and check data path before L3VPN creation.
152 BuiltIn.Log Add extraroutes to VM
153 FOR ${extra_ip} IN @{EXTRA_NW_IPV4}
154 ${cmd} = BuiltIn.Catenate sudo ip addr add ${extra_ip}/24 dev eth0
155 OpenStackOperations.Execute Command on VM Instance ${NETWORKS}[0] ${NET_1_VM_IPV4}[0] ${cmd}
156 ${output} = OpenStackOperations.Execute Command on VM Instance
158 ... ${NET_1_VM_IPV4}[0]
160 BuiltIn.Should Contain ${output} ${extra_ip}/24
162 ${ext_rt1} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV4}[0],gateway=${NET_1_VM_IPV4}[0]
163 ${ext_rt2} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV4}[1],gateway=${NET_1_VM_IPV4}[0]
164 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt1} ${RT_OPTIONS} ${ext_rt2}
165 OpenStackOperations.Update Router ${ROUTER} ${cmd}
166 OpenStackOperations.Show Router ${ROUTER}
167 FOR ${extra_ip} IN @{EXTRA_NW_IPV6}
168 ${cmd} = BuiltIn.Catenate sudo ip -6 addr add ${extra_ip}/64 dev eth0
169 OpenStackOperations.Execute Command on VM Instance ${NETWORKS}[0] ${NET_1_VM_IPV6}[0] ${cmd}
170 ${output} = OpenStackOperations.Execute Command on VM Instance
172 ... ${NET_1_VM_IPV6}[0]
174 BuiltIn.Should Contain ${output} ${extra_ip}/64
176 ${ext_rt3} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV6}[0],gateway=${NET_1_VM_IPV6}[0]
177 ${ext_rt4} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV6}[1],gateway=${NET_1_VM_IPV6}[0]
178 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt3} ${RT_OPTIONS} ${ext_rt4}
179 OpenStackOperations.Update Router ${ROUTER} ${cmd}
180 OpenStackOperations.Show Router ${ROUTER}
181 BuiltIn.Log Verify FIB table
182 ${vm_ips} = BuiltIn.Create List @{EXTRA_NW_SUBNET_IPV4} @{EXTRA_NW_SUBNET_IPV6}
183 BuiltIn.Wait Until Keyword Succeeds
186 ... Utils.Check For Elements At URI
189 FOR ${extra_ip} IN @{EXTRA_NW_IPV4}
190 ${output} = OpenStackOperations.Execute Command on VM Instance
192 ... ${NET_1_VM_IPV4[1]}
193 ... ping -c 3 ${extra_ip}
194 BuiltIn.Should Contain ${output} 64 bytes
195 ${output} = OpenStackOperations.Execute Command on VM Instance
197 ... ${NET_2_VM_IPV4[0]}
198 ... ping -c 3 ${extra_ip}
199 BuiltIn.Should Contain ${output} 64 bytes
200 ${output} = OpenStackOperations.Execute Command on VM Instance
202 ... ${NET_2_VM_IPV4[1]}
203 ... ping -c 3 ${extra_ip}
204 BuiltIn.Should Contain ${output} 64 bytes
206 FOR ${extra_ip} IN @{EXTRA_NW_IPV6}
207 ${output} = OpenStackOperations.Execute Command on VM Instance
209 ... ${NET_1_VM_IPV6[1]}
210 ... ping6 -c 3 ${extra_ip}
211 BuiltIn.Should Contain ${output} 64 bytes
212 ${output} = OpenStackOperations.Execute Command on VM Instance
214 ... ${NET_2_VM_IPV6[0]}
215 ... ping6 -c 3 ${extra_ip}
216 BuiltIn.Should Contain ${output} 64 bytes
217 ${output} = OpenStackOperations.Execute Command on VM Instance
219 ... ${NET_2_VM_IPV6[1]}
220 ... ping6 -c 3 ${extra_ip}
221 BuiltIn.Should Contain ${output} 64 bytes
224 Delete And Recreate Extra Route
225 [Documentation] Delete IPv4 and IPv6 extra routes and recreate it.
226 ... Then check data path before L3VPN creation.
227 BuiltIn.Log Delete all extra routes
228 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
229 OpenStackOperations.Show Router ${ROUTER}
230 ${cmd} = BuiltIn.Catenate sudo ip addr add ${EXTRA_NW_IPV4}[0]/24 dev eth0
231 OpenStackOperations.Execute Command on VM Instance ${NETWORKS}[0] ${NET_1_VM_IPV4}[0] ${cmd}
232 ${ext_rt_ipv4} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV4}[0],gateway=${NET_1_VM_IPV4}[0]
233 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt_ipv4}
234 OpenStackOperations.Update Router ${ROUTER} ${cmd}
235 OpenStackOperations.Show Router ${ROUTER}
236 ${output} = OpenStackOperations.Execute Command on VM Instance
238 ... ${NET_1_VM_IPV4}[1]
239 ... ping -c 3 ${EXTRA_NW_IPV4}[0]
240 BuiltIn.Should Contain ${output} 64 bytes
241 ${output} = OpenStackOperations.Execute Command on VM Instance
243 ... ${NET_2_VM_IPV4}[0]
244 ... ping -c 3 ${EXTRA_NW_IPV4}[0]
245 BuiltIn.Should Contain ${output} 64 bytes
246 ${cmd} = BuiltIn.Catenate sudo ip -6 addr add ${EXTRA_NW_IPV6}[0]/64 dev eth0
247 OpenStackOperations.Execute Command on VM Instance ${NETWORKS}[0] ${NET_1_VM_IPV6}[0] ${cmd}
248 ${ext_rt2} = BuiltIn.Set Variable destination=${EXTRA_NW_SUBNET_IPV6}[0],gateway=${NET_1_VM_IPV6}[0]
249 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt2}
250 OpenStackOperations.Update Router ${ROUTER} ${cmd}
251 OpenStackOperations.Show Router ${ROUTER}
252 ${output} = OpenStackOperations.Execute Command on VM Instance
254 ... ${NET_1_VM_IPV6}[1]
255 ... ping6 -c 3 ${EXTRA_NW_IPV6}[0]
256 BuiltIn.Should Contain ${output} 64 bytes
257 ${output} = OpenStackOperations.Execute Command on VM Instance
259 ... ${NET_2_VM_IPV6}[0]
260 ... ping6 -c 3 ${EXTRA_NW_IPV6}[0]
261 BuiltIn.Should Contain ${output} 64 bytes
262 # clear off extra-routes before the next set of tests
263 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
264 [Teardown] BuiltIn.Run Keywords OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
265 ... AND OpenStackOperations.Show Router ${ROUTER}
266 ... AND OpenStackOperations.Get Test Teardown Debugs
269 ${net_id} = OpenStackOperations.Get Net Id ${NETWORKS}[0]
270 ${tenant_id} = OpenStackOperations.Get Tenant ID From Network ${net_id}
271 VpnOperations.VPN Create L3VPN
272 ... vpnid=${VPN_INSTANCE_ID[0]}
273 ... name=${VPN_NAME[0]}
275 ... exportrt=${RDS}[0]
276 ... importrt=${RDS}[0]
277 ... tenantid=${tenant_id}
278 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
279 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[0]}
281 Associate L3VPN To Routers
282 [Documentation] Associating router to L3VPN.
283 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
284 VpnOperations.Associate VPN to Router routerid=${router_id} vpnid=${VPN_INSTANCE_ID[0]}
285 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
286 BuiltIn.Should Contain ${resp} ${router_id}
288 Verify L3VPN Datapath With Router Association
289 [Documentation] Datapath test across networks using L3VPN associated with router.
290 BuiltIn.Log Verify VPN interfaces, FIB entries and Flow table
291 BuiltIn.Wait Until Keyword Succeeds
294 ... Utils.Check For Elements At URI
295 ... ${VPN_IFACES_URL}
297 ${RD} = Strip String ${RDS[0]} characters="[]
298 BuiltIn.Wait Until Keyword Succeeds
301 ... Utils.Check For Elements At URI
302 ... ${CONFIG_API}/odl-fib:fibEntries/vrfTables/${RD}/
304 Verify Flows Are Present For L3VPN On All Compute Nodes ${VM_IPS}
305 BuiltIn.Wait Until Keyword Succeeds 30s 5s VpnOperations.Verify GWMAC Entry On ODL ${GW_MAC_ADDRS}
306 Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
307 BuiltIn.Log L3 Datapath test across the networks using L3VPN
308 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
309 Test Operations From Vm Instance ${NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
310 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
311 Test Operations From Vm Instance ${NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
312 ${dst_ipv6_list1} = BuiltIn.Create List ${NET_1_VM_IPV6[1]} @{NET_2_VM_IPV6}
313 Test Operations From Vm Instance ${NETWORKS}[0] ${NET_1_VM_IPV6[0]} ${dst_ipv6_list1}
314 ${dst_ipv6_list2} = BuiltIn.Create List ${NET_2_VM_IPV6[1]} @{NET_1_VM_IPV6}
315 Test Operations From Vm Instance ${NETWORKS}[1] ${NET_2_VM_IPV6[0]} ${dst_ipv6_list2}
317 Delete IPv6 Subnet And Check IPv4 datapath
318 [Documentation] Delete IPv6 subnet from router and check IPv4 datapath before L3VPN creation.
319 ... Then recreate IPv6 subnet.
320 BuiltIn.Log Delete extra routes
321 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
322 OpenStackOperations.Show Router ${ROUTER}
323 BuiltIn.Log Delete IPv6 subnet
324 FOR ${PORT} IN @{SUBNETS6}
325 Remove Interface ${ROUTER} ${PORT}
327 BuiltIn.Log Test L2 datapath
328 ${output} = OpenStackOperations.Execute Command on VM Instance
330 ... ${NET_1_VM_IPV4[0]}
331 ... ping -I ${NET_1_VM_IPV4[0]} -c 3 ${NET_1_VM_IPV4[1]}
332 BuiltIn.Should Contain ${output} 64 bytes
333 ${output} = OpenStackOperations.Execute Command on VM Instance
335 ... ${NET_2_VM_IPV4[0]}
336 ... ping -I ${NET_2_VM_IPV4[0]} -c 3 ${NET_2_VM_IPV4[1]}
337 BuiltIn.Should Contain ${output} 64 bytes
338 BuiltIn.Log Test L3 datapath
339 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
340 Test Operations From Vm Instance ${NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
341 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
342 Test Operations From Vm Instance ${NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
344 Dissociate L3VPN From Routers
345 [Documentation] Dissociating router from L3VPN.
346 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
347 VpnOperations.Dissociate VPN to Router routerid=${router_id} vpnid=${VPN_INSTANCE_ID[0]}
348 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
349 BuiltIn.Should Not Contain ${resp} ${router_id}
351 Delete Router And Router Interfaces With L3VPN
352 [Documentation] Delete associate with L3VPN Router and its Ports.
353 # Asscoiate router with L3VPN
354 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
355 VpnOperations.Associate VPN to Router routerid=${router_id} vpnid=${VPN_INSTANCE_ID[0]}
356 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
357 BuiltIn.Should Contain ${resp} ${router_id}
359 FOR ${iface} IN @{SUBNETS4}
360 Remove Interface ${ROUTER} ${iface}
361 ${subnet_id} = Get Subnet Id ${iface}
362 ${rt_port_list} = OpenStackOperations.Show Router Interface ${ROUTER}
363 BuiltIn.Should Not Contain ${rt_port_list} ${subnet_id}
364 # Delete Router and Interface to the subnets.
366 Delete Router ${ROUTER}
367 ${router_output} = OpenStackOperations.List Routers
368 BuiltIn.Should Not Contain ${router_output} ${ROUTER}
369 ${router_list} = BuiltIn.Create List ${ROUTER}
370 BuiltIn.Wait Until Keyword Succeeds
373 ... Utils.Check For Elements Not At URI
376 ... check_for_null=True
377 # Verify Router Entry removed from L3VPN
378 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
379 BuiltIn.Should Not Contain ${resp} ${router_id}
380 Verify GWMAC Flow Entry Removed From Flow Table On All Compute Nodes
382 Delete Router With NonExistentRouter Name
383 [Documentation] Delete router with nonExistentRouter name.
384 ${rc} ${output} = Run And Return Rc And Output openstack router delete nonExistentRouter
385 BuiltIn.Should Match Regexp
387 ... Failed to delete router with name or ID 'nonExistentRouter'|Failed to delete router\\(s\\) with name or ID\\(s\\) 'nonExistentRouter'
389 Associate L3VPN To Networks
390 [Documentation] Associates L3VPN to networks.
391 ${network1_id} = OpenStackOperations.Get Net Id ${NETWORKS}[0]
392 ${network2_id} = OpenStackOperations.Get Net Id ${NETWORKS}[1]
393 VpnOperations.Associate L3VPN To Network networkid=${network1_id} vpnid=${VPN_INSTANCE_ID[0]}
394 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
395 BuiltIn.Should Contain ${resp} ${network1_id}
396 VpnOperations.Associate L3VPN To Network networkid=${network2_id} vpnid=${VPN_INSTANCE_ID[0]}
397 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
398 BuiltIn.Should Contain ${resp} ${network2_id}
400 Dissociate L3VPN From Networks
401 [Documentation] Dissociate L3VPN from networks.
402 ${network1_id} = OpenStackOperations.Get Net Id ${NETWORKS}[0]
403 ${network2_id} = OpenStackOperations.Get Net Id ${NETWORKS}[1]
404 VpnOperations.Dissociate L3VPN From Networks networkid=${network1_id} vpnid=${VPN_INSTANCE_ID[0]}
405 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
406 BuiltIn.Should Not Contain ${resp} ${network1_id}
407 VpnOperations.Dissociate L3VPN From Networks networkid=${network2_id} vpnid=${VPN_INSTANCE_ID[0]}
408 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
409 BuiltIn.Should Not Contain ${resp} ${network2_id}
412 [Documentation] Delete L3VPN.
413 VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID[0]}
415 Create Multiple L3VPN
416 [Documentation] Creates three L3VPNs and then check the same.
417 ${net_id} = OpenStackOperations.Get Net Id ${NETWORKS}[0]
418 ${tenant_id} = OpenStackOperations.Get Tenant ID From Network ${net_id}
419 VpnOperations.VPN Create L3VPN
420 ... vpnid=${VPN_INSTANCE_ID[0]}
421 ... name=${VPN_NAME[0]}
423 ... exportrt=${RDS[0]}
424 ... importrt=${RDS[0]}
425 ... tenantid=${tenant_id}
426 VpnOperations.VPN Create L3VPN
427 ... vpnid=${VPN_INSTANCE_ID[1]}
428 ... name=${VPN_NAME[1]}
430 ... exportrt=${RDS[1]}
431 ... importrt=${RDS[1]}
432 ... tenantid=${tenant_id}
433 VpnOperations.VPN Create L3VPN
434 ... vpnid=${VPN_INSTANCE_ID[2]}
435 ... name=${VPN_NAME[2]}
437 ... exportrt=${RDS[2]}
438 ... importrt=${RDS[2]}
439 ... tenantid=${tenant_id}
440 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
441 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[0]}
442 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[1]}
443 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[1]}
444 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[2]}
445 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[2]}
450 VpnOperations.Basic Suite Setup
451 OpenStackOperations.Create Network ${NETWORKS}[0]
452 OpenStackOperations.Create Network ${NETWORKS}[1]
453 ${NET_LIST} = OpenStackOperations.List Networks
454 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${NETWORK_URL} ${NETWORKS}
455 OpenStackOperations.Update Network ${NETWORKS}[0] additional_args=--description ${UPDATE_NETWORK}
456 ${output} = OpenStackOperations.Show Network ${NETWORKS}[0]
457 BuiltIn.Should Contain ${output} ${UPDATE_NETWORK}
458 OpenStackOperations.Create SubNet ${NETWORKS}[0] ${SUBNETS4}[0] ${SUBNETS4_CIDR}[0]
459 OpenStackOperations.Create SubNet
462 ... ${SUBNETS6_CIDR}[0]
463 ... ${SUBNET_ADDITIONAL_ARGS}
464 OpenStackOperations.Create SubNet ${NETWORKS}[1] ${SUBNETS4}[1] ${SUBNETS4_CIDR}[1]
465 OpenStackOperations.Create SubNet
468 ... ${SUBNETS6_CIDR}[1]
469 ... ${SUBNET_ADDITIONAL_ARGS}
470 ${SUB_LIST} = OpenStackOperations.List Subnets
471 BuiltIn.Wait Until Keyword Succeeds
474 ... Utils.Check For Elements At URI
475 ... ${SUBNETWORK_URL}
477 BuiltIn.Wait Until Keyword Succeeds
480 ... Utils.Check For Elements At URI
481 ... ${SUBNETWORK_URL}
483 OpenStackOperations.Update SubNet ${SUBNETS4}[0] additional_args=--description ${UPDATE_SUBNET}
484 ${output} = OpenStackOperations.Show SubNet ${SUBNETS4}[0]
485 BuiltIn.Should Contain ${output} ${UPDATE_SUBNET}
486 OpenStackOperations.Create Allow All SecurityGroup ${SECURITY_GROUP} IPv4
487 OpenStackOperations.Neutron Security Group Rule Create
488 ... ${SECURITY_GROUP}
489 ... direction=ingress
491 ... port_range_max=65535
494 OpenStackOperations.Neutron Security Group Rule Create
495 ... ${SECURITY_GROUP}
498 ... port_range_max=65535
501 OpenStackOperations.Neutron Security Group Rule Create
502 ... ${SECURITY_GROUP}
503 ... direction=ingress
506 OpenStackOperations.Neutron Security Group Rule Create
507 ... ${SECURITY_GROUP}
511 OpenStackOperations.Neutron Security Group Rule Create
512 ... ${SECURITY_GROUP}
513 ... direction=ingress
515 ... port_range_max=65535
518 OpenStackOperations.Neutron Security Group Rule Create
519 ... ${SECURITY_GROUP}
522 ... port_range_max=65535
525 ${allowed_address_pairs_args} = BuiltIn.Set Variable
526 ... --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]
527 OpenStackOperations.Create Port
530 ... sg=${SECURITY_GROUP}
531 ... additional_args=${allowed_address_pairs_args}
532 OpenStackOperations.Create Port
535 ... sg=${SECURITY_GROUP}
536 ... additional_args=${allowed_address_pairs_args}
537 OpenStackOperations.Create Port
540 ... sg=${SECURITY_GROUP}
541 ... additional_args=${allowed_address_pairs_args}
542 OpenStackOperations.Create Port
545 ... sg=${SECURITY_GROUP}
546 ... additional_args=${allowed_address_pairs_args}
547 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${PORT_URL} ${PORTS}
548 ${PORTS_MACADDR} = OpenStackOperations.Get Ports MacAddr ${PORTS}
549 BuiltIn.Set Suite Variable ${PORTS_MACADDR}
550 OpenStackOperations.Update Port ${PORTS}[0] additional_args=--name ${UPDATE_PORT}
551 ${output} = Show Port ${UPDATE_PORT}
552 BuiltIn.Should Contain ${output} ${UPDATE_PORT}
553 OpenStackOperations.Update Port ${UPDATE_PORT} additional_args=--name ${PORTS}[0]
554 OpenStackOperations.Create Vm Instance With Port On Compute Node
556 ... ${NET_1_VM_INSTANCES[0]}
557 ... ${OS_CMP1_HOSTNAME}
558 ... sg=${SECURITY_GROUP}
559 OpenStackOperations.Create Vm Instance With Port On Compute Node
561 ... ${NET_1_VM_INSTANCES[1]}
562 ... ${OS_CMP2_HOSTNAME}
563 ... sg=${SECURITY_GROUP}
564 OpenStackOperations.Create Vm Instance With Port On Compute Node
566 ... ${NET_2_VM_INSTANCES[0]}
567 ... ${OS_CMP1_HOSTNAME}
568 ... sg=${SECURITY_GROUP}
569 OpenStackOperations.Create Vm Instance With Port On Compute Node
571 ... ${NET_2_VM_INSTANCES[1]}
572 ... ${OS_CMP2_HOSTNAME}
573 ... sg=${SECURITY_GROUP}
574 ${VM_INSTANCES} = BuiltIn.Create List @{NET_1_VM_INSTANCES} @{NET_2_VM_INSTANCES}
575 BuiltIn.Set Suite Variable ${VM_INSTANCES}
576 BuiltIn.Wait Until Keyword Succeeds
579 ... OpenStackOperations.Wait For Routes To Propogate
582 BuiltIn.Wait Until Keyword Succeeds
585 ... OpenStackOperations.Wait For Routes To Propogate
588 @{NET_1_VM_IPV4} ${NET_1_DHCP_IPV4} = OpenStackOperations.Get VM IPs @{NET_1_VM_INSTANCES}
589 @{NET_2_VM_IPV4} ${NET_2_DHCP_IPV4} = OpenStackOperations.Get VM IPs @{NET_2_VM_INSTANCES}
590 BuiltIn.Should Not Contain ${NET_1_VM_IPV4} None
591 BuiltIn.Should Not Contain ${NET_2_VM_IPV4} None
592 BuiltIn.Should Not Contain ${NET_1_DHCP_IPV4} None
593 BuiltIn.Should Not Contain ${NET_2_DHCP_IPV4} None
594 BuiltIn.Log Collect VMs IPv6 addresses
595 ${prefix_net10} = String.Replace String
596 ... ${SUBNETS6_CIDR}[0]
597 ... ${IP6_SUBNET_CIDR_SUFFIX}
598 ... ${IP6_ADDR_SUFFIX}
599 ${prefix_net20} = String.Replace String
600 ... ${SUBNETS6_CIDR}[1]
601 ... ${IP6_SUBNET_CIDR_SUFFIX}
602 ... ${IP6_ADDR_SUFFIX}
603 ${status} ${message} = Run Keyword And Ignore Error
604 ... BuiltIn.Wait Until Keyword Succeeds
607 ... OpenStackOperations.Collect VM IPv6 SLAAC Addresses
609 ... ${NET_1_VM_INSTANCES}
612 ${status} ${message} = Run Keyword And Ignore Error
613 ... BuiltIn.Wait Until Keyword Succeeds
616 ... OpenStackOperations.Collect VM IPv6 SLAAC Addresses
618 ... ${NET_2_VM_INSTANCES}
621 ${NET_1_VM_IPV6} = OpenStackOperations.Collect VM IPv6 SLAAC Addresses
623 ... ${NET_1_VM_INSTANCES}
626 ${NET_2_VM_IPV6} = OpenStackOperations.Collect VM IPv6 SLAAC Addresses
628 ... ${NET_2_VM_INSTANCES}
631 ${LOOP_COUNT} = Get Length ${NET_1_VM_INSTANCES}
632 FOR ${index} IN RANGE 0 ${LOOP_COUNT}
633 ${status} ${message} = Run Keyword And Ignore Error
634 ... BuiltIn.Should Not Contain
635 ... ${NET_1_VM_IPV6}[${index}]
637 IF '${status}' == 'FAIL'
638 Write Commands Until Prompt nova console-log ${NET_1_VM_INSTANCES}[${index}] 30s
640 ${status} ${message} = Run Keyword And Ignore Error
641 ... BuiltIn.Should Not Contain
642 ... ${NET_2_VM_IPV6}[${index}]
644 IF '${status}' == 'FAIL'
645 Write Commands Until Prompt nova console-log ${NET_2_VM_INSTANCES}[${index}] 30s
648 BuiltIn.Set Suite Variable ${NET_1_VM_IPV4}
649 BuiltIn.Set Suite Variable ${NET_2_VM_IPV4}
650 BuiltIn.Set Suite Variable ${NET_1_VM_IPV6}
651 BuiltIn.Set Suite Variable ${NET_2_VM_IPV6}
652 ${VM_IPS} = BuiltIn.Create List @{NET_1_VM_IPV4} @{NET_2_VM_IPV4} @{NET_1_VM_IPV6} @{NET_2_VM_IPV6}
653 BuiltIn.Set Suite Variable ${VM_IPS}
654 OpenStackOperations.Show Debugs @{NET_1_VM_INSTANCES} @{NET_2_VM_INSTANCES}
655 OpenStackOperations.Get Suite Debugs
658 [Documentation] Delete the setup
659 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID}[0]
660 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID}[1]
661 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID}[2]
662 OpenStackOperations.OpenStack Suite Teardown
664 Verify GWMAC Flow Entry On Flow Table
665 [Documentation] Verify GWMAC Table, ARP Response table and Dispatcher table.
667 ${flow_output} = Run Command On Remote System
669 ... sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
670 ${group_output} = Run Command On Remote System
672 ... sudo ovs-ofctl -O OpenFlow13 dump-groups ${INTEGRATION_BRIDGE}
673 BuiltIn.Should Contain ${flow_output} table=${DISPATCHER_TABLE}
674 ${dispatcher_table} = Get Lines Containing String ${flow_output} table=${DISPATCHER_TABLE}
675 BuiltIn.Should Contain ${dispatcher_table} goto_table:${GWMAC_TABLE}
676 BuiltIn.Should Not Contain ${dispatcher_table} goto_table:${ARP_RESPONSE_TABLE}
677 BuiltIn.Should Contain ${flow_output} table=${GWMAC_TABLE}
678 ${gwmac_table} = Get Lines Containing String ${flow_output} table=${GWMAC_TABLE}
679 # Verify GWMAC address present in table ${L3_TABLE}
680 FOR ${macAdd} IN @{GW_MAC_ADDRS}
681 BuiltIn.Should Contain ${gwmac_table} dl_dst=${macAdd} actions=goto_table:${L3_TABLE}
684 BuiltIn.Should Contain ${gwmac_table} actions=resubmit(,17)
685 # Verify ARP_CHECK_TABLE - ${ARP_CHECK_TABLE}
686 ${arpchk_table} = Get Lines Containing String ${flow_output} table=${ARP_CHECK_TABLE}
687 BuiltIn.Should Match Regexp ${arpchk_table} ${ARP_RESPONSE_REGEX}
688 ${match} = BuiltIn.Should Match Regexp ${arpchk_table} ${ARP_REQUEST_REGEX}
689 ${groupID} = Split String ${match} separator=:
690 BuiltIn.Should Contain ${flow_output} table=${IPV6_TABLE}
691 ${icmp_ipv6_flows} = Get Lines Containing String ${flow_output} icmp_type=${ICMP_TYPE}
692 # Verify IPv6 icmp_type=135
693 FOR ${ip_addr} IN @{GW_IPV6_ADDRS}
694 ${rule} = BuiltIn.Set Variable
695 ... icmp_type=${ICMP_TYPE},icmp_code=0,nd_target=${ip_addr} actions=CONTROLLER:65535
696 BuiltIn.Should Match Regexp ${icmp_ipv6_flows} ${rule}
698 VpnOperations.Verify ARP REQUEST in groupTable ${group_output} ${groupID[1]}
699 # Verify ARP_RESPONSE_TABLE - ${ARP_RESPONSE_TABLE}
700 BuiltIn.Should Contain ${flow_output} table=${ARP_RESPONSE_TABLE}
701 ${arpResponder_table} = Get Lines Containing String ${flow_output} table=${ARP_RESPONSE_TABLE}
702 BuiltIn.Should Contain ${arpResponder_table} priority=0 actions=drop
703 FOR ${macAdd} ${ipAdd} IN ZIP ${GW1_MAC_ADDRS} ${GW_IPV4_ADDRS}
704 ${ARP_RESPONSE_IP_MAC_REGEX} = BuiltIn.Set Variable
705 ... arp_tpa=${ipAdd},arp_op=1 actions=.*,set_field:${macAdd}->eth_src
706 BuiltIn.Should Match Regexp ${arpResponder_table} ${ARP_RESPONSE_IP_MAC_REGEX}