From: Ondrej Lichtner <olichtne(a)redhat.com>
This commit adds the first versions of 4 vxlan related recipes. Two of
these recipes:
vxlan_multicast.xml
vxlan_remote.xml
Are simple setups using 2 machines and the kernel VXLAN driver.
The other two:
2_virt_ovs_vxlan.xml
novirt_ovs_vxlan.xml
Uses two Open vSwitch bridges on 2 hosts and connects them through a
VXLAN tunnel using the OvS implementation. The first recipe also uses 4
more guest machines (2 per host) that are separated into two separate
vxlans. The second recipe doesn't use the guest machines and instead
uses internal ports of the OvS bridge.
All 4 recipes perform a TCP_STREAM and UDP_STREAM Netperf for both ipv4
and ipv6 addresses. Same goes for a simple ping check.
In addition to that, the 2_virt_ovs_vxlan recipe also performs all
possible pings between the guests and checks that the vxlan separation
is properly in place.
The recipes use features introduced in the commits directly preceding
this one and are therefore dependent on them. This is a first version of
the recipes, based on other regression_tests recipes, it's ready to be
tested on real hardware but needs further clenups and modifications
before actual deployment.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
.../regression_tests/phase3/2_virt_ovs_vxlan.py | 247 +++++++++++++++++++++
.../regression_tests/phase3/2_virt_ovs_vxlan.xml | 138 ++++++++++++
.../regression_tests/phase3/novirt_ovs_vxlan.py | 201 +++++++++++++++++
.../regression_tests/phase3/novirt_ovs_vxlan.xml | 86 +++++++
.../regression_tests/phase3/vxlan_multicast.xml | 66 ++++++
recipes/regression_tests/phase3/vxlan_remote.xml | 67 ++++++
recipes/regression_tests/phase3/vxlan_test.py | 247 +++++++++++++++++++++
7 files changed, 1052 insertions(+)
create mode 100644 recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
create mode 100644 recipes/regression_tests/phase3/2_virt_ovs_vxlan.xml
create mode 100644 recipes/regression_tests/phase3/novirt_ovs_vxlan.py
create mode 100644 recipes/regression_tests/phase3/novirt_ovs_vxlan.xml
create mode 100644 recipes/regression_tests/phase3/vxlan_multicast.xml
create mode 100644 recipes/regression_tests/phase3/vxlan_remote.xml
create mode 100644 recipes/regression_tests/phase3/vxlan_test.py
diff --git a/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
new file mode 100644
index 0000000..388b603
--- /dev/null
+++ b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.py
@@ -0,0 +1,247 @@
+from lnst.Controller.Task import ctl
+from lnst.Controller.PerfRepoUtils import perfrepo_baseline_to_dict
+from lnst.Controller.PerfRepoUtils import netperf_result_template
+
+from lnst.RecipeCommon.ModuleWrap import ping, ping6, netperf
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+from lnst.RecipeCommon.PerfRepo import generate_perfrepo_comment
+
+# ------
+# SETUP
+# ------
+
+mapping_file = ctl.get_alias("mapping_file")
+perf_api = ctl.connect_PerfRepo(mapping_file)
+
+product_name = ctl.get_alias("product_name")
+
+# hosts
+host1 = ctl.get_host("h1")
+host2 = ctl.get_host("h2")
+
+# guest machines
+guest1 = ctl.get_host("test_host1")
+guest2 = ctl.get_host("test_host2")
+guest3 = ctl.get_host("test_host3")
+guest4 = ctl.get_host("test_host4")
+
+for h in [guest1, guest2, guest3, guest4]:
+ h.sync_resources(modules=["IcmpPing", "Icmp6Ping",
"Netperf"])
+
+# ------
+# TESTS
+# ------
+
+ipv = ctl.get_alias("ipv")
+mtu = ctl.get_alias("mtu")
+netperf_duration = int(ctl.get_alias("netperf_duration"))
+nperf_reserve = int(ctl.get_alias("nperf_reserve"))
+nperf_confidence = ctl.get_alias("nperf_confidence")
+nperf_max_runs = int(ctl.get_alias("nperf_max_runs"))
+nperf_cpu_util = ctl.get_alias("nperf_cpu_util")
+nperf_mode = ctl.get_alias("nperf_mode")
+nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel"))
+pr_user_comment = ctl.get_alias("perfrepo_comment")
+
+pr_comment = generate_perfrepo_comment([guest1, guest2, guest3, guest4],
+ pr_user_comment)
+
+g1_nic = guest1.get_interface("if1")
+g2_nic = guest2.get_interface("if1")
+g3_nic = guest3.get_interface("if1")
+g4_nic = guest4.get_interface("if1")
+
+g1_nic.set_mtu(mtu)
+g2_nic.set_mtu(mtu)
+g3_nic.set_mtu(mtu)
+g4_nic.set_mtu(mtu)
+
+host1.run("service irqbalance stop")
+host2.run("service irqbalance stop")
+guest1.run("service irqbalance stop")
+guest2.run("service irqbalance stop")
+guest3.run("service irqbalance stop")
+guest4.run("service irqbalance stop")
+
+#this will pin devices irqs to cpu #0
+for m, d in [(guest1, g1_nic), (guest2, g2_nic), (guest3, g3_nic), (guest4, g4_nic)]:
+ pin_dev_irqs(m, d, 0)
+
+
+ctl.wait(15)
+
+#pings
+ping_opts = {"count": 100, "interval": 0.1}
+if ipv in ['ipv4', 'both']:
+ ping((guest1, g1_nic, 0),
+ (guest2, g2_nic, 0),
+ options=ping_opts, expect="fail")
+ ping((guest1, g1_nic, 0),
+ (guest3, g3_nic, 0),
+ options=ping_opts)
+ ping((guest1, g1_nic, 0),
+ (guest4, g4_nic, 0),
+ options=ping_opts, expect="fail")
+
+ ping((guest2, g2_nic, 0),
+ (guest3, g3_nic, 0),
+ options=ping_opts, expect="fail")
+ ping((guest2, g2_nic, 0),
+ (guest4, g4_nic, 0),
+ options=ping_opts)
+
+ ping((guest3, g3_nic, 0),
+ (guest4, g4_nic, 0),
+ options=ping_opts, expect="fail")
+
+if ipv in ['ipv6', 'both']:
+ ping6((guest1, g1_nic, 0),
+ (guest2, g2_nic, 1),
+ options=ping_opts, expect="fail")
+ ping6((guest1, g1_nic, 0),
+ (guest3, g3_nic, 1),
+ options=ping_opts)
+ ping6((guest1, g1_nic, 0),
+ (guest4, g4_nic, 1),
+ options=ping_opts, expect="fail")
+
+ ping6((guest2, g2_nic, 0),
+ (guest3, g3_nic, 1),
+ options=ping_opts, expect="fail")
+ ping6((guest2, g2_nic, 0),
+ (guest4, g4_nic, 1),
+ options=ping_opts)
+
+ ping6((guest3, g3_nic, 0),
+ (guest4, g4_nic, 1),
+ options=ping_opts, expect="fail")
+
+# if nperf_mode == "multi":
+ # netperf_cli_tcp.unset_option("confidence")
+ # netperf_cli_udp.unset_option("confidence")
+ # netperf_cli_tcp6.unset_option("confidence")
+ # netperf_cli_udp6.unset_option("confidence")
+
+ # netperf_cli_tcp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_tcp6.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp6.update_options({"num_parallel": nperf_num_parallel})
+
+
+if ipv in [ 'ipv4', 'both' ]:
+ # prepare PerfRepo result for tcp
+ result_tcp = perf_api.new_result("tcp_ipv4_id",
+ "tcp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((guest1, g1_nic, 0), (guest3, g3_nic, 0),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ # prepare PerfRepo result for udp
+ result_udp = perf_api.new_result("udp_ipv4_id",
+ "udp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((guest1, g1_nic, 0), (guest3, g3_nic, 0),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+if ipv in [ 'ipv6', 'both' ]:
+ # prepare PerfRepo result for tcp ipv6
+ result_tcp = perf_api.new_result("tcp_ipv6_id",
+ "tcp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((guest1, g1_nic, 1), (guest3, g3_nic, 1),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ #prepare PerfRepo result for udp ipv6
+ result_udp = perf_api.new_result("udp_ipv6_id",
+ "udp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((guest1, g1_nic, 1), (guest3, g3_nic, 1),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+
+host1.run("service irqbalance start")
+host2.run("service irqbalance start")
+guest1.run("service irqbalance start")
+guest2.run("service irqbalance start")
+guest3.run("service irqbalance start")
+guest4.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase3/2_virt_ovs_vxlan.xml
b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.xml
new file mode 100644
index 0000000..f34c67f
--- /dev/null
+++ b/recipes/regression_tests/phase3/2_virt_ovs_vxlan.xml
@@ -0,0 +1,138 @@
+<lnstrecipe>
+ <define>
+ <alias name="ipv" value="both" />
+ <alias name="mtu" value="1450" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5"/>
+ <alias name="nperf_mode" value="default"/>
+ <alias name="nperf_num_parallel" value="2"/>
+ <alias name="mapping_file"
value="2_virt_ovs_vxlan.mapping" />
+ <alias name="net" value="192.168.2"/>
+ <alias name="net6" value="fc00:0:0:0"/>
+ <alias name="vxlan_net" value="192.168.100"/>
+ </define>
+ <network>
+ <host id="h1">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <addresses>
+ <address value="{$vxlan_net}.1/24"/>
+ </addresses>
+ </eth>
+ <eth id="if2" label="to_guest1"/>
+ <eth id="if3" label="to_guest2"/>
+ <ovs_bridge id="ovs1">
+ <slaves>
+ <slave id="if2">
+ <options>
+ <option name="ofport_request"
value="5"/>
+ </options>
+ </slave>
+ <slave id="if3">
+ <options>
+ <option name="ofport_request"
value="6"/>
+ </options>
+ </slave>
+ </slaves>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="option:remote_ip"
value="{$vxlan_net}.2"/>
+ <option name="option:key"
value="flow"/>
+ <option name="ofport_request"
value="10"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+
<entry>table=0,in_port=5,actions=set_field:100->tun_id,output:10</entry>
+
<entry>table=0,in_port=6,actions=set_field:200->tun_id,output:10</entry>
+
<entry>table=0,in_port=10,tun_id=100,actions=output:5</entry>
+
<entry>table=0,in_port=10,tun_id=200,actions=output:6</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ <host id="test_host1">
+ <interfaces>
+ <eth id="if1" label="to_guest1">
+ <addresses>
+ <address value="{$net}.1/24"/>
+ <address value="{$net6}::1/64"/>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ <host id="test_host2">
+ <interfaces>
+ <eth id="if1" label="to_guest2">
+ <addresses>
+ <address value="{$net}.2/24"/>
+ <address value="{$net6}::2/64"/>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ <host id="h2">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <addresses>
+ <address value="{$vxlan_net}.2/24"/>
+ </addresses>
+ </eth>
+ <eth id="if2" label="to_guest3"/>
+ <eth id="if3" label="to_guest4"/>
+ <ovs_bridge id="ovs2">
+ <slaves>
+ <slave id="if2">
+ <options>
+ <option name="ofport_request"
value="5"/>
+ </options>
+ </slave>
+ <slave id="if3">
+ <options>
+ <option name="ofport_request"
value="6"/>
+ </options>
+ </slave>
+ </slaves>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="option:remote_ip"
value="{$vxlan_net}.1"/>
+ <option name="option:key"
value="flow"/>
+ <option name="ofport_request"
value="10"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+
<entry>table=0,in_port=5,actions=set_field:100->tun_id,output:10</entry>
+
<entry>table=0,in_port=6,actions=set_field:200->tun_id,output:10</entry>
+
<entry>table=0,in_port=10,tun_id=100,actions=output:5</entry>
+
<entry>table=0,in_port=10,tun_id=200,actions=output:6</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ <host id="test_host3">
+ <interfaces>
+ <eth id="if1" label="to_guest3">
+ <addresses>
+ <address value="{$net}.3/24"/>
+ <address value="{$net6}::3/64"/>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ <host id="test_host4">
+ <interfaces>
+ <eth id="if1" label="to_guest4">
+ <addresses>
+ <address value="{$net}.4/24"/>
+ <address value="{$net6}::4/64"/>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="2_virt_ovs_vxlan.py"/>
+</lnstrecipe>
diff --git a/recipes/regression_tests/phase3/novirt_ovs_vxlan.py
b/recipes/regression_tests/phase3/novirt_ovs_vxlan.py
new file mode 100644
index 0000000..6114bff
--- /dev/null
+++ b/recipes/regression_tests/phase3/novirt_ovs_vxlan.py
@@ -0,0 +1,201 @@
+from lnst.Controller.Task import ctl
+from lnst.Controller.PerfRepoUtils import perfrepo_baseline_to_dict
+from lnst.Controller.PerfRepoUtils import netperf_result_template
+
+from lnst.RecipeCommon.ModuleWrap import ping, ping6, netperf
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+from lnst.RecipeCommon.PerfRepo import generate_perfrepo_comment
+
+# ------
+# SETUP
+# ------
+
+mapping_file = ctl.get_alias("mapping_file")
+perf_api = ctl.connect_PerfRepo(mapping_file)
+
+product_name = ctl.get_alias("product_name")
+
+# test hosts
+h1 = ctl.get_host("test_host1")
+h2 = ctl.get_host("test_host2")
+
+for h in [h1, h2]:
+ h.sync_resources(modules=["IcmpPing", "Icmp6Ping",
"Netperf"])
+
+# ------
+# TESTS
+# ------
+
+ipv = ctl.get_alias("ipv")
+mtu = ctl.get_alias("mtu")
+netperf_duration = int(ctl.get_alias("netperf_duration"))
+nperf_reserve = int(ctl.get_alias("nperf_reserve"))
+nperf_confidence = ctl.get_alias("nperf_confidence")
+nperf_max_runs = int(ctl.get_alias("nperf_max_runs"))
+nperf_cpu_util = ctl.get_alias("nperf_cpu_util")
+nperf_mode = ctl.get_alias("nperf_mode")
+nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel"))
+pr_user_comment = ctl.get_alias("perfrepo_comment")
+
+pr_comment = generate_perfrepo_comment([h1, h2], pr_user_comment)
+
+h1_nic = h1.get_device("int0")
+h2_nic = h2.get_device("int0")
+
+h1_nic.set_mtu(mtu)
+h2_nic.set_mtu(mtu)
+
+h1.run("service irqbalance stop")
+h2.run("service irqbalance stop")
+
+# this will pin devices irqs to cpu #0
+for m, d in [(h1, h1_nic), (h2, h2_nic)]:
+ pin_dev_irqs(m, d, 0)
+
+# if nperf_mode == "multi":
+ # netperf_cli_tcp.unset_option("confidence")
+ # netperf_cli_udp.unset_option("confidence")
+ # netperf_cli_tcp6.unset_option("confidence")
+ # netperf_cli_udp6.unset_option("confidence")
+
+ # netperf_cli_tcp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_tcp6.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp6.update_options({"num_parallel": nperf_num_parallel})
+
+ctl.wait(15)
+
+#pings
+ping_opts = {"count": 100, "interval": 0.1}
+if ipv in [ 'ipv4', 'both' ]:
+ ping((h1, h1_nic, 0, {"scope": 0}),
+ (h2, h2_nic, 0, {"scope": 0}),
+ options=ping_opts)
+
+if ipv in [ 'ipv6', 'both' ]:
+ ping6((h1, h1_nic, 1, {"scope": 0}),
+ (h2, h2_nic, 1, {"scope": 0}),
+ options=ping_opts)
+
+#netperfs
+if ipv in [ 'ipv4', 'both' ]:
+ ctl.wait(2)
+
+ # prepare PerfRepo result for tcp
+ result_tcp = perf_api.new_result("tcp_ipv4_id",
+ "tcp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((h1, h1_nic, 0, {"scope": 0}),
+ (h2, h2_nic, 0, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ # prepare PerfRepo result for udp
+ result_udp = perf_api.new_result("udp_ipv4_id",
+ "udp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((h1, h1_nic, 0, {"scope": 0}),
+ (h2, h2_nic, 0, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+if ipv in [ 'ipv6', 'both' ]:
+ ctl.wait(2)
+
+ # prepare PerfRepo result for tcp ipv6
+ result_tcp = perf_api.new_result("tcp_ipv6_id",
+ "tcp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((h1, h1_nic, 1, {"scope": 0}),
+ (h2, h2_nic, 1, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ # prepare PerfRepo result for udp ipv6
+ result_udp = perf_api.new_result("udp_ipv6_id",
+ "udp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((h1, h1_nic, 1, {"scope": 0}),
+ (h2, h2_nic, 1, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+
+h1.run("service irqbalance start")
+h2.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase3/novirt_ovs_vxlan.xml
b/recipes/regression_tests/phase3/novirt_ovs_vxlan.xml
new file mode 100644
index 0000000..4f6c98d
--- /dev/null
+++ b/recipes/regression_tests/phase3/novirt_ovs_vxlan.xml
@@ -0,0 +1,86 @@
+<lnstrecipe>
+ <define>
+ <alias name="ipv" value="both" />
+ <alias name="mtu" value="1450" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5"/>
+ <alias name="nperf_mode" value="default"/>
+ <alias name="nperf_num_parallel" value="2"/>
+ <alias name="mapping_file"
value="novirt_ovs_vxlan.mapping" />
+ <alias name="net" value="192.168.2"/>
+ <alias name="net6" value="fc00:0:0:0"/>
+ <alias name="vxlan_net" value="192.168.100"/>
+ </define>
+ <network>
+ <host id="test_host1">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <addresses>
+ <address value="{$vxlan_net}.1/24"/>
+ </addresses>
+ </eth>
+ <ovs_bridge id="ovs1">
+ <internal id="int0">
+ <addresses>
+ <address value="{$net}.1/24"/>
+ <address value="{$net6}::1/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request"
value="5"/>
+ <option name="name" value="int0"/>
+ </options>
+ </internal>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="option:remote_ip"
value="{$vxlan_net}.2"/>
+ <option name="option:key"
value="flow"/>
+ <option name="ofport_request"
value="10"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+
<entry>table=0,in_port=5,actions=set_field:100->tun_id,output:10</entry>
+
<entry>table=0,in_port=10,tun_id=100,actions=output:5</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ <host id="test_host2">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <addresses>
+ <address value="{$vxlan_net}.2/24"/>
+ </addresses>
+ </eth>
+ <ovs_bridge id="ovs2">
+ <internal id="int0">
+ <options>
+ <option name="ofport_request"
value="5"/>
+ <option name="name" value="int0"/>
+ </options>
+ <addresses>
+ <address value="{$net}.2/24"/>
+ <address value="{$net6}::2/24"/>
+ </addresses>
+ </internal>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="option:remote_ip"
value="{$vxlan_net}.1"/>
+ <option name="option:key"
value="flow"/>
+ <option name="ofport_request"
value="10"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+
<entry>table=0,in_port=5,actions=set_field:100->tun_id,output:10</entry>
+
<entry>table=0,in_port=10,tun_id=100,actions=output:5</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="novirt_ovs_vxlan.py"/>
+</lnstrecipe>
diff --git a/recipes/regression_tests/phase3/vxlan_multicast.xml
b/recipes/regression_tests/phase3/vxlan_multicast.xml
new file mode 100644
index 0000000..bb603f1
--- /dev/null
+++ b/recipes/regression_tests/phase3/vxlan_multicast.xml
@@ -0,0 +1,66 @@
+<lnstrecipe>
+ <define>
+ <alias name="ipv" value="both" />
+ <alias name="mtu" value="1450" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5"/>
+ <alias name="nperf_mode" value="default"/>
+ <alias name="nperf_num_parallel" value="2"/>
+ <alias name="mapping_file" value="vxlan.mapping" />
+ <alias name="net" value="192.168.0"/>
+ <alias name="vxlan_net" value="192.168.100"/>
+ <alias name="vxlan_net6" value="fc01:0:0:0"/>
+ </define>
+ <network>
+ <host id="testmachine1">
+ <interfaces>
+ <eth id="eth" label="tnet">
+ <addresses>
+ <address value="{$net}.1/24" />
+ <address value="fc00:0:0:0::1/64"/>
+ </addresses>
+ </eth>
+ <vxlan id="test_if">
+ <options>
+ <option name="id" value="1"/>
+ <option name="group_ip"
value="239.1.1.1"/>
+ </options>
+ <slaves>
+ <slave id="eth"/>
+ </slaves>
+ <addresses>
+ <address value="{$vxlan_net}.1/24" />
+ <address value="{$vxlan_net6}::1/64" />
+ </addresses>
+ </vxlan>
+ </interfaces>
+ </host>
+ <host id="testmachine2">
+ <interfaces>
+ <eth id="eth" label="tnet">
+ <addresses>
+ <address value="{$net}.2/24" />
+ <address value="fc00:0:0:0::2/64"/>
+ </addresses>
+ </eth>
+ <vxlan id="test_if">
+ <options>
+ <option name="id" value="1"/>
+ <option name="group_ip"
value="239.1.1.1"/>
+ </options>
+ <slaves>
+ <slave id="eth"/>
+ </slaves>
+ <addresses>
+ <address value="{$vxlan_net}.2/24" />
+ <address value="{$vxlan_net6}::2/64" />
+ </addresses>
+ </vxlan>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="vxlan_test.py" />
+</lnstrecipe>
diff --git a/recipes/regression_tests/phase3/vxlan_remote.xml
b/recipes/regression_tests/phase3/vxlan_remote.xml
new file mode 100644
index 0000000..d04dee2
--- /dev/null
+++ b/recipes/regression_tests/phase3/vxlan_remote.xml
@@ -0,0 +1,67 @@
+<lnstrecipe>
+ <define>
+ <alias name="ipv" value="both" />
+ <alias name="mtu" value="1450" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5"/>
+ <alias name="nperf_mode" value="default"/>
+ <alias name="nperf_num_parallel" value="2"/>
+ <alias name="mapping_file" value="vxlan_remote.mapping"
/>
+ <alias name="net" value="192.168.0"/>
+ <alias name="net6" value="fc00:0:0:0"/>
+ <alias name="vxlan_net" value="192.168.100"/>
+ <alias name="vxlan_net6" value="fc01:0:0:0"/>
+ </define>
+ <network>
+ <host id="testmachine1">
+ <interfaces>
+ <eth id="eth" label="tnet">
+ <addresses>
+ <address value="{$net}.1/24" />
+ <address value="{$net6}::1/64"/>
+ </addresses>
+ </eth>
+ <vxlan id="test_if">
+ <options>
+ <option name="id" value="1"/>
+ <option name="remote_ip"
value="{$net}.2"/>
+ </options>
+ <slaves>
+ <slave id="eth"/>
+ </slaves>
+ <addresses>
+ <address value="{$vxlan_net}.1/24" />
+ <address value="{$vxlan_net6}::1/64" />
+ </addresses>
+ </vxlan>
+ </interfaces>
+ </host>
+ <host id="testmachine2">
+ <interfaces>
+ <eth id="eth" label="tnet">
+ <addresses>
+ <address value="{$net}.2/24" />
+ <address value="fc00:0:0:0::2/64"/>
+ </addresses>
+ </eth>
+ <vxlan id="test_if">
+ <options>
+ <option name="id" value="1"/>
+ <option name="remote_ip"
value="{$net}.1"/>
+ </options>
+ <slaves>
+ <slave id="eth"/>
+ </slaves>
+ <addresses>
+ <address value="{$vxlan_net}.2/24" />
+ <address value="{$vxlan_net6}::2/64" />
+ </addresses>
+ </vxlan>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="vxlan_test.py" />
+</lnstrecipe>
diff --git a/recipes/regression_tests/phase3/vxlan_test.py
b/recipes/regression_tests/phase3/vxlan_test.py
new file mode 100644
index 0000000..f96fc46
--- /dev/null
+++ b/recipes/regression_tests/phase3/vxlan_test.py
@@ -0,0 +1,247 @@
+from lnst.Controller.Task import ctl
+from lnst.Controller.PerfRepoUtils import perfrepo_baseline_to_dict
+from lnst.Controller.PerfRepoUtils import netperf_result_template
+
+from lnst.RecipeCommon.ModuleWrap import ping, ping6, netperf
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+from lnst.RecipeCommon.PerfRepo import generate_perfrepo_comment
+
+# ------
+# SETUP
+# ------
+
+mapping_file = ctl.get_alias("mapping_file")
+perf_api = ctl.connect_PerfRepo(mapping_file)
+
+product_name = ctl.get_alias("product_name")
+
+m1 = ctl.get_host("testmachine1")
+m2 = ctl.get_host("testmachine2")
+
+m1.sync_resources(modules=["IcmpPing", "Icmp6Ping",
"Netperf"])
+m2.sync_resources(modules=["IcmpPing", "Icmp6Ping",
"Netperf"])
+
+
+# ------
+# TESTS
+# ------
+
+# offloads = ["gro", "gso", "tso", "tx",
"rx"]
+# offload_settings = [ [("gro", "on"), ("gso",
"on"), ("tso", "on"), ("tx", "on"),
("rx", "on")],
+ # [("gro", "off"), ("gso",
"on"), ("tso", "on"), ("tx", "on"),
("rx", "on")],
+ # [("gro", "on"), ("gso",
"off"), ("tso", "off"), ("tx", "on"),
("rx", "on")],
+ # [("gro", "on"), ("gso",
"on"), ("tso", "off"), ("tx", "off"),
("rx", "on")],
+ # [("gro", "on"), ("gso",
"on"), ("tso", "on"), ("tx", "on"),
("rx", "off")]]
+
+ipv = ctl.get_alias("ipv")
+mtu = ctl.get_alias("mtu")
+netperf_duration = int(ctl.get_alias("netperf_duration"))
+nperf_reserve = int(ctl.get_alias("nperf_reserve"))
+nperf_confidence = ctl.get_alias("nperf_confidence")
+nperf_max_runs = int(ctl.get_alias("nperf_max_runs"))
+nperf_cpupin = ctl.get_alias("nperf_cpupin")
+nperf_cpu_util = ctl.get_alias("nperf_cpu_util")
+nperf_mode = ctl.get_alias("nperf_mode")
+nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel"))
+pr_user_comment = ctl.get_alias("perfrepo_comment")
+
+pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment)
+
+test_if1 = m1.get_interface("test_if")
+test_if1.set_mtu(mtu)
+test_if2 = m2.get_interface("test_if")
+test_if2.set_mtu(mtu)
+
+if nperf_cpupin:
+ m1.run("service irqbalance stop")
+ m2.run("service irqbalance stop")
+
+ m1_phy1 = m1.get_interface("eth1")
+ m1_phy2 = m1.get_interface("eth2")
+ dev_list = [(m1, m1_phy1), (m1, m1_phy2)]
+
+ if test_if2.get_type() == "bond":
+ m2_phy1 = m2.get_interface("eth1")
+ m2_phy2 = m2.get_interface("eth2")
+ dev_list.extend([(m2, m2_phy1), (m2, m2_phy2)])
+ else:
+ dev_list.append((m2, test_if2))
+
+ # this will pin devices irqs to cpu #0
+ for m, d in dev_list:
+ pin_dev_irqs(m, d, 0)
+
+# p_opts = "-L %s" % (test_if2.get_ip(0))
+# if nperf_cpupin and nperf_mode != "multi":
+ # p_opts += " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+
+# p_opts6 = "-L %s -6" % (test_if2.get_ip(1))
+# if nperf_cpupin and nperf_mode != "multi":
+ # p_opts6 += " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+
+# if nperf_mode == "multi":
+ # netperf_cli_tcp.unset_option("confidence")
+ # netperf_cli_udp.unset_option("confidence")
+ # netperf_cli_tcp6.unset_option("confidence")
+ # netperf_cli_udp6.unset_option("confidence")
+
+ # netperf_cli_tcp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_tcp6.update_options({"num_parallel": nperf_num_parallel})
+ # netperf_cli_udp6.update_options({"num_parallel": nperf_num_parallel})
+
+ctl.wait(15)
+
+ping_opts = {"count": 100, "interval": 0.1}
+
+# for setting in offload_settings:
+ # dev_features = ""
+ # for offload in setting:
+ # dev_features += " %s %s" % (offload[0], offload[1])
+ # m1.run("ethtool -K %s %s" % (test_if1.get_devname(), dev_features))
+ # m2.run("ethtool -K %s %s" % (test_if2.get_devname(), dev_features))
+
+if ipv in [ 'ipv4', 'both' ]:
+ ping((m1, test_if1, 0, {"scope": 0}),
+ (m2, test_if2, 0, {"scope": 0}),
+ options=ping_opts)
+
+ ctl.wait(2)
+
+ # prepare PerfRepo result for tcp
+ result_tcp = perf_api.new_result("tcp_ipv4_id",
+ "tcp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ # for offload in setting:
+ # result_tcp.set_parameter(offload[0], offload[1])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((m1, test_if1, 0, {"scope": 0}),
+ (m2, test_if2, 0, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ # prepare PerfRepo result for udp
+ result_udp = perf_api.new_result("udp_ipv4_id",
+ "udp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ # for offload in setting:
+ # result_udp.set_parameter(offload[0], offload[1])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((m1, test_if1, 0, {"scope": 0}),
+ (m2, test_if2, 0, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+
+if ipv in [ 'ipv6', 'both' ]:
+ ping6((m1, test_if1, 1, {"scope": 0}),
+ (m2, test_if2, 1, {"scope": 0}),
+ options=ping_opts)
+
+ # prepare PerfRepo result for tcp ipv6
+ result_tcp = perf_api.new_result("tcp_ipv6_id",
+ "tcp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ # for offload in setting:
+ # result_tcp.set_parameter(offload[0], offload[1])
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ tcp_res_data = netperf((m1, test_if1, 1, {"scope": 0}),
+ (m2, test_if2, 1, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ result_tcp.set_comment(pr_comment)
+ perf_api.save_result(result_tcp)
+
+ # prepare PerfRepo result for udp ipv6
+ result_udp = perf_api.new_result("udp_ipv6_id",
+ "udp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ # for offload in setting:
+ # result_udp.set_parameter(offload[0], offload[1])
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter('num_parallel', nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ baseline = perfrepo_baseline_to_dict(baseline)
+
+ udp_res_data = netperf((m1, test_if1, 1, {"scope": 0}),
+ (m2, test_if2, 1, {"scope": 0}),
+ client_opts={"duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "netperf_opts" : "-6"},
+ baseline = baseline,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ result_udp.set_comment(pr_comment)
+ perf_api.save_result(result_udp)
+
+#reset offload states
+# dev_features = ""
+# for offload in offloads:
+ # dev_features += " %s %s" % (offload, "on")
+# m1.run("ethtool -K %s %s" % (test_if1.get_devname(), dev_features))
+# m2.run("ethtool -K %s %s" % (test_if2.get_devname(), dev_features))
+
+if nperf_cpupin:
+ m1.run("service irqbalance start")
+ m2.run("service irqbalance start")
--
2.8.2