From: Petr Machata <petrm(a)mellanox.com>
From: Petr Machata <petrm(a)mellanox.com>
Given two tunnels that share a bound device, test that when that device
is moved to another VRF, both tunnels are updated.
Signed-off-by: Petr Machata <petrm(a)mellanox.com>
---
recipes/switchdev/ipip-009-gre-migration-shared.py | 142 ++++++++++++++++++
.../switchdev/ipip-009-gre-migration-shared.xml | 166 +++++++++++++++++++++
2 files changed, 308 insertions(+)
create mode 100644 recipes/switchdev/ipip-009-gre-migration-shared.py
create mode 100644 recipes/switchdev/ipip-009-gre-migration-shared.xml
diff --git a/recipes/switchdev/ipip-009-gre-migration-shared.py
b/recipes/switchdev/ipip-009-gre-migration-shared.py
new file mode 100644
index 0000000..f09fda0
--- /dev/null
+++ b/recipes/switchdev/ipip-009-gre-migration-shared.py
@@ -0,0 +1,142 @@
+"""
+Copyright 2017 Mellanox Technologies. All rights reserved.
+Licensed under the GNU General Public License, version 2 as
+published by the Free Software Foundation; see COPYING for details.
+"""
+
+__author__ = """
+petrm(a)mellanox.com (Petr Machata)
+"""
+
+from lnst.Controller.Task import ctl
+from TestLib import TestLib, vrf, dummy, gre
+from ipip_common import ping_test, encap_route, \
+ add_forward_route, connect_host_ifaces, \
+ test_ip, ipv4, ipv6, refresh_addrs
+from time import sleep
+import logging
+
+def do_task(ctl, hosts, ifaces, aliases):
+ m1, m2, sw = hosts
+ (m1_if1_10, m1_if1_20,
+ m2_if1_10, m2_if1_20,
+ sw_if1_10, sw_if1_20,
+ sw_if2_10, sw_if2_20) = ifaces
+
+ m1_if1_10.add_nhs_route(ipv4(test_ip(2, 0)), [ipv4(test_ip(1, 1, []))])
+ m1_if1_10.add_nhs_route(ipv6(test_ip(2, 0)), [ipv6(test_ip(1, 1, []))])
+ m1_if1_20.add_nhs_route(ipv4(test_ip(4, 0)), [ipv4(test_ip(3, 1, []))])
+ m1_if1_20.add_nhs_route(ipv6(test_ip(4, 0)), [ipv6(test_ip(3, 1, []))])
+
+ vrf_None = None
+ tl = TestLib(ctl, aliases)
+
+ # - Test migration of several tunnels tied to a single dummy. Have a
+ # setup like below, and test end-to-end ping from 1.33 to 2.33, and
+ # lack of end-to-end ping from 3.33 to 4.33. Then migrate d to svu2
+ # and test that 2.33 doesn't ping anymore, but 4.33 now does.
+ #
+ # +-- M1 ------------+ +-- SW -----------------------------+
+ # | | | +-- svo ------------------------+ |
+ # | | | | sg1 1.2.3.4/31 | |
+ # | 1.33/24 +-|----|-|-+ 1.1/24 + | |
+ # | | | | | sg2 1.2.3.6/31 | |
+ # | 3.33/24 +-|----|-|-+ 3.1/24 | + | |
+ # +------------------+ | +-------------------------------+ |
+ # | | | |
+ # +-- M2 ------------+ | +-- svu1 -----------------------+ |
+ # | | | | \ / | |
+ # | 2.33/32 md1 + | | | \ / 1.2.3.4/32 | |
+ # | 1.2.3.5/31 mg1 + | | | + sd 1.2.3.6/32 | |
+ # | 99.2/24 +-|----|-|-+ 99.1/24 | |
+ # | | | | | |
+ # | | | +-------------------------------+ |
+ # | | | |
+ # | 4.33/32 md2 + | | +-- svu2 -----------------------+ |
+ # | 1.2.3.7/31 mg2 + | | | | |
+ # | 88.2/24 +-|----|-|-+ 88.1/24 | |
+ # | | | +-------------------------------+ |
+ # +------------------+ +-----------------------------------+
+
+ logging.info("--- Migrate bound device shared by several tunnels")
+ with vrf(sw) as svo, \
+ vrf(sw) as svu1, \
+ vrf(sw) as svu2, \
+ \
+ encap_route(m2, vrf_None, 1, "mg1", ip=ipv4), \
+ encap_route(m2, vrf_None, 1, "mg1", ip=ipv6), \
+ \
+ encap_route(m2, vrf_None, 3, "mg2", ip=ipv4), \
+ encap_route(m2, vrf_None, 3, "mg2", ip=ipv6), \
+ \
+ dummy(sw, svu1, ip=["1.2.3.4/32", "1.2.3.6/32"]) as sd, \
+ gre(sw, sd, svo,
+ tos="inherit",
+ local_ip="1.2.3.4",
+ remote_ip="1.2.3.5") as sg1, \
+ gre(sw, sd, svo,
+ tos="inherit",
+ local_ip="1.2.3.6",
+ remote_ip="1.2.3.7") as sg2, \
+ encap_route(sw, svo, 2, sg1, ip=ipv4), \
+ encap_route(sw, svo, 2, sg1, ip=ipv6), \
+ encap_route(sw, svo, 4, sg2, ip=ipv4), \
+ encap_route(sw, svo, 4, sg2, ip=ipv6):
+
+ connect_host_ifaces(sw, sw_if1_10, svo, sw_if2_10, svu1)
+ refresh_addrs(sw, sw_if1_10)
+ refresh_addrs(sw, sw_if2_10)
+
+ connect_host_ifaces(sw, sw_if1_20, svo, sw_if2_20, svu2)
+ refresh_addrs(sw, sw_if1_20)
+ refresh_addrs(sw, sw_if2_20)
+
+ add_forward_route(sw, svu1, "1.2.3.5", ipv4(test_ip(99, 2, [])))
+ add_forward_route(sw, svu2, "1.2.3.7", ipv4(test_ip(88, 2, [])))
+ add_forward_route(m2, vrf_None, "1.2.3.4", ipv4(test_ip(99, 1, [])))
+ add_forward_route(m2, vrf_None, "1.2.3.6", ipv4(test_ip(88, 1, [])))
+
+ def quick_test(tun1_ipv4_fail, tun1_ipv6_fail,
+ tun2_ipv4_fail, tun2_ipv6_fail):
+ sleep(5)
+ ping_test(tl, m1, sw, ipv6(test_ip(2, 33, [])), m1_if1_10, sg1,
+ count=25, fail_expected=tun1_ipv6_fail, ipv6=True)
+ ping_test(tl, m1, sw, ipv4(test_ip(2, 33, [])), m1_if1_10, sg1,
+ count=25, fail_expected=tun1_ipv4_fail)
+
+ ping_test(tl, m1, sw, ipv6(test_ip(4, 33, [])), m1_if1_20, None,
+ count=25, fail_expected=tun2_ipv6_fail, ipv6=True)
+ ping_test(tl, m1, sw, ipv4(test_ip(4, 33, [])), m1_if1_20, None,
+ count=25, fail_expected=tun2_ipv4_fail)
+
+ sleep(15)
+ quick_test(False, False, True, True)
+
+ sw.run("ip l s dev %s master %s" % (sd.get_devname(), svu2))
+ sleep(5)
+ quick_test(True, True, False, False)
+
+ sw.run("ip l s dev %s master %s" % (sd.get_devname(), svu1))
+ sleep(5)
+ quick_test(False, False, True, True)
+
+ sw.run("ip l s dev %s master %s" % (sd.get_devname(), svu2))
+ sleep(5)
+ quick_test(True, True, False, False)
+
+ sw.run("ip l s dev %s nomaster" % sd.get_devname())
+ sleep(5)
+ quick_test(True, True, True, True)
+
+do_task(ctl, [ctl.get_host("machine1"),
+ ctl.get_host("machine2"),
+ ctl.get_host("switch")],
+ [ctl.get_host("machine1").get_interface("if1.10"),
+ ctl.get_host("machine1").get_interface("if1.20"),
+ ctl.get_host("machine2").get_interface("if1.10"),
+ ctl.get_host("machine2").get_interface("if1.20"),
+ ctl.get_host("switch").get_interface("if1.10"),
+ ctl.get_host("switch").get_interface("if1.20"),
+ ctl.get_host("switch").get_interface("if2.10"),
+ ctl.get_host("switch").get_interface("if2.20")],
+ ctl.get_aliases())
diff --git a/recipes/switchdev/ipip-009-gre-migration-shared.xml
b/recipes/switchdev/ipip-009-gre-migration-shared.xml
new file mode 100644
index 0000000..680d2ae
--- /dev/null
+++ b/recipes/switchdev/ipip-009-gre-migration-shared.xml
@@ -0,0 +1,166 @@
+<lnstrecipe
xmlns:xi="http://www.w3.org/2003/XInclude">
+ <xi:include href="default_aliases.xml" />
+ <define>
+ <alias name="onet1" value="192.168.1"/>
+ <alias name="onet2" value="192.168.2"/>
+ <alias name="onet3" value="192.168.3"/>
+ <alias name="onet4" value="192.168.4"/>
+ <alias name="o6net1" value="2002:1"/>
+ <alias name="o6net2" value="2002:2"/>
+ <alias name="o6net3" value="2002:3"/>
+ <alias name="o6net4" value="2002:4"/>
+ <alias name="unet1" value="192.168.99"/>
+ <alias name="unet2" value="192.168.88"/>
+ </define>
+ <network>
+ <host id="machine1">
+ <params/>
+ <interfaces>
+ <eth id="if1" label="A" />
+
+ <vlan id="if1.10">
+ <options>
+ <option name="vlan_tci" value="10" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$onet1}.33/24" />
+ <address value="{$o6net1}::33/64" />
+ </addresses>
+ </vlan>
+
+ <vlan id="if1.20">
+ <options>
+ <option name="vlan_tci" value="20" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$onet3}.33/24" />
+ <address value="{$o6net3}::33/64" />
+ </addresses>
+ </vlan>
+ </interfaces>
+ </host>
+
+ <host id="machine2">
+ <params/>
+ <interfaces>
+ <eth id="if1" label="B" />
+
+ <vlan id="if1.10">
+ <options>
+ <option name="vlan_tci" value="10" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$unet1}.2/24" />
+ </addresses>
+ </vlan>
+ <dummy id="md1">
+ <addresses>
+ <address value="{$onet2}.33/32" />
+ <address value="{$o6net2}::33/128" />
+ </addresses>
+ </dummy>
+ <gre id="mg1">
+ <options>
+ <option name="local_ip"
value="1.2.3.5"/>
+ <option name="remote_ip"
value="1.2.3.4"/>
+ </options>
+ <addresses>
+ <address value="1.2.3.5/32" />
+ </addresses>
+ </gre>
+
+ <vlan id="if1.20">
+ <options>
+ <option name="vlan_tci" value="20" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$unet2}.2/24" />
+ </addresses>
+ </vlan>
+ <dummy id="md2">
+ <addresses>
+ <address value="{$onet4}.33/32" />
+ <address value="{$o6net4}::33/128" />
+ </addresses>
+ </dummy>
+ <gre id="mg2">
+ <options>
+ <option name="local_ip"
value="1.2.3.7"/>
+ <option name="remote_ip"
value="1.2.3.6"/>
+ </options>
+ <addresses>
+ <address value="1.2.3.7/32" />
+ </addresses>
+ </gre>
+ </interfaces>
+ </host>
+
+ <host id="switch">
+ <interfaces>
+ <eth id="if1" label="A" />
+ <vlan id="if1.10">
+ <options>
+ <option name="vlan_tci" value="10" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$onet1}.1/24" />
+ <address value="{$o6net1}::1/64" />
+ </addresses>
+ </vlan>
+ <vlan id="if1.20">
+ <options>
+ <option name="vlan_tci" value="20" />
+ </options>
+ <slaves>
+ <slave id="if1"/>
+ </slaves>
+ <addresses>
+ <address value="{$onet3}.1/24" />
+ <address value="{$o6net3}::1/64" />
+ </addresses>
+ </vlan>
+
+ <eth id="if2" label="B" />
+ <vlan id="if2.10">
+ <options>
+ <option name="vlan_tci" value="10" />
+ </options>
+ <slaves>
+ <slave id="if2"/>
+ </slaves>
+ <addresses>
+ <address value="{$unet1}.1/24" />
+ </addresses>
+ </vlan>
+ <vlan id="if2.20">
+ <options>
+ <option name="vlan_tci" value="20" />
+ </options>
+ <slaves>
+ <slave id="if2"/>
+ </slaves>
+ <addresses>
+ <address value="{$unet2}.1/24" />
+ </addresses>
+ </vlan>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="ipip-009-gre-migration-shared.py" />
+</lnstrecipe>
--
2.4.11