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}
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}
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}
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
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
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]}
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}
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}
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}
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}
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}
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
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'
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}
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}
287 [Documentation] Delete L3VPN.
288 VpnOperations.VPN Delete L3VPN vpnid=${VPN_INSTANCE_ID[0]}
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]}
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
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
388 Verify GWMAC Flow Entry On Flow Table
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}
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}