Upgrade RF syntax for v3.2 compatibility
[integration/test.git] / csit / suites / netvirt / vpnservice / arp_learning.robot
1 *** Settings ***
2 Documentation     Test suite for ARP Request. More test cases to be added in subsequent patches.
3 Suite Setup       Suite Setup
4 Suite Teardown    Suite Teardown
5 Test Setup        SetupUtils.Setup_Test_With_Logging_And_Without_Fast_Failing
6 Test Teardown     OpenStackOperations.Get Test Teardown Debugs
7 Library           RequestsLibrary
8 Library           SSHLibrary
9 Resource          ../../../libraries/DevstackUtils.robot
10 Resource          ../../../libraries/OpenStackOperations.robot
11 Resource          ../../../libraries/SetupUtils.robot
12 Resource          ../../../libraries/VpnOperations.robot
13 Resource          ../../../variables/netvirt/Variables.robot
14 Resource          ../../../variables/Variables.robot
15
16 *** Variables ***
17 ${SECURITY_GROUP}    vpna_sg
18 @{NETWORKS}       vpna_net_1    vpna_net_2    vpna_net_3
19 @{SUBNETS}        vpna_sub_1    vpna_sub_2    vpna_sub_3
20 @{SUBNET_CIDRS}    10.10.10.0/24    10.20.20.0/24    10.30.30.0/24
21 @{PORTS}          vpna_net_1_port_1    vpna_net_1_port_2    vpna_net_2_port_1    vpna_net_2_port_2    vpna_net_3_port_1    vpna_net_3_port_2
22 @{NET_1_VMS}      vpna_net_1_vm_1    vpna_net_1_vm_2
23 @{NET_2_VMS}      vpna_net_2_vm_1    vpna_net_2_vm_2
24 @{NET_3_VMS}      vpna_net_3_vm_1    vpna_net_3_vm_2
25 ${ROUTER}         vpna_router
26 @{VPN_INSTANCE_IDS}    4ae8cd92-48ca-49b5-94e1-b2921a261111
27 @{VPN_NAMES}      vpna_1
28 ${RD1}            ["2200:2"]
29 ${RD2}            ["2200:3"]
30 ${EXPORT_RT}      ["2200:2","2200:3"]
31 ${IMPORT_RT}      ["2200:2","2200:3"]
32 ${SUB_IF}         eth0:1
33 @{EXTRA_NW_IP}    192.168.10.110    192.168.20.110
34 ${FIB_ENTRY_2}    192.168.10.110
35 ${RPING_MIP_IP}    sudo arping -I eth0:1 -c 5 -b -s 192.168.10.110 192.168.10.110
36 ${RPING_MIP_IP_2}    sudo arping -I eth0:1 -c 5 -b -s 192.168.20.110 192.168.20.110
37 ${RPING_EXP_STR}    broadcast
38
39 *** Test Cases ***
40 Verify Setup
41     [Documentation]    Verify that VMs received ip and ping is happening between different VMs.
42     ...    For this, we ssh to the VM using the dhcp-namespace on the controller node and verify ping
43     ...    reachability to the second VM on the same network and VMs on other network (i.e., east-west routing)
44     ${vms} =    BuiltIn.Create List    @{NET_1_VM_IPS}    @{NET_2_VM_IPS}    @{NET_3_VM_IPS}
45     BuiltIn.Wait Until Keyword Succeeds    30s    10s    Utils.Check For Elements At URI    ${FIB_ENTRIES_URL}    ${vms}
46     Verify Ping On Same Networks
47     Verify Ping On Different Networks
48
49 Verify GARP Requests
50     [Documentation]    Verify that GARP request is sent to controller and controller learns this info.
51     ...    In this test-case, before we validate the GARPs, we ensure that the necessary pipeline
52     ...    flows for the VMs spawned on the networks are as expected (along with the FIB Entries
53     ...    in the ODL Datastore). For triggering GARPs, we create an alias interface (eth0:1) on
54     ...    VM1_net0, configure it with an extra_route_ip, trigger 5 GARPs from the VM for the
55     ...    extra_route_ip and ensure that ODL learns (by looking at odl-fib:fibEntries) the
56     ...    extra_route_ip info with the nexthop pointing to Compute-1 (where VM1_net0 is spawned)
57     ...    hostIP. Finally, we verify ping reachability to the extra_route_ip from other VMs on
58     ...    the network.
59     BuiltIn.Pass Execution If    "${OPENSTACK_TOPO}" == "1cmb-0ctl-0cmp"    "Test is not supported for combo node"
60     BuiltIn.Set Test Variable    ${fib_entry_1}    @{NET_1_VM_IPS}[0]
61     BuiltIn.Set Test Variable    ${fib_entry_3}    @{NET_1_VM_IPS}[1]
62     Verify Flows Are Present On All Compute Nodes
63     ${output} =    VpnOperations.Get Fib Entries    session
64     ${resp} =    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${fib_entry_3}\/32".*"${OS_CMP2_IP}\\"
65     ${resp} =    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${fib_entry_1}\/32".*"${OS_CMP1_IP}\\"
66     ${rx_packet1_before} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ifconfig eth0
67     ${rx_packet0_before} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ifconfig eth0
68     ${config_extra_route_ip1} =    BuiltIn.Catenate    sudo ifconfig ${SUB_IF} @{EXTRA_NW_IP}[0] netmask 255.255.255.0 up
69     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ${config_extra_route_ip1}
70     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ifconfig
71     BuiltIn.Should Contain    ${output}    ${SUB_IF}
72     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ${RPING_MIP_IP}
73     BuiltIn.Should Contain    ${output}    broadcast
74     BuiltIn.Should Contain    ${output}    Received 0 reply
75     ${rx_packet1_after} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ifconfig eth0
76     ${rx_packet0_after} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ifconfig eth0
77     BuiltIn.Should Not Be Equal    ${rx_packet0_before}    ${rx_packet0_after}
78     BuiltIn.Should Not Be Equal    ${rx_packet1_before}    ${rx_packet1_after}
79     Verify Flows Are Present On All Compute Nodes
80     BuiltIn.Wait Until Keyword Succeeds    5s    1s    Verify Learnt IP    ${FIB_ENTRY_2}    session
81     ${output} =    VpnOperations.Get Fib Entries    session
82     ${resp} =    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${fib_entry_3}\\/32".*"${OS_CMP2_IP}\\"
83     ${resp} =    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${fib_entry_1}\\/32".*"${OS_CMP1_IP}\\"
84     ${resp} =    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${FIB_ENTRY_2}\\/32".*"${OS_CMP2_IP}\\"
85     Verify Ping To Sub Interface    ${FIB_ENTRY_2}
86
87 Verify MIP Migration
88     [Documentation]    Verify that after migration of movable ip across compute nodes, the controller updates the routes.
89     ...    Unconfigure the extra_route_ip on VM1_net0 and configure it on vm0_net0 (on Compute-0 host).
90     ...    Trigger 5 GARPs from the VM for the extra_route_ip and ensure that ODL learns/updates
91     ...    the extra_route_ip info with nexthop in the FIB entry pointing to Compute-0 hostip.
92     BuiltIn.Pass Execution If    "${OPENSTACK_TOPO}" == "1cmb-0ctl-0cmp"    "Test is not supported for combo node"
93     ${unconfig_extra_route_ip1} =    BuiltIn.Catenate    sudo ifconfig ${SUB_IF} down
94     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ${unconfig_extra_route_ip1}
95     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ifconfig
96     BuiltIn.Should Not Contain    ${output}    ${SUB_IF}
97     ${config_extra_route_ip1} =    BuiltIn.Catenate    sudo ifconfig ${SUB_IF} @{EXTRA_NW_IP}[0] netmask 255.255.255.0 up
98     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ${config_extra_route_ip1}
99     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ifconfig
100     BuiltIn.Should Contain    ${output}    ${SUB_IF}
101     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ifconfig ${SUB_IF}
102     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ${RPING_MIP_IP}
103     BuiltIn.Should Contain    ${output}    Received 0 reply
104     BuiltIn.Should Contain    ${output}    broadcast
105     BuiltIn.Wait Until Keyword Succeeds    5s    1s    Verify Learnt IP    ${FIB_ENTRY_2}    session
106     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ${RPING_MIP_IP}
107     ${output}    VpnOperations.Get Fib Entries    session
108     ${resp}=    BuiltIn.Should Match Regexp    ${output}    destPrefix\\":\\"${FIB_ENTRY_2}\\/32".*"${OS_CMP1_IP}\\"
109     Verify Ping To Sub Interface    ${FIB_ENTRY_2}
110     ${unconfig_extra_route_ip1} =    BuiltIn.Catenate    sudo ifconfig ${SUB_IF} down
111     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ${unconfig_extra_route_ip1}
112
113 Verify ping to subnet gateway
114     [Documentation]    Verify ping happens to subnet gateway. To be submitted in next patch
115     [Tags]    not-implemented    exclude
116     TODO
117
118 If anything other than subnet ip then no reply
119     [Documentation]    If anything other than subnet ip then no reply. To be submitted in next patch
120     [Tags]    not-implemented    exclude
121     TODO
122
123 Validate multiple mip migration
124     [Documentation]    Validate multiple mip migration. To be submitted in next patch
125     [Tags]    not-implemented    exclude
126     TODO
127
128 Same DPN MIP Migration
129     [Documentation]    Same DPN MIP Migration. To be submitted in next patch
130     [Tags]    not-implemented    exclude
131     TODO
132
133 *** Keywords ***
134 Suite Setup
135     [Documentation]    Suite Setup to create the necessary resources.
136     ...    Create three tenant networks with a subnet in each network and an allow-all Security Group.
137     ...    In each of the networks, create two ports (i.e., total of 6 ports, two in each network)
138     ...    Create two VMs in each network (so total of 6 VMs). VM0_net0 on Compute-0 and VM1_net0 on Compute-1.
139     ...    Create a Neutron Router and associate subnet1 and subnet2.
140     ...    Create an L3VPN instance and associate the L3VPN instance to the neutron router.
141     VpnOperations.Basic Suite Setup
142     FOR    ${network}    IN    @{NETWORKS}
143         OpenStackOperations.Create Network    ${network}
144     END
145     ${neutron_networks} =    OpenStackOperations.List Networks
146     FOR    ${network}    IN    @{NETWORKS}
147         BuiltIn.Should Contain    ${neutron_networks}    ${network}
148     END
149     ${NET_ID} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
150     BuiltIn.Set Suite Variable    ${NET_ID}
151     FOR    ${i}    IN RANGE    0    3
152         OpenStackOperations.Create SubNet    @{NETWORKS}[${i}]    @{SUBNETS}[${i}]    @{SUBNET_CIDRS}[${i}]
153     END
154     ${neutron_subnets} =    OpenStackOperations.List Subnets
155     FOR    ${subnet}    IN    @{SUBNETS}
156         BuiltIn.Should Contain    ${neutron_subnets}    ${subnet}
157     END
158     OpenStackOperations.Create Allow All SecurityGroup    ${SECURITY_GROUP}
159     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[0]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
160     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[1]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
161     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[2]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
162     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[3]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
163     OpenStackOperations.Create Port    @{NETWORKS}[2]    @{PORTS}[4]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
164     OpenStackOperations.Create Port    @{NETWORKS}[2]    @{PORTS}[5]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
165     Wait Until Keyword Succeeds    3s    1s    Check For Elements At URI    ${CONFIG_API}/neutron:neutron/ports/    ${PORTS}
166     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[0]    @{NET_1_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
167     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[1]    @{NET_1_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
168     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[2]    @{NET_2_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
169     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[3]    @{NET_2_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
170     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[4]    @{NET_3_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
171     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[5]    @{NET_3_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
172     @{NET_1_VM_IPS}    ${NET_1_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_1_VMS}
173     @{NET_2_VM_IPS}    ${NET_2_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_2_VMS}
174     @{NET_3_VM_IPS}    ${NET_3_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_3_VMS}
175     BuiltIn.Set Suite Variable    @{NET_1_VM_IPS}
176     BuiltIn.Set Suite Variable    @{NET_2_VM_IPS}
177     BuiltIn.Set Suite Variable    @{NET_3_VM_IPS}
178     BuiltIn.Should Not Contain    ${NET_1_VM_IPS}    None
179     BuiltIn.Should Not Contain    ${NET_2_VM_IPS}    None
180     BuiltIn.Should Not Contain    ${NET_3_VM_IPS}    None
181     BuiltIn.Should Not Contain    ${NET_1_DHCP_IP}    None
182     BuiltIn.Should Not Contain    ${NET_2_DHCP_IP}    None
183     BuiltIn.Should Not Contain    ${NET_3_DHCP_IP}    None
184     OpenStackOperations.Create Router    ${ROUTER}
185     OpenStackOperations.Add Router Interface    ${ROUTER}    @{SUBNETS}[1]
186     OpenStackOperations.Add Router Interface    ${ROUTER}    @{SUBNETS}[2]
187     ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${NET_ID}
188     VpnOperations.VPN Create L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]    name=${VPN_NAMES[0]}    rd=${RD1}    exportrt=${EXPORT_RT}    importrt=${IMPORT_RT}    tenantid=${tenant_id}
189     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
190     BuiltIn.Should Contain    ${resp}    @{VPN_INSTANCE_IDS}[0]
191     Associate L3VPN To ROUTER
192     OpenStackOperations.Show Debugs    @{NET_1_VMS}    @{NET_2_VMS}    @{NET_3_VMS}
193     OpenStackOperations.Get Suite Debugs
194
195 Suite Teardown
196     [Documentation]    Delete the setup
197     BuiltIn.Run Keyword And Ignore Error    VpnOperations.Dissociate L3VPN From Networks    networkid=${NET_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
198     BuiltIn.Run Keyword And Ignore Error    VpnOperations.Dissociate VPN to Router    routerid=${ROUTER_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
199     BuiltIn.Run Keyword And Ignore Error    VpnOperations.VPN Delete L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
200     OpenStackOperations.OpenStack Suite Teardown
201
202 Associate L3VPN To ROUTER
203     VpnOperations.Associate L3VPN To Network    networkid=${NET_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
204     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
205     BuiltIn.Should Contain    ${resp}    ${NET_ID}
206     ${ROUTER_ID} =    OpenStackOperations.Get Router Id    ${ROUTER}
207     BuiltIn.Set Suite Variable    ${ROUTER_ID}
208     VpnOperations.Associate VPN to Router    routerid=${ROUTER_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
209     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
210     BuiltIn.Should Contain    ${resp}    ${ROUTER_ID}
211
212 Verify Ping On Same Networks
213     [Documentation]    Verify ping among VM of same network
214     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 @{NET_1_VM_IPS}[1]
215     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
216     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 @{NET_2_VM_IPS}[1]
217     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
218     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ping -c 3 @{NET_1_VM_IPS}[0]
219     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
220     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[1]    ping -c 3 @{NET_2_VM_IPS}[0]
221     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
222     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 @{NET_3_VM_IPS}[1]
223     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
224
225 Verify Ping On Different Networks
226     [Documentation]    Verify ping among VMs of different network
227     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 @{NET_2_VM_IPS}[0]
228     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
229     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 @{NET_3_VM_IPS}[0]
230     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
231     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ping -c 3 @{NET_2_VM_IPS}[1]
232     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
233     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[1]    ping -c 3 @{NET_3_VM_IPS}[1]
234     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
235     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 @{NET_1_VM_IPS}[1]
236     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
237
238 Verify Flows Are Present
239     [Arguments]    ${ip}
240     [Documentation]    Verify Flows Are Present
241     ...    Verify that Flows to support L3 Connectivity (like ELAN_SMAC_TABLE, FIB_TABLE)
242     ...    and a FIB entry to reach all the VMs in the network exist in the OVS pipeline.
243     ${flow_output}=    Utils.Run Command On Remote System    ${ip}    sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
244     BuiltIn.Log    ${flow_output}
245     ${resp} =    BuiltIn.Should Contain    ${flow_output}    table=50
246     ${resp} =    BuiltIn.Should Contain    ${flow_output}    table=21,
247     @{vm_ips} =    BuiltIn.Create List    @{NET_1_VM_IPS}    @{NET_2_VM_IPS}    @{NET_3_VM_IPS}
248     ${resp} =    Should Match regexp    ${flow_output}    table=0.*goto_table:36
249     ${resp} =    Should Match regexp    ${flow_output}    table=0.*goto_table:17
250     FOR    ${ip}    IN    @{vm_ips}
251         ${resp} =    Should Match regexp    ${flow_output}    table=21.*nw_dst=${ip}
252     END
253
254 Verify Flows Are Present On All Compute Nodes
255     [Documentation]    Verify Flows Are Present On All Compute Nodes
256     FOR    ${ip}    IN    @{OS_CMP_IPS}
257         BuiltIn.Wait Until Keyword Succeeds    10s    2s    Verify Flows Are Present    ${ip}
258     END
259
260 Verify Ping To Sub Interface
261     [Arguments]    ${sub_interface_ip}
262     [Documentation]    Verify ping to the sub-interface
263     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
264     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
265     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
266     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
267     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
268     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
269
270 Verify Learnt IP
271     [Arguments]    ${ip}    ${session}
272     [Documentation]    Check that sub interface ip has been learnt after ARP request
273     ${resp}    RequestsLibrary.Get Request    ${session}    /restconf/operational/odl-l3vpn:learnt-vpn-vip-to-port-data/
274     BuiltIn.Log    ${resp.content}
275     BuiltIn.Should Contain    ${resp.content}    ${ip}
276
277 TODO
278     Fail    "Not implemented"