Add comments to ARP Learning suite
[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     ${neutron_networks} =    OpenStackOperations.List Networks
145     : FOR    ${network}    IN    @{NETWORKS}
146     \    BuiltIn.Should Contain    ${neutron_networks}    ${network}
147     ${NET_ID} =    OpenStackOperations.Get Net Id    @{NETWORKS}[0]
148     BuiltIn.Set Suite Variable    ${NET_ID}
149     : FOR    ${i}    IN RANGE    0    3
150     \    OpenStackOperations.Create SubNet    @{NETWORKS}[${i}]    @{SUBNETS}[${i}]    @{SUBNET_CIDRS}[${i}]
151     ${neutron_subnets} =    OpenStackOperations.List Subnets
152     : FOR    ${subnet}    IN    @{SUBNETS}
153     \    BuiltIn.Should Contain    ${neutron_subnets}    ${subnet}
154     OpenStackOperations.Create Allow All SecurityGroup    ${SECURITY_GROUP}
155     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[0]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
156     OpenStackOperations.Create Port    @{NETWORKS}[0]    @{PORTS}[1]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
157     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[2]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
158     OpenStackOperations.Create Port    @{NETWORKS}[1]    @{PORTS}[3]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
159     OpenStackOperations.Create Port    @{NETWORKS}[2]    @{PORTS}[4]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
160     OpenStackOperations.Create Port    @{NETWORKS}[2]    @{PORTS}[5]    sg=${SECURITY_GROUP}    allowed_address_pairs=@{EXTRA_NW_IP}
161     Wait Until Keyword Succeeds    3s    1s    Check For Elements At URI    ${CONFIG_API}/neutron:neutron/ports/    ${PORTS}
162     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[0]    @{NET_1_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
163     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[1]    @{NET_1_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
164     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[2]    @{NET_2_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
165     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[3]    @{NET_2_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
166     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[4]    @{NET_3_VMS}[0]    ${OS_CMP1_HOSTNAME}    sg=${SECURITY_GROUP}
167     OpenStackOperations.Create Vm Instance With Port On Compute Node    @{PORTS}[5]    @{NET_3_VMS}[1]    ${OS_CMP2_HOSTNAME}    sg=${SECURITY_GROUP}
168     @{NET_1_VM_IPS}    ${NET_1_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_1_VMS}
169     @{NET_2_VM_IPS}    ${NET_2_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_2_VMS}
170     @{NET_3_VM_IPS}    ${NET_3_DHCP_IP} =    OpenStackOperations.Get VM IPs    @{NET_3_VMS}
171     BuiltIn.Set Suite Variable    @{NET_1_VM_IPS}
172     BuiltIn.Set Suite Variable    @{NET_2_VM_IPS}
173     BuiltIn.Set Suite Variable    @{NET_3_VM_IPS}
174     BuiltIn.Should Not Contain    ${NET_1_VM_IPS}    None
175     BuiltIn.Should Not Contain    ${NET_2_VM_IPS}    None
176     BuiltIn.Should Not Contain    ${NET_3_VM_IPS}    None
177     BuiltIn.Should Not Contain    ${NET_1_DHCP_IP}    None
178     BuiltIn.Should Not Contain    ${NET_2_DHCP_IP}    None
179     BuiltIn.Should Not Contain    ${NET_3_DHCP_IP}    None
180     OpenStackOperations.Create Router    ${ROUTER}
181     OpenStackOperations.Add Router Interface    ${ROUTER}    @{SUBNETS}[1]
182     OpenStackOperations.Add Router Interface    ${ROUTER}    @{SUBNETS}[2]
183     ${tenant_id} =    OpenStackOperations.Get Tenant ID From Network    ${NET_ID}
184     VpnOperations.VPN Create L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]    name=${VPN_NAMES[0]}    rd=${RD1}    exportrt=${EXPORT_RT}    importrt=${IMPORT_RT}    tenantid=${tenant_id}
185     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
186     BuiltIn.Should Contain    ${resp}    @{VPN_INSTANCE_IDS}[0]
187     Associate L3VPN To ROUTER
188     OpenStackOperations.Show Debugs    @{NET_1_VMS}    @{NET_2_VMS}    @{NET_3_VMS}
189     OpenStackOperations.Get Suite Debugs
190
191 Suite Teardown
192     [Documentation]    Delete the setup
193     BuiltIn.Run Keyword And Ignore Error    VpnOperations.Dissociate L3VPN From Networks    networkid=${NET_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
194     BuiltIn.Run Keyword And Ignore Error    VpnOperations.Dissociate VPN to Router    routerid=${ROUTER_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
195     BuiltIn.Run Keyword And Ignore Error    VpnOperations.VPN Delete L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
196     OpenStackOperations.OpenStack Suite Teardown
197
198 Associate L3VPN To ROUTER
199     VpnOperations.Associate L3VPN To Network    networkid=${NET_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
200     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
201     BuiltIn.Should Contain    ${resp}    ${NET_ID}
202     ${ROUTER_ID} =    OpenStackOperations.Get Router Id    ${ROUTER}
203     BuiltIn.Set Suite Variable    ${ROUTER_ID}
204     VpnOperations.Associate VPN to Router    routerid=${ROUTER_ID}    vpnid=@{VPN_INSTANCE_IDS}[0]
205     ${resp} =    VpnOperations.VPN Get L3VPN    vpnid=@{VPN_INSTANCE_IDS}[0]
206     BuiltIn.Should Contain    ${resp}    ${ROUTER_ID}
207
208 Verify Ping On Same Networks
209     [Documentation]    Verify ping among VM of same network
210     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 @{NET_1_VM_IPS}[1]
211     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
212     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 @{NET_2_VM_IPS}[1]
213     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
214     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ping -c 3 @{NET_1_VM_IPS}[0]
215     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
216     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[1]    ping -c 3 @{NET_2_VM_IPS}[0]
217     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
218     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 @{NET_3_VM_IPS}[1]
219     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
220
221 Verify Ping On Different Networks
222     [Documentation]    Verify ping among VMs of different network
223     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 @{NET_2_VM_IPS}[0]
224     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
225     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 @{NET_3_VM_IPS}[0]
226     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
227     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[1]    ping -c 3 @{NET_2_VM_IPS}[1]
228     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
229     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[1]    ping -c 3 @{NET_3_VM_IPS}[1]
230     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
231     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 @{NET_1_VM_IPS}[1]
232     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
233
234 Verify Flows Are Present
235     [Arguments]    ${ip}
236     [Documentation]    Verify Flows Are Present
237     ...    Verify that Flows to support L3 Connectivity (like ELAN_SMAC_TABLE, FIB_TABLE)
238     ...    and a FIB entry to reach all the VMs in the network exist in the OVS pipeline.
239     ${flow_output}=    Utils.Run Command On Remote System    ${ip}    sudo ovs-ofctl -O OpenFlow13 dump-flows ${INTEGRATION_BRIDGE}
240     BuiltIn.Log    ${flow_output}
241     ${resp} =    BuiltIn.Should Contain    ${flow_output}    table=50
242     ${resp} =    BuiltIn.Should Contain    ${flow_output}    table=21,
243     @{vm_ips} =    BuiltIn.Create List    @{NET_1_VM_IPS}    @{NET_2_VM_IPS}    @{NET_3_VM_IPS}
244     ${resp} =    Should Match regexp    ${flow_output}    table=0.*goto_table:36
245     ${resp} =    Should Match regexp    ${flow_output}    table=0.*goto_table:17
246     : FOR    ${ip}    IN    @{vm_ips}
247     \    ${resp} =    Should Match regexp    ${flow_output}    table=21.*nw_dst=${ip}
248
249 Verify Flows Are Present On All Compute Nodes
250     [Documentation]    Verify Flows Are Present On All Compute Nodes
251     : FOR    ${ip}    IN    @{OS_CMP_IPS}
252     \    BuiltIn.Wait Until Keyword Succeeds    10s    2s    Verify Flows Are Present    ${ip}
253
254 Verify Ping To Sub Interface
255     [Arguments]    ${sub_interface_ip}
256     [Documentation]    Verify ping to the sub-interface
257     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[0]    @{NET_1_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
258     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
259     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[1]    @{NET_2_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
260     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
261     ${output} =    OpenStackOperations.Execute Command on VM Instance    @{NETWORKS}[2]    @{NET_3_VM_IPS}[0]    ping -c 3 ${sub_interface_ip}
262     BuiltIn.Should Contain    ${output}    ${PING_REGEXP}
263
264 Verify Learnt IP
265     [Arguments]    ${ip}    ${session}
266     [Documentation]    Check that sub interface ip has been learnt after ARP request
267     ${resp}    RequestsLibrary.Get Request    ${session}    /restconf/operational/odl-l3vpn:learnt-vpn-vip-to-port-data/
268     BuiltIn.Log    ${resp.content}
269     BuiltIn.Should Contain    ${resp.content}    ${ip}
270
271 TODO
272     Fail    "Not implemented"