Update Robot Framework format - step 11
[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
7 Library             Collections
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
19
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
24
25
26 *** Variables ***
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
34 @{PORTS}
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
49 @{VPN_INSTANCE_ID}
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"]
55
56
57 *** Test Cases ***
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
61     ...    ${NETWORKS}[0]
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
66     ...    ${NETWORKS}[0]
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
71     ...    ${NETWORKS}[1]
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
76     ...    ${NETWORKS}[1]
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
80
81 Create Router
82     [Documentation]    Create Router.
83     OpenStackOperations.Create Router    ${ROUTER}
84     @{ROUTER_LIST} =    BuiltIn.Create List    ${ROUTER}
85     BuiltIn.Wait Until Keyword Succeeds
86     ...    3s
87     ...    1s
88     ...    Utils.Check For Elements At URI
89     ...    ${ROUTER_URL}
90     ...    ${ROUTER_LIST}
91
92 Add Router Ports
93     [Documentation]    Add created subnets to router.
94     FOR    ${PORT}    IN    @{SUBNETS4}
95         OpenStackOperations.Add Router Interface    ${ROUTER}    ${PORT}
96     END
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}
101     END
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}
110
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
115     ...    tcpdump_vpn_ds
116     ...    ${EMPTY}
117     ...    @{OS_ALL_IPS}
118     ${vm_instances} =    BuiltIn.Create List
119     ...    @{NET_1_VM_IPV4}
120     ...    @{NET_2_VM_IPV4}
121     ...    @{NET_1_VM_IPV6}
122     ...    @{NET_2_VM_IPV6}
123     BuiltIn.Wait Until Keyword Succeeds
124     ...    30s
125     ...    5s
126     ...    Utils.Check For Elements At URI
127     ...    ${FIB_ENTRY_URL}
128     ...    ${vm_instances}
129     FOR    ${VM}    IN    ${vm_instances}
130         BuiltIn.Wait Until Keyword Succeeds
131         ...    30s
132         ...    5s
133         ...    VpnOperations.Verify Flows Are Present For L3VPN
134         ...    ${OS_CMP1_IP}
135         ...    ${VM}
136     END
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}
149
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
157         ...    ${NETWORKS}[0]
158         ...    ${NET_1_VM_IPV4}[0]
159         ...    ip a
160         BuiltIn.Should Contain    ${output}    ${extra_ip}/24
161     END
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
171         ...    ${NETWORKS}[0]
172         ...    ${NET_1_VM_IPV6}[0]
173         ...    ip -6 a
174         BuiltIn.Should Contain    ${output}    ${extra_ip}/64
175     END
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
184     ...    30s
185     ...    5s
186     ...    Utils.Check For Elements At URI
187     ...    ${FIB_ENTRY_URL}
188     ...    ${vm_ips}
189     FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV4}
190         ${output} =    OpenStackOperations.Execute Command on VM Instance
191         ...    ${NETWORKS}[0]
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
196         ...    ${NETWORKS}[1]
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
201         ...    ${NETWORKS}[1]
202         ...    ${NET_2_VM_IPV4[1]}
203         ...    ping -c 3 ${extra_ip}
204         BuiltIn.Should Contain    ${output}    64 bytes
205     END
206     FOR    ${extra_ip}    IN    @{EXTRA_NW_IPV6}
207         ${output} =    OpenStackOperations.Execute Command on VM Instance
208         ...    ${NETWORKS}[0]
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
213         ...    ${NETWORKS}[1]
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
218         ...    ${NETWORKS}[1]
219         ...    ${NET_2_VM_IPV6[1]}
220         ...    ping6 -c 3 ${extra_ip}
221         BuiltIn.Should Contain    ${output}    64 bytes
222     END
223
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
237     ...    ${NETWORKS}[0]
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
242     ...    ${NETWORKS}[1]
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
253     ...    ${NETWORKS}[0]
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
258     ...    ${NETWORKS}[1]
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
267
268 Create L3VPN
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]}
274     ...    rd=${RDS}[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]}
280
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}
287
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
292     ...    30s
293     ...    5s
294     ...    Utils.Check For Elements At URI
295     ...    ${VPN_IFACES_URL}
296     ...    ${VM_IPS}
297     ${RD} =    Strip String    ${RDS[0]}    characters="[]
298     BuiltIn.Wait Until Keyword Succeeds
299     ...    60s
300     ...    15s
301     ...    Utils.Check For Elements At URI
302     ...    ${CONFIG_API}/odl-fib:fibEntries/vrfTables/${RD}/
303     ...    ${VM_IPS}
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}
316
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}
326     END
327     BuiltIn.Log    Test L2 datapath
328     ${output} =    OpenStackOperations.Execute Command on VM Instance
329     ...    ${NETWORKS}[0]
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
334     ...    ${NETWORKS}[1]
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}
343
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}
350
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}
358     # Delete Interface
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.
365     END
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
371     ...    3s
372     ...    1s
373     ...    Utils.Check For Elements Not At URI
374     ...    ${ROUTER_URL}
375     ...    ${router_list}
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
381
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
386     ...    ${output}
387     ...    Failed to delete router with name or ID 'nonExistentRouter'|Failed to delete router\\(s\\) with name or ID\\(s\\) 'nonExistentRouter'
388
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}
399
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}
410
411 Delete L3VPN
412     [Documentation]    Delete L3VPN.
413     VpnOperations.VPN Delete L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
414
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]}
422     ...    rd=${RDS[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]}
429     ...    rd=${RDS[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]}
436     ...    rd=${RDS[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]}
446
447
448 *** Keywords ***
449 Suite Setup
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
460     ...    ${NETWORKS}[0]
461     ...    ${SUBNETS6}[0]
462     ...    ${SUBNETS6_CIDR}[0]
463     ...    ${SUBNET_ADDITIONAL_ARGS}
464     OpenStackOperations.Create SubNet    ${NETWORKS}[1]    ${SUBNETS4}[1]    ${SUBNETS4_CIDR}[1]
465     OpenStackOperations.Create SubNet
466     ...    ${NETWORKS}[1]
467     ...    ${SUBNETS6}[1]
468     ...    ${SUBNETS6_CIDR}[1]
469     ...    ${SUBNET_ADDITIONAL_ARGS}
470     ${SUB_LIST} =    OpenStackOperations.List Subnets
471     BuiltIn.Wait Until Keyword Succeeds
472     ...    3s
473     ...    1s
474     ...    Utils.Check For Elements At URI
475     ...    ${SUBNETWORK_URL}
476     ...    ${SUBNETS4}
477     BuiltIn.Wait Until Keyword Succeeds
478     ...    3s
479     ...    1s
480     ...    Utils.Check For Elements At URI
481     ...    ${SUBNETWORK_URL}
482     ...    ${SUBNETS6}
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
490     ...    ethertype=IPv6
491     ...    port_range_max=65535
492     ...    port_range_min=1
493     ...    protocol=tcp
494     OpenStackOperations.Neutron Security Group Rule Create
495     ...    ${SECURITY_GROUP}
496     ...    direction=egress
497     ...    ethertype=IPv6
498     ...    port_range_max=65535
499     ...    port_range_min=1
500     ...    protocol=tcp
501     OpenStackOperations.Neutron Security Group Rule Create
502     ...    ${SECURITY_GROUP}
503     ...    direction=ingress
504     ...    ethertype=IPv6
505     ...    protocol=icmp
506     OpenStackOperations.Neutron Security Group Rule Create
507     ...    ${SECURITY_GROUP}
508     ...    direction=egress
509     ...    ethertype=IPv6
510     ...    protocol=icmp
511     OpenStackOperations.Neutron Security Group Rule Create
512     ...    ${SECURITY_GROUP}
513     ...    direction=ingress
514     ...    ethertype=IPv6
515     ...    port_range_max=65535
516     ...    port_range_min=1
517     ...    protocol=udp
518     OpenStackOperations.Neutron Security Group Rule Create
519     ...    ${SECURITY_GROUP}
520     ...    direction=egress
521     ...    ethertype=IPv6
522     ...    port_range_max=65535
523     ...    port_range_min=1
524     ...    protocol=udp
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
528     ...    ${NETWORKS}[0]
529     ...    ${PORTS}[0]
530     ...    sg=${SECURITY_GROUP}
531     ...    additional_args=${allowed_address_pairs_args}
532     OpenStackOperations.Create Port
533     ...    ${NETWORKS}[0]
534     ...    ${PORTS}[1]
535     ...    sg=${SECURITY_GROUP}
536     ...    additional_args=${allowed_address_pairs_args}
537     OpenStackOperations.Create Port
538     ...    ${NETWORKS}[1]
539     ...    ${PORTS}[2]
540     ...    sg=${SECURITY_GROUP}
541     ...    additional_args=${allowed_address_pairs_args}
542     OpenStackOperations.Create Port
543     ...    ${NETWORKS}[1]
544     ...    ${PORTS}[3]
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
555     ...    ${PORTS}[0]
556     ...    ${NET_1_VM_INSTANCES[0]}
557     ...    ${OS_CMP1_HOSTNAME}
558     ...    sg=${SECURITY_GROUP}
559     OpenStackOperations.Create Vm Instance With Port On Compute Node
560     ...    ${PORTS}[1]
561     ...    ${NET_1_VM_INSTANCES[1]}
562     ...    ${OS_CMP2_HOSTNAME}
563     ...    sg=${SECURITY_GROUP}
564     OpenStackOperations.Create Vm Instance With Port On Compute Node
565     ...    ${PORTS}[2]
566     ...    ${NET_2_VM_INSTANCES[0]}
567     ...    ${OS_CMP1_HOSTNAME}
568     ...    sg=${SECURITY_GROUP}
569     OpenStackOperations.Create Vm Instance With Port On Compute Node
570     ...    ${PORTS}[3]
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
577     ...    30s
578     ...    10s
579     ...    OpenStackOperations.Wait For Routes To Propogate
580     ...    ${NETWORKS}
581     ...    ${SUBNETS4_CIDR}
582     BuiltIn.Wait Until Keyword Succeeds
583     ...    30s
584     ...    10s
585     ...    OpenStackOperations.Wait For Routes To Propogate
586     ...    ${NETWORKS}
587     ...    ${SUBNETS6_CIDR}
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
605     ...    3x
606     ...    60s
607     ...    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
608     ...    true
609     ...    ${NET_1_VM_INSTANCES}
610     ...    ${NETWORKS}[0]
611     ...    ${prefix_net10}
612     ${status}    ${message} =    Run Keyword And Ignore Error
613     ...    BuiltIn.Wait Until Keyword Succeeds
614     ...    3x
615     ...    60s
616     ...    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
617     ...    true
618     ...    ${NET_2_VM_INSTANCES}
619     ...    ${NETWORKS}[1]
620     ...    ${prefix_net20}
621     ${NET_1_VM_IPV6} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
622     ...    false
623     ...    ${NET_1_VM_INSTANCES}
624     ...    ${NETWORKS}[0]
625     ...    ${prefix_net10}
626     ${NET_2_VM_IPV6} =    OpenStackOperations.Collect VM IPv6 SLAAC Addresses
627     ...    false
628     ...    ${NET_2_VM_INSTANCES}
629     ...    ${NETWORKS}[1]
630     ...    ${prefix_net20}
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}]
636         ...    None
637         IF    '${status}' == 'FAIL'
638             Write Commands Until Prompt    nova console-log ${NET_1_VM_INSTANCES}[${index}]    30s
639         END
640         ${status}    ${message} =    Run Keyword And Ignore Error
641         ...    BuiltIn.Should Not Contain
642         ...    ${NET_2_VM_IPV6}[${index}]
643         ...    None
644         IF    '${status}' == 'FAIL'
645             Write Commands Until Prompt    nova console-log ${NET_2_VM_INSTANCES}[${index}]    30s
646         END
647     END
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
656
657 Suite Teardown
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
663
664 Verify GWMAC Flow Entry On Flow Table
665     [Documentation]    Verify GWMAC Table, ARP Response table and Dispatcher table.
666     [Arguments]    ${cnIp}
667     ${flow_output} =    Run Command On Remote System
668     ...    ${cnIp}
669     ...    sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
670     ${group_output} =    Run Command On Remote System
671     ...    ${cnIp}
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}
682         # Verify Miss entry
683     END
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}
697     END
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}
707     END