Upgrade RF syntax for v3.2 compatibility
[integration/test.git] / csit / suites / netvirt / vpnservice / vpn_basic_dualstack_one_router.robot
1 *** Settings ***
2 Documentation     Test suite to validate dualstack (IPv4 + IPv6) vpnservice functionality in an Openstack
3 ...               integrated environment.
4 ...               The assumption of this suite is that the environment is already configured with the proper
5 ...               integration bridges and vxlan tunnels.
6 Suite Setup       Suite Setup
7 Suite Teardown    Suite Teardown
8 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
9 Test Teardown     OpenStackOperations.Get Test Teardown Debugs
10 Library           Collections
11 Library           OperatingSystem
12 Library           RequestsLibrary
13 Resource          ../../../libraries/Utils.robot
14 Resource          ../../../libraries/OpenStackOperations.robot
15 Resource          ../../../libraries/DevstackUtils.robot
16 Resource          ../../../libraries/VpnOperations.robot
17 Resource          ../../../libraries/OVSDB.robot
18 Resource          ../../../libraries/SetupUtils.robot
19 Resource          ../../../libraries/Tcpdump.robot
20 Resource          ../../../variables/Variables.robot
21 Resource          ../../../variables/netvirt/Variables.robot
22
23 *** Variables ***
24 ${SECURITY_GROUP}    vpn_sg_dualstack
25 @{NETWORKS}       vpn_net_1_dualstack    vpn_net_2_dualstack
26 @{SUBNETS4}       vpn_net_ipv4_1_dualstack    vpn_net_ipv4_2_dualstack
27 @{SUBNETS6}       vpn_net_ipv6_1_dualstack    vpn_net_ipv6_2_dualstack
28 @{SUBNETS4_CIDR}    30.1.1.0/24    40.1.1.0/24
29 @{SUBNETS6_CIDR}    2001:db5:0:2::/64    2001:db5:0:3::/64
30 ${SUBNET_ADDITIONAL_ARGS}    --ip-version=6 --ipv6-address-mode=slaac --ipv6-ra-mode=slaac
31 @{PORTS}          vpn_port_1_dualstack    vpn_port_2_dualstack    vpn_port_3_dualstack    vpn_port_4_dualstack
32 @{NET_1_VM_INSTANCES}    vpn_net_1_vm_1_dualstack    vpn_net_1_vm_2_dualstack
33 @{NET_2_VM_INSTANCES}    vpn_net_2_vm_1_dualstack    vpn_net_2_vm_2_dualstack
34 @{EXTRA_NW_IPV4}    76.1.1.2    77.1.1.2
35 @{EXTRA_NW_IPV6}    3001:db9:cafe:d::10    3001:db9:abcd:d::20
36 @{EXTRA_NW_SUBNET_IPv4}    76.1.1.0/24    77.1.1.0/24
37 @{EXTRA_NW_SUBNET_IPv6}    3001:db9:cafe:d::/64    3001:db9:abcd:d::/64
38 ${ROUTER}         vpn_router_dualstack
39 ${UPDATE_NETWORK}    UpdateNetwork_dualstack
40 ${UPDATE_SUBNET}    UpdateSubnet_dualstack
41 ${UPDATE_PORT}    UpdatePort_dualstack
42 @{VPN_INSTANCE_ID}    1bc8cd92-48ca-49b5-94e1-b2921a261661    1bc8cd92-48ca-49b5-94e1-b2921a261662    1bc8cd92-48ca-49b5-94e1-b2921a261663
43 @{VPN_NAME}       vpn1_dualstack    vpn2_dualstack    vpn3_dualstack
44 @{RDS}            ["2506:2"]    ["2606:2"]    ["2706:2"]
45
46 *** Test Cases ***
47 Check ELAN Datapath Traffic Within The Networks
48     [Documentation]    Checks datapath within the same network with different vlans.
49     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV4[0]}    ping -I ${NET_1_VM_IPV4[0]} -c 3 ${NET_1_VM_IPV4[1]}
50     BuiltIn.Should Contain    ${output}    64 bytes
51     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    ${NET_1_VM_IPV6[0]}    ping6 -I ${NET_1_VM_IPV6[0]} -c 3 ${NET_1_VM_IPV6[1]}
52     BuiltIn.Should Contain    ${output}    64 bytes
53     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV4[0]}    ping -I ${NET_2_VM_IPV4[0]} -c 3 ${NET_2_VM_IPV4[1]}
54     BuiltIn.Should Contain    ${output}    64 bytes
55     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    ${NET_2_VM_IPV6[0]}    ping6 -I ${NET_2_VM_IPV6[0]} -c 3 ${NET_2_VM_IPV6[1]}
56     BuiltIn.Should Contain    ${output}    64 bytes
57
58 Create Router
59     [Documentation]    Create Router.
60     OpenStackOperations.Create Router    ${ROUTER}
61     @{ROUTER_LIST} =    BuiltIn.Create List    ${ROUTER}
62     BuiltIn.Wait Until Keyword Succeeds    3s    1s    Utils.Check For Elements At URI    ${ROUTER_URL}    ${ROUTER_LIST}
63
64 Add Router Ports
65     [Documentation]    Add created subnets to router.
66     FOR    ${PORT}    IN    @{SUBNETS4}
67         OpenStackOperations.Add Router Interface    ${ROUTER}    ${PORT}
68     END
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}
73     END
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}
82
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}
91     END
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}
104
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
113     END
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
124     END
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
140     END
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
148     END
149
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
181
182 Create L3VPN
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]}
188
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}
195
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}
214
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}
224     END
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}
235
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}
242
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}
250     # Delete Interface
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.
257     END
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
267
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'
272
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}
283
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}
294
295 Delete L3VPN
296     [Documentation]    Delete L3VPN.
297     VpnOperations.VPN Delete L3VPN    vpnid=${VPN_INSTANCE_ID[0]}
298
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]}
312
313 *** Keywords ***
314 Suite Setup
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
381     END
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
390
391 Suite Teardown
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
397
398 Verify GWMAC Flow Entry On Flow Table
399     [Arguments]    ${cnIp}
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}
412         # Verify Miss entry
413     END
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}
426     END
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}
435     END