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
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
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"]
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
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}
65 [Documentation] Add created subnets to router.
66 FOR ${PORT} IN @{SUBNETS4}
67 OpenStackOperations.Add Router Interface ${ROUTER} ${PORT}
69 ${interface_output} = OpenStackOperations.Show Router Interface ${ROUTER}
70 ${GW1_MAC_ADDRS} ${GW_IPV4_ADDRS} = VpnOperations.Get Gateway MAC And IP Address ${ROUTER}
71 FOR ${PORT} IN @{SUBNETS6}
72 OpenStackOperations.Add Router Interface ${ROUTER} ${PORT}
74 ${interface_output} = OpenStackOperations.Show Router Interface ${ROUTER}
75 ${GW2_MAC_ADDRS} ${GW_IPV6_ADDRS} = VpnOperations.Get Gateway MAC And IP Address ${ROUTER} ${IP6_REGEX}
76 ${GW_MAC_ADDRS} = BuiltIn.Create List @{GW1_MAC_ADDRS} @{GW2_MAC_ADDRS}
77 BuiltIn.Set Suite Variable ${GW1_MAC_ADDRS}
78 BuiltIn.Set Suite Variable ${GW2_MAC_ADDRS}
79 BuiltIn.Set Suite Variable ${GW_MAC_ADDRS}
80 BuiltIn.Set Suite Variable ${GW_IPV4_ADDRS}
81 BuiltIn.Set Suite Variable ${GW_IPV6_ADDRS}
83 Check L3_Datapath Traffic Across Networks With Router
84 [Documentation] L3 Datapath test across networks using previously created router.
85 BuiltIn.Log Verification of FIB Entries and Flow
86 @{tcpdump_conn_ids} = OpenStackOperations.Start Packet Capture On Nodes tcpdump_vpn_ds ${EMPTY} @{OS_ALL_IPS}
87 ${vm_instances} = BuiltIn.Create List @{NET_1_VM_IPV4} @{NET_2_VM_IPV4} @{NET_1_VM_IPV6} @{NET_2_VM_IPV6}
88 BuiltIn.Wait Until Keyword Succeeds 30s 5s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${vm_instances}
89 FOR ${VM} IN ${vm_instances}
90 BuiltIn.Wait Until Keyword Succeeds 30s 5s VpnOperations.Verify Flows Are Present For L3VPN ${OS_CMP1_IP} ${VM}
92 BuiltIn.Wait Until Keyword Succeeds 30s 5s VpnOperations.Verify GWMAC Entry On ODL ${GW_MAC_ADDRS}
93 Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
94 BuiltIn.Log L3 Datapath test across the networks using router
95 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
96 Test Operations From Vm Instance @{NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
97 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
98 Test Operations From Vm Instance @{NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
99 ${dst_ipv6_list1} = BuiltIn.Create List ${NET_1_VM_IPV6[1]} @{NET_2_VM_IPV6}
100 Test Operations From Vm Instance @{NETWORKS}[0] ${NET_1_VM_IPV6[0]} ${dst_ipv6_list1}
101 ${dst_ipv6_list2} = BuiltIn.Create List ${NET_2_VM_IPV6[1]} @{NET_1_VM_IPV6}
102 Test Operations From Vm Instance @{NETWORKS}[1] ${NET_2_VM_IPV6[0]} ${dst_ipv6_list2}
103 [Teardown] VpnOperations.Test Teardown With Tcpdump Stop ${tcpdump_conn_ids}
105 Add Multiple Extra Routes And Check Datapath Before L3VPN Creation
106 [Documentation] Add multiple extra routes and check data path before L3VPN creation.
107 BuiltIn.Log Add extraroutes to VM
108 FOR ${extra_ip} IN @{EXTRA_NW_IPV4}
109 ${cmd} = BuiltIn.Catenate sudo ip addr add ${extra_ip}/24 dev eth0
110 OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV4}[0] ${cmd}
111 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV4}[0] ip a
112 BuiltIn.Should Contain ${output} ${extra_ip}/24
114 ${ext_rt1} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV4}[0],gateway=@{NET_1_VM_IPV4}[0]
115 ${ext_rt2} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV4}[1],gateway=@{NET_1_VM_IPV4}[0]
116 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt1} ${RT_OPTIONS} ${ext_rt2}
117 OpenStackOperations.Update Router ${ROUTER} ${cmd}
118 OpenStackOperations.Show Router ${ROUTER}
119 FOR ${extra_ip} IN @{EXTRA_NW_IPV6}
120 ${cmd} = BuiltIn.Catenate sudo ip -6 addr add ${extra_ip}/64 dev eth0
121 OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV6}[0] ${cmd}
122 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV6}[0] ip -6 a
123 BuiltIn.Should Contain ${output} ${extra_ip}/64
125 ${ext_rt3} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV6}[0],gateway=@{NET_1_VM_IPV6}[0]
126 ${ext_rt4} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV6}[1],gateway=@{NET_1_VM_IPV6}[0]
127 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt3} ${RT_OPTIONS} ${ext_rt4}
128 OpenStackOperations.Update Router ${ROUTER} ${cmd}
129 OpenStackOperations.Show Router ${ROUTER}
130 BuiltIn.Log Verify FIB table
131 ${vm_ips} = BuiltIn.Create List @{EXTRA_NW_SUBNET_IPV4} @{EXTRA_NW_SUBNET_IPV6}
132 BuiltIn.Wait Until Keyword Succeeds 30s 5s Utils.Check For Elements At URI ${FIB_ENTRY_URL} ${vm_ips}
133 FOR ${extra_ip} IN @{EXTRA_NW_IPV4}
134 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] ${NET_1_VM_IPV4[1]} ping -c 3 ${extra_ip}
135 BuiltIn.Should Contain ${output} 64 bytes
136 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] ${NET_2_VM_IPV4[0]} ping -c 3 ${extra_ip}
137 BuiltIn.Should Contain ${output} 64 bytes
138 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] ${NET_2_VM_IPV4[1]} ping -c 3 ${extra_ip}
139 BuiltIn.Should Contain ${output} 64 bytes
141 FOR ${extra_ip} IN @{EXTRA_NW_IPV6}
142 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] ${NET_1_VM_IPV6[1]} ping6 -c 3 ${extra_ip}
143 BuiltIn.Should Contain ${output} 64 bytes
144 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] ${NET_2_VM_IPV6[0]} ping6 -c 3 ${extra_ip}
145 BuiltIn.Should Contain ${output} 64 bytes
146 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] ${NET_2_VM_IPV6[1]} ping6 -c 3 ${extra_ip}
147 BuiltIn.Should Contain ${output} 64 bytes
150 Delete And Recreate Extra Route
151 [Documentation] Delete IPv4 and IPv6 extra routes and recreate it.
152 ... Then check data path before L3VPN creation.
153 BuiltIn.Log Delete all extra routes
154 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
155 OpenStackOperations.Show Router ${ROUTER}
156 ${cmd}= BuiltIn.Catenate sudo ip addr add @{EXTRA_NW_IPV4}[0]/24 dev eth0
157 OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV4}[0] ${cmd}
158 ${ext_rt_ipv4} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV4}[0],gateway=@{NET_1_VM_IPV4}[0]
159 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt_ipv4}
160 OpenStackOperations.Update Router ${ROUTER} ${cmd}
161 OpenStackOperations.Show Router ${ROUTER}
162 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV4}[1] ping -c 3 @{EXTRA_NW_IPV4}[0]
163 BuiltIn.Should Contain ${output} 64 bytes
164 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] @{NET_2_VM_IPV4}[0] ping -c 3 @{EXTRA_NW_IPV4}[0]
165 BuiltIn.Should Contain ${output} 64 bytes
166 ${cmd} = BuiltIn.Catenate sudo ip -6 addr add @{EXTRA_NW_IPV6}[0]/64 dev eth0
167 OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV6}[0] ${cmd}
168 ${ext_rt2} = BuiltIn.Set Variable destination=@{EXTRA_NW_SUBNET_IPV6}[0],gateway=@{NET_1_VM_IPV6}[0]
169 ${cmd} = BuiltIn.Catenate ${RT_OPTIONS} ${ext_rt2}
170 OpenStackOperations.Update Router ${ROUTER} ${cmd}
171 OpenStackOperations.Show Router ${ROUTER}
172 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[0] @{NET_1_VM_IPV6}[1] ping6 -c 3 @{EXTRA_NW_IPV6}[0]
173 BuiltIn.Should Contain ${output} 64 bytes
174 ${output} = OpenStackOperations.Execute Command on VM Instance @{NETWORKS}[1] @{NET_2_VM_IPV6}[0] ping6 -c 3 @{EXTRA_NW_IPV6}[0]
175 BuiltIn.Should Contain ${output} 64 bytes
176 # clear off extra-routes before the next set of tests
177 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
178 [Teardown] BuiltIn.Run Keywords OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
179 ... AND OpenStackOperations.Show Router ${ROUTER}
180 ... AND OpenStackOperations.Get Test Teardown Debugs
183 ${net_id} = OpenStackOperations.Get Net Id @{NETWORKS}[0]
184 ${tenant_id} = OpenStackOperations.Get Tenant ID From Network ${net_id}
185 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}
186 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
187 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[0]}
189 Associate L3VPN To Routers
190 [Documentation] Associating router to L3VPN.
191 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
192 VpnOperations.Associate VPN to Router routerid=${router_id} vpnid=${VPN_INSTANCE_ID[0]}
193 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
194 BuiltIn.Should Contain ${resp} ${router_id}
196 Verify L3VPN Datapath With Router Association
197 [Documentation] Datapath test across networks using L3VPN associated with router.
198 BuiltIn.Log Verify VPN interfaces, FIB entries and Flow table
199 BuiltIn.Wait Until Keyword Succeeds 30s 5s Utils.Check For Elements At URI ${VPN_IFACES_URL} ${VM_IPS}
200 ${RD} = Strip String ${RDS[0]} characters="[]
201 BuiltIn.Wait Until Keyword Succeeds 60s 15s Utils.Check For Elements At URI ${CONFIG_API}/odl-fib:fibEntries/vrfTables/${RD}/ ${VM_IPS}
202 Verify Flows Are Present For L3VPN On All Compute Nodes ${VM_IPS}
203 BuiltIn.Wait Until Keyword Succeeds 30s 5s VpnOperations.Verify GWMAC Entry On ODL ${GW_MAC_ADDRS}
204 Verify GWMAC Flow Entry On Flow Table On All Compute Nodes
205 BuiltIn.Log L3 Datapath test across the networks using L3VPN
206 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
207 Test Operations From Vm Instance @{NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
208 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
209 Test Operations From Vm Instance @{NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
210 ${dst_ipv6_list1} = BuiltIn.Create List ${NET_1_VM_IPV6[1]} @{NET_2_VM_IPV6}
211 Test Operations From Vm Instance @{NETWORKS}[0] ${NET_1_VM_IPV6[0]} ${dst_ipv6_list1}
212 ${dst_ipv6_list2} = BuiltIn.Create List ${NET_2_VM_IPV6[1]} @{NET_1_VM_IPV6}
213 Test Operations From Vm Instance @{NETWORKS}[1] ${NET_2_VM_IPV6[0]} ${dst_ipv6_list2}
215 Delete IPv6 Subnet And Check IPv4 datapath
216 [Documentation] Delete IPv6 subnet from router and check IPv4 datapath before L3VPN creation.
217 ... Then recreate IPv6 subnet.
218 BuiltIn.Log Delete extra routes
219 OpenStackOperations.Update Router ${ROUTER} ${RT_CLEAR}
220 OpenStackOperations.Show Router ${ROUTER}
221 BuiltIn.Log Delete IPv6 subnet
222 FOR ${PORT} IN @{SUBNETS6}
223 Remove Interface ${ROUTER} ${PORT}
225 BuiltIn.Log Test L2 datapath
226 ${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]}
227 BuiltIn.Should Contain ${output} 64 bytes
228 ${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]}
229 BuiltIn.Should Contain ${output} 64 bytes
230 BuiltIn.Log Test L3 datapath
231 ${dst_ipv4_list1} = BuiltIn.Create List ${NET_1_VM_IPV4[1]} @{NET_2_VM_IPV4}
232 Test Operations From Vm Instance @{NETWORKS}[0] ${NET_1_VM_IPV4[0]} ${dst_ipv4_list1}
233 ${dst_ipv4_list2} = BuiltIn.Create List ${NET_2_VM_IPV4[1]} @{NET_1_VM_IPV4}
234 Test Operations From Vm Instance @{NETWORKS}[1] ${NET_2_VM_IPV4[0]} ${dst_ipv4_list2}
236 Dissociate L3VPN From Routers
237 [Documentation] Dissociating router from L3VPN.
238 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
239 VpnOperations.Dissociate 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 Not Contain ${resp} ${router_id}
243 Delete Router And Router Interfaces With L3VPN
244 [Documentation] Delete associate with L3VPN Router and its Ports.
245 # Asscoiate router with L3VPN
246 ${router_id} = OpenStackOperations.Get Router Id ${ROUTER}
247 VpnOperations.Associate VPN to Router routerid=${router_id} vpnid=${VPN_INSTANCE_ID[0]}
248 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
249 BuiltIn.Should Contain ${resp} ${router_id}
251 FOR ${iface} IN @{SUBNETS4}
252 Remove Interface ${ROUTER} ${iface}
253 ${subnet_id} = Get Subnet Id ${iface}
254 ${rt_port_list} = OpenStackOperations.Show Router Interface ${ROUTER}
255 BuiltIn.Should Not Contain ${rt_port_list} ${subnet_id}
256 # Delete Router and Interface to the subnets.
258 Delete Router ${ROUTER}
259 ${router_output} = OpenStackOperations.List Routers
260 BuiltIn.Should Not Contain ${router_output} ${ROUTER}
261 ${router_list} = BuiltIn.Create List ${ROUTER}
262 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements Not At URI ${ROUTER_URL} ${router_list} check_for_null=True
263 # Verify Router Entry removed from L3VPN
264 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
265 BuiltIn.Should Not Contain ${resp} ${router_id}
266 Verify GWMAC Flow Entry Removed From Flow Table On All Compute Nodes
268 Delete Router With NonExistentRouter Name
269 [Documentation] Delete router with nonExistentRouter name.
270 ${rc} ${output} = Run And Return Rc And Output openstack router delete nonExistentRouter
271 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'
273 Associate L3VPN To Networks
274 [Documentation] Associates L3VPN to networks.
275 ${network1_id} = OpenStackOperations.Get Net Id @{NETWORKS}[0]
276 ${network2_id} = OpenStackOperations.Get Net Id @{NETWORKS}[1]
277 VpnOperations.Associate L3VPN To Network networkid=${network1_id} vpnid=${VPN_INSTANCE_ID[0]}
278 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
279 BuiltIn.Should Contain ${resp} ${network1_id}
280 VpnOperations.Associate L3VPN To Network networkid=${network2_id} vpnid=${VPN_INSTANCE_ID[0]}
281 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
282 BuiltIn.Should Contain ${resp} ${network2_id}
284 Dissociate L3VPN From Networks
285 [Documentation] Dissociate L3VPN from networks.
286 ${network1_id} = OpenStackOperations.Get Net Id @{NETWORKS}[0]
287 ${network2_id} = OpenStackOperations.Get Net Id @{NETWORKS}[1]
288 VpnOperations.Dissociate L3VPN From Networks networkid=${network1_id} vpnid=${VPN_INSTANCE_ID[0]}
289 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
290 BuiltIn.Should Not Contain ${resp} ${network1_id}
291 VpnOperations.Dissociate L3VPN From Networks networkid=${network2_id} vpnid=${VPN_INSTANCE_ID[0]}
292 ${resp} = VpnOperations.VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
293 BuiltIn.Should Not Contain ${resp} ${network2_id}
296 [Documentation] Delete L3VPN.
297 VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID[0]}
299 Create Multiple L3VPN
300 [Documentation] Creates three L3VPNs and then check the same.
301 ${net_id} = OpenStackOperations.Get Net Id @{NETWORKS}[0]
302 ${tenant_id} = OpenStackOperations.Get Tenant ID From Network ${net_id}
303 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}
304 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}
305 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}
306 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[0]}
307 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[0]}
308 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[1]}
309 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[1]}
310 ${resp} = VPN Get L3VPN vpnid=${VPN_INSTANCE_ID[2]}
311 BuiltIn.Should Contain ${resp} ${VPN_INSTANCE_ID[2]}
315 VpnOperations.Basic Suite Setup
316 OpenStackOperations.Create Network @{NETWORKS}[0]
317 OpenStackOperations.Create Network @{NETWORKS}[1]
318 ${NET_LIST} = OpenStackOperations.List Networks
319 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${NETWORK_URL} ${NETWORKS}
320 OpenStackOperations.Update Network @{NETWORKS}[0] additional_args=--description ${UPDATE_NETWORK}
321 ${output} = OpenStackOperations.Show Network @{NETWORKS}[0]
322 BuiltIn.Should Contain ${output} ${UPDATE_NETWORK}
323 OpenStackOperations.Create SubNet @{NETWORKS}[0] @{SUBNETS4}[0] @{SUBNETS4_CIDR}[0]
324 OpenStackOperations.Create SubNet @{NETWORKS}[0] @{SUBNETS6}[0] @{SUBNETS6_CIDR}[0] ${SUBNET_ADDITIONAL_ARGS}
325 OpenStackOperations.Create SubNet @{NETWORKS}[1] @{SUBNETS4}[1] @{SUBNETS4_CIDR}[1]
326 OpenStackOperations.Create SubNet @{NETWORKS}[1] @{SUBNETS6}[1] @{SUBNETS6_CIDR}[1] ${SUBNET_ADDITIONAL_ARGS}
327 ${SUB_LIST} = OpenStackOperations.List Subnets
328 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${SUBNETWORK_URL} ${SUBNETS4}
329 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${SUBNETWORK_URL} ${SUBNETS6}
330 OpenStackOperations.Update SubNet @{SUBNETS4}[0] additional_args=--description ${UPDATE_SUBNET}
331 ${output} = OpenStackOperations.Show SubNet @{SUBNETS4}[0]
332 BuiltIn.Should Contain ${output} ${UPDATE_SUBNET}
333 OpenStackOperations.Create Allow All SecurityGroup ${SECURITY_GROUP} IPv4
334 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=ingress ethertype=IPv6 port_range_max=65535 port_range_min=1 protocol=tcp
335 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=egress ethertype=IPv6 port_range_max=65535 port_range_min=1 protocol=tcp
336 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=ingress ethertype=IPv6 protocol=icmp
337 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=egress ethertype=IPv6 protocol=icmp
338 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=ingress ethertype=IPv6 port_range_max=65535 port_range_min=1 protocol=udp
339 OpenStackOperations.Neutron Security Group Rule Create ${SECURITY_GROUP} direction=egress ethertype=IPv6 port_range_max=65535 port_range_min=1 protocol=udp
340 ${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]
341 OpenStackOperations.Create Port @{NETWORKS}[0] @{PORTS}[0] sg=${SECURITY_GROUP} additional_args=${allowed_address_pairs_args}
342 OpenStackOperations.Create Port @{NETWORKS}[0] @{PORTS}[1] sg=${SECURITY_GROUP} additional_args=${allowed_address_pairs_args}
343 OpenStackOperations.Create Port @{NETWORKS}[1] @{PORTS}[2] sg=${SECURITY_GROUP} additional_args=${allowed_address_pairs_args}
344 OpenStackOperations.Create Port @{NETWORKS}[1] @{PORTS}[3] sg=${SECURITY_GROUP} additional_args=${allowed_address_pairs_args}
345 BuiltIn.Wait Until Keyword Succeeds 3s 1s Utils.Check For Elements At URI ${PORT_URL} ${PORTS}
346 ${PORTS_MACADDR} = OpenStackOperations.Get Ports MacAddr ${PORTS}
347 BuiltIn.Set Suite Variable ${PORTS_MACADDR}
348 OpenStackOperations.Update Port @{PORTS}[0] additional_args=--name ${UPDATE_PORT}
349 ${output} = Show Port ${UPDATE_PORT}
350 BuiltIn.Should Contain ${output} ${UPDATE_PORT}
351 OpenStackOperations.Update Port ${UPDATE_PORT} additional_args=--name @{PORTS}[0]
352 OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS}[0] ${NET_1_VM_INSTANCES[0]} ${OS_CMP1_HOSTNAME} sg=${SECURITY_GROUP}
353 OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS}[1] ${NET_1_VM_INSTANCES[1]} ${OS_CMP2_HOSTNAME} sg=${SECURITY_GROUP}
354 OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS}[2] ${NET_2_VM_INSTANCES[0]} ${OS_CMP1_HOSTNAME} sg=${SECURITY_GROUP}
355 OpenStackOperations.Create Vm Instance With Port On Compute Node @{PORTS}[3] ${NET_2_VM_INSTANCES[1]} ${OS_CMP2_HOSTNAME} sg=${SECURITY_GROUP}
356 ${VM_INSTANCES} = BuiltIn.Create List @{NET_1_VM_INSTANCES} @{NET_2_VM_INSTANCES}
357 BuiltIn.Set Suite Variable ${VM_INSTANCES}
358 BuiltIn.Wait Until Keyword Succeeds 30s 10s OpenStackOperations.Wait For Routes To Propogate ${NETWORKS} ${SUBNETS4_CIDR}
359 BuiltIn.Wait Until Keyword Succeeds 30s 10s OpenStackOperations.Wait For Routes To Propogate ${NETWORKS} ${SUBNETS6_CIDR}
360 @{NET_1_VM_IPV4} ${NET_1_DHCP_IPV4} = OpenStackOperations.Get VM IPs @{NET_1_VM_INSTANCES}
361 @{NET_2_VM_IPV4} ${NET_2_DHCP_IPV4} = OpenStackOperations.Get VM IPs @{NET_2_VM_INSTANCES}
362 BuiltIn.Should Not Contain ${NET_1_VM_IPV4} None
363 BuiltIn.Should Not Contain ${NET_2_VM_IPV4} None
364 BuiltIn.Should Not Contain ${NET_1_DHCP_IPV4} None
365 BuiltIn.Should Not Contain ${NET_2_DHCP_IPV4} None
366 BuiltIn.Log Collect VMs IPv6 addresses
367 ${prefix_net10} = String.Replace String @{SUBNETS6_CIDR}[0] ${IP6_SUBNET_CIDR_SUFFIX} ${IP6_ADDR_SUFFIX}
368 ${prefix_net20} = String.Replace String @{SUBNETS6_CIDR}[1] ${IP6_SUBNET_CIDR_SUFFIX} ${IP6_ADDR_SUFFIX}
369 ${status} ${message} Run Keyword And Ignore Error BuiltIn.Wait Until Keyword Succeeds 3x 60s OpenStackOperations.Collect VM IPv6 SLAAC Addresses
370 ... true ${NET_1_VM_INSTANCES} @{NETWORKS}[0] ${prefix_net10}
371 ${status} ${message} Run Keyword And Ignore Error BuiltIn.Wait Until Keyword Succeeds 3x 60s OpenStackOperations.Collect VM IPv6 SLAAC Addresses
372 ... true ${NET_2_VM_INSTANCES} @{NETWORKS}[1] ${prefix_net20}
373 ${NET_1_VM_IPV6} = OpenStackOperations.Collect VM IPv6 SLAAC Addresses false ${NET_1_VM_INSTANCES} @{NETWORKS}[0] ${prefix_net10}
374 ${NET_2_VM_IPV6} = OpenStackOperations.Collect VM IPv6 SLAAC Addresses false ${NET_2_VM_INSTANCES} @{NETWORKS}[1] ${prefix_net20}
375 ${LOOP_COUNT} Get Length ${NET_1_VM_INSTANCES}
376 FOR ${index} IN RANGE 0 ${LOOP_COUNT}
377 ${status} ${message} Run Keyword And Ignore Error BuiltIn.Should Not Contain ${NET_1_VM_IPV6}[${index}] None
378 Run Keyword If '${status}' == 'FAIL' Write Commands Until Prompt nova console-log @{NET_1_VM_INSTANCES}[${index}] 30s
379 ${status} ${message} Run Keyword And Ignore Error BuiltIn.Should Not Contain ${NET_2_VM_IPV6}[${index}] None
380 Run Keyword If '${status}' == 'FAIL' Write Commands Until Prompt nova console-log @{NET_2_VM_INSTANCES}[${index}] 30s
382 BuiltIn.Set Suite Variable ${NET_1_VM_IPV4}
383 BuiltIn.Set Suite Variable ${NET_2_VM_IPV4}
384 BuiltIn.Set Suite Variable ${NET_1_VM_IPV6}
385 BuiltIn.Set Suite Variable ${NET_2_VM_IPV6}
386 ${VM_IPS} = BuiltIn.Create List @{NET_1_VM_IPV4} @{NET_2_VM_IPV4} @{NET_1_VM_IPV6} @{NET_2_VM_IPV6}
387 BuiltIn.Set Suite Variable ${VM_IPS}
388 OpenStackOperations.Show Debugs @{NET_1_VM_INSTANCES} @{NET_2_VM_INSTANCES}
389 OpenStackOperations.Get Suite Debugs
392 [Documentation] Delete the setup
393 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=@{VPN_INSTANCE_ID}[0]
394 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=@{VPN_INSTANCE_ID}[1]
395 BuiltIn.Run Keyword And Ignore Error VpnOperations.VPN Delete L3VPN vpnid=@{VPN_INSTANCE_ID}[2]
396 OpenStackOperations.OpenStack Suite Teardown
398 Verify GWMAC Flow Entry On Flow Table
400 [Documentation] Verify GWMAC Table, ARP Response table and Dispatcher table.
401 ${flow_output} = Run Command On Remote System ${cnIp} sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
402 ${group_output} = Run Command On Remote System ${cnIp} sudo ovs-ofctl -O OpenFlow13 dump-groups ${INTEGRATION_BRIDGE}
403 BuiltIn.Should Contain ${flow_output} table=${DISPATCHER_TABLE}
404 ${dispatcher_table} = Get Lines Containing String ${flow_output} table=${DISPATCHER_TABLE}
405 BuiltIn.Should Contain ${dispatcher_table} goto_table:${GWMAC_TABLE}
406 BuiltIn.Should Not Contain ${dispatcher_table} goto_table:${ARP_RESPONSE_TABLE}
407 BuiltIn.Should Contain ${flow_output} table=${GWMAC_TABLE}
408 ${gwmac_table} = Get Lines Containing String ${flow_output} table=${GWMAC_TABLE}
409 # Verify GWMAC address present in table ${L3_TABLE}
410 FOR ${macAdd} IN @{GW_MAC_ADDRS}
411 BuiltIn.Should Contain ${gwmac_table} dl_dst=${macAdd} actions=goto_table:${L3_TABLE}
414 BuiltIn.Should Contain ${gwmac_table} actions=resubmit(,17)
415 # Verify ARP_CHECK_TABLE - ${ARP_CHECK_TABLE}
416 ${arpchk_table} = Get Lines Containing String ${flow_output} table=${ARP_CHECK_TABLE}
417 BuiltIn.Should Match Regexp ${arpchk_table} ${ARP_RESPONSE_REGEX}
418 ${match} = BuiltIn.Should Match Regexp ${arpchk_table} ${ARP_REQUEST_REGEX}
419 ${groupID} = Split String ${match} separator=:
420 BuiltIn.Should Contain ${flow_output} table=${IPV6_TABLE}
421 ${icmp_ipv6_flows} = Get Lines Containing String ${flow_output} icmp_type=${ICMP_TYPE}
422 # Verify IPv6 icmp_type=135
423 FOR ${ip_addr} IN @{GW_IPV6_ADDRS}
424 ${rule} = BuiltIn.Set Variable icmp_type=${ICMP_TYPE},icmp_code=0,nd_target=${ip_addr} actions=CONTROLLER:65535
425 BuiltIn.Should Match Regexp ${icmp_ipv6_flows} ${rule}
427 VpnOperations.Verify ARP REQUEST in groupTable ${group_output} ${groupID[1]}
428 # Verify ARP_RESPONSE_TABLE - ${ARP_RESPONSE_TABLE}
429 BuiltIn.Should Contain ${flow_output} table=${ARP_RESPONSE_TABLE}
430 ${arpResponder_table} = Get Lines Containing String ${flow_output} table=${ARP_RESPONSE_TABLE}
431 BuiltIn.Should Contain ${arpResponder_table} priority=0 actions=drop
432 FOR ${macAdd} ${ipAdd} IN ZIP ${GW1_MAC_ADDRS} ${GW_IPV4_ADDRS}
433 ${ARP_RESPONSE_IP_MAC_REGEX} = BuiltIn.Set Variable arp_tpa=${ipAdd},arp_op=1 actions=.*,set_field:${macAdd}->eth_src
434 BuiltIn.Should Match Regexp ${arpResponder_table} ${ARP_RESPONSE_IP_MAC_REGEX}