This patch adds new test to phase3. The topology is the same as in phase1 simple_netperf test.
This tests covers performance of macsec over ethernet. Ping and netperf is run. Covered are both macsec options encrypt on and off.
Signed-off-by: Kamil Jerabek kjerabek@redhat.com --- .../regression_tests/phase3/simple_macsec.README | 90 +++++++ recipes/regression_tests/phase3/simple_macsec.py | 280 +++++++++++++++++++++ recipes/regression_tests/phase3/simple_macsec.xml | 37 +++ 3 files changed, 407 insertions(+) create mode 100644 recipes/regression_tests/phase3/simple_macsec.README create mode 100644 recipes/regression_tests/phase3/simple_macsec.py create mode 100644 recipes/regression_tests/phase3/simple_macsec.xml
diff --git a/recipes/regression_tests/phase3/simple_macsec.README b/recipes/regression_tests/phase3/simple_macsec.README new file mode 100644 index 0000000..571a659 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.README @@ -0,0 +1,90 @@ +Topology: + + switch + +------+ + | | + | | + +-------------+ +-------------+ + | | | | + | | | | + | +------+ | + | | + | | + +-+--+ +-+--+ ++-------|eth1|------+ +-------|eth1|------+ +| +-+--+ | | +-+--+ | +| | | | +| | | | +| | | | +| | | | +| | | | +| host1 | | host2 | +| | | | +| | | | +| | | | ++-------------------+ +-------------------+ + +Number of hosts: 2 +Host #1 description: + One ethernet device configured with ip address {$net}.1/24 + + Macsec interface configured with ip addresses: + 192.168.100.1/24 + fc00::1/64 + +Host #2 description: + One ethernet device configured with ip address {$net}.2/24 + + Macsec interface configured with ip addresses: + 192.168.100.2/24 + fc00::2/64 + +Test name: + simple_macsec.py +Test description: + Ping: + + count: 100 + + interval: 0.1s + + between physical interfaces expecting PASS + + between macsec interfaces expecting PASS + Ping6: + + count: 100 + + interval: 0.1s + + between macsec interfaces expecting PASS + Netperf: + + duration: 60s + + TCP_STREAM and UDP_STREAM + + ipv4 and ipv6 + + between physical interfaces + Macsec + + tested both encryption on and off + +PerfRepo integration: + First, preparation in PerfRepo is required - you need to create Test objects + through the web interface that properly describe the individual Netperf + tests that this recipe runs. Don't forget to also add appropriate metrics. + For these Netperf tests it's always: + * throughput + * throughput_min + * throughput_max + * throughput_deviation + + After that, to enable support for PerfRepo you need to create the file + vxlan_remote.mapping and define the following id mappings: + tcp_ipv4_id -> to store ipv4 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object + tcp_ipv6_id -> to store ipv6 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object + udp_ipv4_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object + udp_ipv6_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object + + To enable result comparison agains baselines you need to create a Report in + PerfRepo that will store the baseline. Set up the Report to only contain results + with the same hash tag and then add a new mapping to the mapping file, with + this format: + <some_hash> = <report_id> + + The hash value is automatically generated during test execution and added + to each result stored in PerfRepo. To get the Report id you need to open + that report in our browser and find if in the URL. + + When running this recipe you should also define the 'product_name' alias + (e.g. RHEL7) in order to tag the result object in PerfRepo. diff --git a/recipes/regression_tests/phase3/simple_macsec.py b/recipes/regression_tests/phase3/simple_macsec.py new file mode 100644 index 0000000..9cd9c56 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.py @@ -0,0 +1,280 @@ +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("machine1") +m2 = ctl.get_host("machine2") + +m1.sync_resources(modules=["IcmpPing", "Icmp6Ping", "Netperf"]) +m2.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_cpupin = ctl.get_alias("nperf_cpupin") +nperf_cpu_util = ctl.get_alias("nperf_cpu_util") +nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel")) +nperf_debug = ctl.get_alias("nperf_debug") +nperf_max_dev = ctl.get_alias("nperf_max_dev") +pr_user_comment = ctl.get_alias("perfrepo_comment") + +pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment) + +m1_phy = m1.get_interface("eth") +m2_phy = m2.get_interface("eth") + +m1_phy_name = m1_phy.get_devname() +m2_phy_name = m2_phy.get_devname() + +m1_phy_addr = m1_phy.get_ip() +m2_phy_addr = m2_phy.get_ip() + +m1_phy_hwaddr = m1_phy.get_hwaddr() +m2_phy_hwaddr = m2_phy.get_hwaddr() + +key1 = "7a16780284000775d4f0a3c0f0e092c0" +key2 = "3212ef5c4cc5d0e4210b17208e88779e" + +msec_tif_name = "macsec0" +m1_tif_addr = "192.168.100.1" +m2_tif_addr = "192.168.100.2" + +m1_tif_addr6 = "fc00::1" +m2_tif_addr6 = "fc00::2" + +#macsec setup +def macsecSetup(encryption): + m1.run("ip link add link %s %s type macsec encrypt %s" % + (m1_phy_name, msec_tif_name, encryption)) + m1.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m2_phy_hwaddr)) + m1.run("ip macsec add %s tx sa 0 pn 1 on key 00 %s" % (msec_tif_name, key1)) + m1.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 01 %s" % + (msec_tif_name, m2_phy_hwaddr, key2)) + + m2.run("ip link add link %s %s type macsec encrypt %s" % + (m2_phy_name, msec_tif_name, encryption)) + m2.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m1_phy_hwaddr)) + m2.run("ip macsec add %s tx sa 0 pn 1 on key 01 %s" % (msec_tif_name, key2)) + m2.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 00 %s" % + (msec_tif_name, m1_phy_hwaddr, key1)) + + m1.run("ip link set %s up" % msec_tif_name) + m2.run("ip link set %s up" % msec_tif_name) + + m1.run("ip addr add %s/24 dev %s" % (m1_tif_addr, msec_tif_name)) + m2.run("ip addr add %s/24 dev %s" % (m2_tif_addr, msec_tif_name)) + + m1.run("ip -6 addr add %s/64 dev %s" % (m1_tif_addr6, msec_tif_name)) + m2.run("ip -6 addr add %s/64 dev %s" % (m2_tif_addr6, msec_tif_name)) + + +if nperf_cpupin: + m1.run("service irqbalance stop") + m2.run("service irqbalance stop") + + dev_list = [(m1, m1_phy), (m2, m2_phy)] + + # this will pin devices irqs to cpu #0 + for m, d in dev_list: + pin_dev_irqs(m, d, 0) + +nperf_opts = "" +if nperf_cpupin and nperf_num_parallel == 1: + nperf_opts = " -T%s,%s" % (nperf_cpupin, nperf_cpupin) + +ctl.wait(15) + +ping_opts = {"count": 100, "interval": 0.1} + +encryption_settings = ['on', 'off'] + +for setting in encryption_settings: + #macsec setup + macsecSetup(setting) + m1_tif = m1.get_device(msec_tif_name) + m2_tif = m2.get_device(msec_tif_name) + + if ipv in [ 'ipv4', 'both' ]: + ping((m1, m1_tif, 0, {"scope": 0}), + (m2, m2_tif, 0, {"scope": 0}), + options=ping_opts) + + ctl.wait(2) + + ping((m1, m1_phy, 0, {"scope": 0}), + (m2, m2_phy, 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=[ + r'kernel_release', + r'redhat_release']) + result_tcp.add_tag(product_name) + if nperf_num_parallel > 1: + result_tcp.add_tag("multithreaded") + result_tcp.set_parameter('num_parallel', nperf_num_parallel) + + result_tcp.set_parameter('encryption', setting) + + baseline = perf_api.get_baseline_of_result(result_tcp) + baseline = perfrepo_baseline_to_dict(baseline) + + tcp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}), + (m2, m2_tif, 0, {"scope": 0}), + client_opts={"duration" : netperf_duration, + "testname" : "TCP_STREAM", + "confidence" : nperf_confidence, + "num_parallel" : nperf_num_parallel, + "cpu_util" : nperf_cpu_util, + "runs": nperf_max_runs, + "debug": nperf_debug, + "max_deviation": nperf_max_dev, + "netperf_opts": nperf_opts}, + 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=[ + r'kernel_release', + r'redhat_release']) + result_udp.add_tag(product_name) + if nperf_num_parallel > 1: + result_udp.add_tag("multithreaded") + result_udp.set_parameter('num_parallel', nperf_num_parallel) + + result_udp.set_parameter('encryption', setting) + + baseline = perf_api.get_baseline_of_result(result_udp) + baseline = perfrepo_baseline_to_dict(baseline) + + udp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}), + (m2, m2_tif, 0, {"scope": 0}), + client_opts={"duration" : netperf_duration, + "testname" : "UDP_STREAM", + "confidence" : nperf_confidence, + "num_parallel" : nperf_num_parallel, + "cpu_util" : nperf_cpu_util, + "runs": nperf_max_runs, + "debug": nperf_debug, + "max_deviation": nperf_max_dev, + "netperf_opts": nperf_opts}, + 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, m1_tif, 1, {"scope": 0}), + (m2, m2_tif, 1, {"scope": 0}), + options=ping_opts) + + ctl.wait(2) + + # prepare PerfRepo result for tcp ipv6 + result_tcp = perf_api.new_result("tcp_ipv6_id", + "tcp_ipv6_result", + hash_ignore=[ + r'kernel_release', + r'redhat_release']) + result_tcp.add_tag(product_name) + if nperf_num_parallel > 1: + result_tcp.add_tag("multithreaded") + result_tcp.set_parameter('num_parallel', nperf_num_parallel) + + result_tcp.set_parameter('encryption', setting) + + baseline = perf_api.get_baseline_of_result(result_tcp) + baseline = perfrepo_baseline_to_dict(baseline) + + tcp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}), + (m2, m2_tif, 1, {"scope": 0}), + client_opts={"duration" : netperf_duration, + "testname" : "TCP_STREAM", + "confidence" : nperf_confidence, + "num_parallel" : nperf_num_parallel, + "cpu_util" : nperf_cpu_util, + "runs": nperf_max_runs, + "debug": nperf_debug, + "max_deviation": nperf_max_dev, + "netperf_opts" : nperf_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=[ + r'kernel_release', + r'redhat_release']) + result_udp.add_tag(product_name) + if nperf_num_parallel > 1: + result_udp.add_tag("multithreaded") + result_udp.set_parameter('num_parallel', nperf_num_parallel) + + result_udp.set_parameter('encryption', setting) + + baseline = perf_api.get_baseline_of_result(result_udp) + baseline = perfrepo_baseline_to_dict(baseline) + + udp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}), + (m2, m2_tif, 1, {"scope": 0}), + client_opts={"duration" : netperf_duration, + "testname" : "UDP_STREAM", + "confidence" : nperf_confidence, + "num_parallel" : nperf_num_parallel, + "cpu_util" : nperf_cpu_util, + "runs": nperf_max_runs, + "debug": nperf_debug, + "max_deviation": nperf_max_dev, + "netperf_opts" : nperf_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) + + + m1.run("ip link delete %s" % msec_tif_name) + m2.run("ip link delete %s" % msec_tif_name) + +if nperf_cpupin: + m1.run("service irqbalance start") + m2.run("service irqbalance start") diff --git a/recipes/regression_tests/phase3/simple_macsec.xml b/recipes/regression_tests/phase3/simple_macsec.xml new file mode 100644 index 0000000..275db4a --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.xml @@ -0,0 +1,37 @@ +<lnstrecipe> + <define> + <alias name="ipv" value="both" /> + <alias name="mtu" value="1500" /> + <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="nperf_debug" value="0"/> + <alias name="nperf_max_dev" value="20%"/> + <alias name="mapping_file" value="simple_macsec.mapping" /> + <alias name="net" value="192.168.0" /> + </define> + <network> + <host id="machine1"> + <interfaces> + <eth id="eth" label="tnet"> + <addresses> + <address>{$net}.1/24</address> + </addresses> + </eth> + </interfaces> + </host> + <host id="machine2"> + <interfaces> + <eth id="eth" label="tnet"> + <addresses> + <address>{$net}.2/24</address> + </addresses> + </eth> + </interfaces> + </host> + </network> + <task python="simple_macsec.py"/> +</lnstrecipe>
On Mon, Sep 19, 2016 at 05:06:23PM +0200, Kamil Jerabek wrote:
This patch adds new test to phase3. The topology is the same as in phase1 simple_netperf test.
This tests covers performance of macsec over ethernet. Ping and netperf is run. Covered are both macsec options encrypt on and off.
Signed-off-by: Kamil Jerabek kjerabek@redhat.com
.../regression_tests/phase3/simple_macsec.README | 90 +++++++ recipes/regression_tests/phase3/simple_macsec.py | 280 +++++++++++++++++++++ recipes/regression_tests/phase3/simple_macsec.xml | 37 +++ 3 files changed, 407 insertions(+) create mode 100644 recipes/regression_tests/phase3/simple_macsec.README create mode 100644 recipes/regression_tests/phase3/simple_macsec.py create mode 100644 recipes/regression_tests/phase3/simple_macsec.xml
diff --git a/recipes/regression_tests/phase3/simple_macsec.README b/recipes/regression_tests/phase3/simple_macsec.README new file mode 100644 index 0000000..571a659 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.README @@ -0,0 +1,90 @@ +Topology:
switch
+------+
| |
| |
+-------------+ +-------------+
| | | |
| | | |
| +------+ |
| |
| |
+-+--+ +-+--+
++-------|eth1|------+ +-------|eth1|------+ +| +-+--+ | | +-+--+ | +| | | | +| | | | +| | | | +| | | | +| | | | +| host1 | | host2 | +| | | | +| | | | +| | | | ++-------------------+ +-------------------+
+Number of hosts: 2 +Host #1 description:
- One ethernet device configured with ip address {$net}.1/24
- Macsec interface configured with ip addresses:
- 192.168.100.1/24
- fc00::1/64
+Host #2 description:
- One ethernet device configured with ip address {$net}.2/24
- Macsec interface configured with ip addresses:
- 192.168.100.2/24
- fc00::2/64
+Test name:
- simple_macsec.py
+Test description:
- Ping:
- count: 100
- interval: 0.1s
- between physical interfaces expecting PASS
- between macsec interfaces expecting PASS
- Ping6:
- count: 100
- interval: 0.1s
- between macsec interfaces expecting PASS
Why is ping6 only on macsec intfaces when ping is for both the macsec and the physical interfaces? Should the eth ping be removed from IPv4 or should we add it to IPv6?
- Netperf:
- duration: 60s
- TCP_STREAM and UDP_STREAM
- ipv4 and ipv6
- between physical interfaces
^^^^^^^ you mean macsec?
- Macsec
- tested both encryption on and off
+PerfRepo integration:
- First, preparation in PerfRepo is required - you need to create Test objects
- through the web interface that properly describe the individual Netperf
- tests that this recipe runs. Don't forget to also add appropriate metrics.
- For these Netperf tests it's always:
- throughput
- throughput_min
- throughput_max
- throughput_deviation
- After that, to enable support for PerfRepo you need to create the file
- vxlan_remote.mapping and define the following id mappings:
- tcp_ipv4_id -> to store ipv4 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- tcp_ipv6_id -> to store ipv6 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv4_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv6_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- To enable result comparison agains baselines you need to create a Report in
- PerfRepo that will store the baseline. Set up the Report to only contain results
- with the same hash tag and then add a new mapping to the mapping file, with
- this format:
- <some_hash> = <report_id>
- The hash value is automatically generated during test execution and added
- to each result stored in PerfRepo. To get the Report id you need to open
- that report in our browser and find if in the URL.
- When running this recipe you should also define the 'product_name' alias
- (e.g. RHEL7) in order to tag the result object in PerfRepo.
diff --git a/recipes/regression_tests/phase3/simple_macsec.py b/recipes/regression_tests/phase3/simple_macsec.py new file mode 100644 index 0000000..9cd9c56 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.py @@ -0,0 +1,280 @@ +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("machine1") +m2 = ctl.get_host("machine2")
+m1.sync_resources(modules=["IcmpPing", "Icmp6Ping", "Netperf"]) +m2.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_cpupin = ctl.get_alias("nperf_cpupin") +nperf_cpu_util = ctl.get_alias("nperf_cpu_util") +nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel")) +nperf_debug = ctl.get_alias("nperf_debug") +nperf_max_dev = ctl.get_alias("nperf_max_dev") +pr_user_comment = ctl.get_alias("perfrepo_comment")
+pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment)
+m1_phy = m1.get_interface("eth") +m2_phy = m2.get_interface("eth")
+m1_phy_name = m1_phy.get_devname() +m2_phy_name = m2_phy.get_devname()
+m1_phy_addr = m1_phy.get_ip() +m2_phy_addr = m2_phy.get_ip()
+m1_phy_hwaddr = m1_phy.get_hwaddr() +m2_phy_hwaddr = m2_phy.get_hwaddr()
+key1 = "7a16780284000775d4f0a3c0f0e092c0" +key2 = "3212ef5c4cc5d0e4210b17208e88779e"
+msec_tif_name = "macsec0" +m1_tif_addr = "192.168.100.1" +m2_tif_addr = "192.168.100.2"
+m1_tif_addr6 = "fc00::1" +m2_tif_addr6 = "fc00::2"
+#macsec setup +def macsecSetup(encryption):
- m1.run("ip link add link %s %s type macsec encrypt %s" %
(m1_phy_name, msec_tif_name, encryption))
- m1.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m2_phy_hwaddr))
- m1.run("ip macsec add %s tx sa 0 pn 1 on key 00 %s" % (msec_tif_name, key1))
- m1.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 01 %s" %
(msec_tif_name, m2_phy_hwaddr, key2))
- m2.run("ip link add link %s %s type macsec encrypt %s" %
(m2_phy_name, msec_tif_name, encryption))
- m2.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m1_phy_hwaddr))
- m2.run("ip macsec add %s tx sa 0 pn 1 on key 01 %s" % (msec_tif_name, key2))
- m2.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 00 %s" %
(msec_tif_name, m1_phy_hwaddr, key1))
- m1.run("ip link set %s up" % msec_tif_name)
- m2.run("ip link set %s up" % msec_tif_name)
- m1.run("ip addr add %s/24 dev %s" % (m1_tif_addr, msec_tif_name))
- m2.run("ip addr add %s/24 dev %s" % (m2_tif_addr, msec_tif_name))
- m1.run("ip -6 addr add %s/64 dev %s" % (m1_tif_addr6, msec_tif_name))
- m2.run("ip -6 addr add %s/64 dev %s" % (m2_tif_addr6, msec_tif_name))
+if nperf_cpupin:
- m1.run("service irqbalance stop")
- m2.run("service irqbalance stop")
- dev_list = [(m1, m1_phy), (m2, m2_phy)]
- # this will pin devices irqs to cpu #0
- for m, d in dev_list:
pin_dev_irqs(m, d, 0)
+nperf_opts = "" +if nperf_cpupin and nperf_num_parallel == 1:
- nperf_opts = " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+ctl.wait(15)
+ping_opts = {"count": 100, "interval": 0.1}
+encryption_settings = ['on', 'off']
+for setting in encryption_settings:
- #macsec setup
- macsecSetup(setting)
- m1_tif = m1.get_device(msec_tif_name)
- m2_tif = m2.get_device(msec_tif_name)
- if ipv in [ 'ipv4', 'both' ]:
ping((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
ping((m1, m1_phy, 0, {"scope": 0}),
(m2, m2_phy, 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=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
# prepare PerfRepo result for tcp ipv6
result_tcp = perf_api.new_result("tcp_ipv6_id",
"tcp_ipv6_result",
hash_ignore=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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)
- m1.run("ip link delete %s" % msec_tif_name)
- m2.run("ip link delete %s" % msec_tif_name)
+if nperf_cpupin:
- m1.run("service irqbalance start")
- m2.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase3/simple_macsec.xml b/recipes/regression_tests/phase3/simple_macsec.xml new file mode 100644 index 0000000..275db4a --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.xml @@ -0,0 +1,37 @@ +<lnstrecipe>
<define>
<alias name="ipv" value="both" />
<alias name="mtu" value="1500" />
<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="nperf_debug" value="0"/>
<alias name="nperf_max_dev" value="20%"/>
<alias name="mapping_file" value="simple_macsec.mapping" />
<alias name="net" value="192.168.0" />
</define>
<network>
<host id="machine1">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.1/24</address>
</addresses>
</eth>
</interfaces>
</host>
<host id="machine2">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.2/24</address>
</addresses>
</eth>
</interfaces>
</host>
</network>
<task python="simple_macsec.py"/>
+</lnstrecipe>
2.5.5 _______________________________________________ LNST-developers mailing list -- lnst-developers@lists.fedorahosted.org To unsubscribe send an email to lnst-developers-leave@lists.fedorahosted.org
On Mon, Sep 19, 2016 at 05:06:23PM +0200, Kamil Jerabek wrote:
This patch adds new test to phase3. The topology is the same as in phase1 simple_netperf test.
This tests covers performance of macsec over ethernet. Ping and netperf is run. Covered are both macsec options encrypt on and off.
Signed-off-by: Kamil Jerabek kjerabek@redhat.com
.../regression_tests/phase3/simple_macsec.README | 90 +++++++ recipes/regression_tests/phase3/simple_macsec.py | 280 +++++++++++++++++++++ recipes/regression_tests/phase3/simple_macsec.xml | 37 +++ 3 files changed, 407 insertions(+) create mode 100644 recipes/regression_tests/phase3/simple_macsec.README create mode 100644 recipes/regression_tests/phase3/simple_macsec.py create mode 100644 recipes/regression_tests/phase3/simple_macsec.xml
diff --git a/recipes/regression_tests/phase3/simple_macsec.README b/recipes/regression_tests/phase3/simple_macsec.README new file mode 100644 index 0000000..571a659 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.README @@ -0,0 +1,90 @@ +Topology:
switch
+------+
| |
| |
+-------------+ +-------------+
| | | |
| | | |
| +------+ |
| |
| |
+-+--+ +-+--+
++-------|eth1|------+ +-------|eth1|------+ +| +-+--+ | | +-+--+ | +| | | | +| | | | +| | | | +| | | | +| | | | +| host1 | | host2 | +| | | | +| | | | +| | | | ++-------------------+ +-------------------+
+Number of hosts: 2 +Host #1 description:
- One ethernet device configured with ip address {$net}.1/24
- Macsec interface configured with ip addresses:
- 192.168.100.1/24
- fc00::1/64
+Host #2 description:
- One ethernet device configured with ip address {$net}.2/24
- Macsec interface configured with ip addresses:
- 192.168.100.2/24
- fc00::2/64
+Test name:
- simple_macsec.py
+Test description:
- Ping:
- count: 100
- interval: 0.1s
- between physical interfaces expecting PASS
- between macsec interfaces expecting PASS
- Ping6:
- count: 100
- interval: 0.1s
- between macsec interfaces expecting PASS
- Netperf:
- duration: 60s
- TCP_STREAM and UDP_STREAM
- ipv4 and ipv6
- between physical interfaces
- Macsec
- tested both encryption on and off
+PerfRepo integration:
- First, preparation in PerfRepo is required - you need to create Test objects
- through the web interface that properly describe the individual Netperf
- tests that this recipe runs. Don't forget to also add appropriate metrics.
- For these Netperf tests it's always:
- throughput
- throughput_min
- throughput_max
- throughput_deviation
- After that, to enable support for PerfRepo you need to create the file
- vxlan_remote.mapping and define the following id mappings:
- tcp_ipv4_id -> to store ipv4 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- tcp_ipv6_id -> to store ipv6 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv4_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv6_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- To enable result comparison agains baselines you need to create a Report in
- PerfRepo that will store the baseline. Set up the Report to only contain results
- with the same hash tag and then add a new mapping to the mapping file, with
- this format:
- <some_hash> = <report_id>
- The hash value is automatically generated during test execution and added
- to each result stored in PerfRepo. To get the Report id you need to open
- that report in our browser and find if in the URL.
- When running this recipe you should also define the 'product_name' alias
- (e.g. RHEL7) in order to tag the result object in PerfRepo.
diff --git a/recipes/regression_tests/phase3/simple_macsec.py b/recipes/regression_tests/phase3/simple_macsec.py new file mode 100644 index 0000000..9cd9c56 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.py @@ -0,0 +1,280 @@ +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("machine1") +m2 = ctl.get_host("machine2")
+m1.sync_resources(modules=["IcmpPing", "Icmp6Ping", "Netperf"]) +m2.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_cpupin = ctl.get_alias("nperf_cpupin") +nperf_cpu_util = ctl.get_alias("nperf_cpu_util") +nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel")) +nperf_debug = ctl.get_alias("nperf_debug") +nperf_max_dev = ctl.get_alias("nperf_max_dev") +pr_user_comment = ctl.get_alias("perfrepo_comment")
+pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment)
+m1_phy = m1.get_interface("eth") +m2_phy = m2.get_interface("eth")
+m1_phy_name = m1_phy.get_devname() +m2_phy_name = m2_phy.get_devname()
+m1_phy_addr = m1_phy.get_ip() +m2_phy_addr = m2_phy.get_ip()
+m1_phy_hwaddr = m1_phy.get_hwaddr() +m2_phy_hwaddr = m2_phy.get_hwaddr()
+key1 = "7a16780284000775d4f0a3c0f0e092c0" +key2 = "3212ef5c4cc5d0e4210b17208e88779e"
+msec_tif_name = "macsec0" +m1_tif_addr = "192.168.100.1" +m2_tif_addr = "192.168.100.2"
+m1_tif_addr6 = "fc00::1" +m2_tif_addr6 = "fc00::2"
+#macsec setup +def macsecSetup(encryption):
- m1.run("ip link add link %s %s type macsec encrypt %s" %
(m1_phy_name, msec_tif_name, encryption))
- m1.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m2_phy_hwaddr))
- m1.run("ip macsec add %s tx sa 0 pn 1 on key 00 %s" % (msec_tif_name, key1))
- m1.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 01 %s" %
(msec_tif_name, m2_phy_hwaddr, key2))
- m2.run("ip link add link %s %s type macsec encrypt %s" %
(m2_phy_name, msec_tif_name, encryption))
- m2.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m1_phy_hwaddr))
- m2.run("ip macsec add %s tx sa 0 pn 1 on key 01 %s" % (msec_tif_name, key2))
- m2.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 00 %s" %
(msec_tif_name, m1_phy_hwaddr, key1))
- m1.run("ip link set %s up" % msec_tif_name)
- m2.run("ip link set %s up" % msec_tif_name)
- m1.run("ip addr add %s/24 dev %s" % (m1_tif_addr, msec_tif_name))
- m2.run("ip addr add %s/24 dev %s" % (m2_tif_addr, msec_tif_name))
- m1.run("ip -6 addr add %s/64 dev %s" % (m1_tif_addr6, msec_tif_name))
- m2.run("ip -6 addr add %s/64 dev %s" % (m2_tif_addr6, msec_tif_name))
+if nperf_cpupin:
- m1.run("service irqbalance stop")
- m2.run("service irqbalance stop")
- dev_list = [(m1, m1_phy), (m2, m2_phy)]
- # this will pin devices irqs to cpu #0
- for m, d in dev_list:
pin_dev_irqs(m, d, 0)
+nperf_opts = "" +if nperf_cpupin and nperf_num_parallel == 1:
- nperf_opts = " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+ctl.wait(15)
+ping_opts = {"count": 100, "interval": 0.1}
+encryption_settings = ['on', 'off']
+for setting in encryption_settings:
- #macsec setup
- macsecSetup(setting)
- m1_tif = m1.get_device(msec_tif_name)
- m2_tif = m2.get_device(msec_tif_name)
- if ipv in [ 'ipv4', 'both' ]:
ping((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
ping((m1, m1_phy, 0, {"scope": 0}),
(m2, m2_phy, 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=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
# prepare PerfRepo result for tcp ipv6
result_tcp = perf_api.new_result("tcp_ipv6_id",
"tcp_ipv6_result",
hash_ignore=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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)
- m1.run("ip link delete %s" % msec_tif_name)
- m2.run("ip link delete %s" % msec_tif_name)
+if nperf_cpupin:
- m1.run("service irqbalance start")
- m2.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase3/simple_macsec.xml b/recipes/regression_tests/phase3/simple_macsec.xml new file mode 100644 index 0000000..275db4a --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.xml @@ -0,0 +1,37 @@ +<lnstrecipe>
<define>
<alias name="ipv" value="both" />
<alias name="mtu" value="1500" />
<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" />
^^^^^^^^^^ this is not used anymore, the value of nperf_num_parallel is used instead
<alias name="nperf_num_parallel" value="2" />
^^^ this should be '1' by default
<alias name="nperf_debug" value="0"/>
<alias name="nperf_max_dev" value="20%"/>
<alias name="mapping_file" value="simple_macsec.mapping" />
<alias name="net" value="192.168.0" />
</define>
<network>
<host id="machine1">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.1/24</address>
</addresses>
</eth>
</interfaces>
</host>
<host id="machine2">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.2/24</address>
</addresses>
</eth>
</interfaces>
</host>
</network>
<task python="simple_macsec.py"/>
+</lnstrecipe>
2.5.5 _______________________________________________ LNST-developers mailing list -- lnst-developers@lists.fedorahosted.org To unsubscribe send an email to lnst-developers-leave@lists.fedorahosted.org
On Mon, Sep 19, 2016 at 05:06:23PM +0200, Kamil Jerabek wrote:
This patch adds new test to phase3. The topology is the same as in phase1 simple_netperf test.
This tests covers performance of macsec over ethernet. Ping and netperf is run. Covered are both macsec options encrypt on and off.
Signed-off-by: Kamil Jerabek kjerabek@redhat.com
.../regression_tests/phase3/simple_macsec.README | 90 +++++++ recipes/regression_tests/phase3/simple_macsec.py | 280 +++++++++++++++++++++ recipes/regression_tests/phase3/simple_macsec.xml | 37 +++ 3 files changed, 407 insertions(+) create mode 100644 recipes/regression_tests/phase3/simple_macsec.README create mode 100644 recipes/regression_tests/phase3/simple_macsec.py create mode 100644 recipes/regression_tests/phase3/simple_macsec.xml
diff --git a/recipes/regression_tests/phase3/simple_macsec.README b/recipes/regression_tests/phase3/simple_macsec.README new file mode 100644 index 0000000..571a659 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.README @@ -0,0 +1,90 @@ +Topology:
switch
+------+
| |
| |
+-------------+ +-------------+
| | | |
| | | |
| +------+ |
| |
| |
+-+--+ +-+--+
++-------|eth1|------+ +-------|eth1|------+ +| +-+--+ | | +-+--+ | +| | | | +| | | | +| | | | +| | | | +| | | | +| host1 | | host2 | +| | | | +| | | | +| | | | ++-------------------+ +-------------------+
+Number of hosts: 2 +Host #1 description:
- One ethernet device configured with ip address {$net}.1/24
- Macsec interface configured with ip addresses:
- 192.168.100.1/24
- fc00::1/64
+Host #2 description:
- One ethernet device configured with ip address {$net}.2/24
- Macsec interface configured with ip addresses:
- 192.168.100.2/24
- fc00::2/64
+Test name:
- simple_macsec.py
+Test description:
- Ping:
- count: 100
- interval: 0.1s
- between physical interfaces expecting PASS
- between macsec interfaces expecting PASS
- Ping6:
- count: 100
- interval: 0.1s
- between macsec interfaces expecting PASS
- Netperf:
- duration: 60s
- TCP_STREAM and UDP_STREAM
- ipv4 and ipv6
- between physical interfaces
- Macsec
- tested both encryption on and off
+PerfRepo integration:
- First, preparation in PerfRepo is required - you need to create Test objects
- through the web interface that properly describe the individual Netperf
- tests that this recipe runs. Don't forget to also add appropriate metrics.
- For these Netperf tests it's always:
- throughput
- throughput_min
- throughput_max
- throughput_deviation
- After that, to enable support for PerfRepo you need to create the file
- vxlan_remote.mapping and define the following id mappings:
- tcp_ipv4_id -> to store ipv4 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- tcp_ipv6_id -> to store ipv6 TCP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv4_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- udp_ipv6_id -> to store ipv4 UDP_STREAM Netperf test results, maps to TestUid of a PerfRepo Test object
- To enable result comparison agains baselines you need to create a Report in
- PerfRepo that will store the baseline. Set up the Report to only contain results
- with the same hash tag and then add a new mapping to the mapping file, with
- this format:
- <some_hash> = <report_id>
- The hash value is automatically generated during test execution and added
- to each result stored in PerfRepo. To get the Report id you need to open
- that report in our browser and find if in the URL.
- When running this recipe you should also define the 'product_name' alias
- (e.g. RHEL7) in order to tag the result object in PerfRepo.
diff --git a/recipes/regression_tests/phase3/simple_macsec.py b/recipes/regression_tests/phase3/simple_macsec.py new file mode 100644 index 0000000..9cd9c56 --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.py @@ -0,0 +1,280 @@ +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("machine1") +m2 = ctl.get_host("machine2")
+m1.sync_resources(modules=["IcmpPing", "Icmp6Ping", "Netperf"]) +m2.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_cpupin = ctl.get_alias("nperf_cpupin") +nperf_cpu_util = ctl.get_alias("nperf_cpu_util") +nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel")) +nperf_debug = ctl.get_alias("nperf_debug") +nperf_max_dev = ctl.get_alias("nperf_max_dev") +pr_user_comment = ctl.get_alias("perfrepo_comment")
+pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment)
+m1_phy = m1.get_interface("eth") +m2_phy = m2.get_interface("eth")
+m1_phy_name = m1_phy.get_devname() +m2_phy_name = m2_phy.get_devname()
+m1_phy_addr = m1_phy.get_ip() +m2_phy_addr = m2_phy.get_ip()
+m1_phy_hwaddr = m1_phy.get_hwaddr() +m2_phy_hwaddr = m2_phy.get_hwaddr()
+key1 = "7a16780284000775d4f0a3c0f0e092c0" +key2 = "3212ef5c4cc5d0e4210b17208e88779e"
+msec_tif_name = "macsec0" +m1_tif_addr = "192.168.100.1" +m2_tif_addr = "192.168.100.2"
+m1_tif_addr6 = "fc00::1" +m2_tif_addr6 = "fc00::2"
+#macsec setup +def macsecSetup(encryption):
- m1.run("ip link add link %s %s type macsec encrypt %s" %
(m1_phy_name, msec_tif_name, encryption))
- m1.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m2_phy_hwaddr))
- m1.run("ip macsec add %s tx sa 0 pn 1 on key 00 %s" % (msec_tif_name, key1))
- m1.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 01 %s" %
(msec_tif_name, m2_phy_hwaddr, key2))
- m2.run("ip link add link %s %s type macsec encrypt %s" %
(m2_phy_name, msec_tif_name, encryption))
- m2.run("ip macsec add %s rx port 1 address %s" % (msec_tif_name, m1_phy_hwaddr))
- m2.run("ip macsec add %s tx sa 0 pn 1 on key 01 %s" % (msec_tif_name, key2))
- m2.run("ip macsec add %s rx port 1 address %s sa 0 pn 1 on key 00 %s" %
(msec_tif_name, m1_phy_hwaddr, key1))
- m1.run("ip link set %s up" % msec_tif_name)
- m2.run("ip link set %s up" % msec_tif_name)
- m1.run("ip addr add %s/24 dev %s" % (m1_tif_addr, msec_tif_name))
- m2.run("ip addr add %s/24 dev %s" % (m2_tif_addr, msec_tif_name))
- m1.run("ip -6 addr add %s/64 dev %s" % (m1_tif_addr6, msec_tif_name))
- m2.run("ip -6 addr add %s/64 dev %s" % (m2_tif_addr6, msec_tif_name))
+if nperf_cpupin:
- m1.run("service irqbalance stop")
- m2.run("service irqbalance stop")
- dev_list = [(m1, m1_phy), (m2, m2_phy)]
- # this will pin devices irqs to cpu #0
- for m, d in dev_list:
pin_dev_irqs(m, d, 0)
+nperf_opts = "" +if nperf_cpupin and nperf_num_parallel == 1:
- nperf_opts = " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+ctl.wait(15)
+ping_opts = {"count": 100, "interval": 0.1}
+encryption_settings = ['on', 'off']
+for setting in encryption_settings:
- #macsec setup
- macsecSetup(setting)
- m1_tif = m1.get_device(msec_tif_name)
- m2_tif = m2.get_device(msec_tif_name)
- if ipv in [ 'ipv4', 'both' ]:
ping((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
ping((m1, m1_phy, 0, {"scope": 0}),
(m2, m2_phy, 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=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 0, {"scope": 0}),
(m2, m2_tif, 0, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts": nperf_opts},
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, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
options=ping_opts)
ctl.wait(2)
# prepare PerfRepo result for tcp ipv6
result_tcp = perf_api.new_result("tcp_ipv6_id",
"tcp_ipv6_result",
hash_ignore=[
r'kernel_release',
r'redhat_release'])
result_tcp.add_tag(product_name)
if nperf_num_parallel > 1:
result_tcp.add_tag("multithreaded")
result_tcp.set_parameter('num_parallel', nperf_num_parallel)
result_tcp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_tcp)
baseline = perfrepo_baseline_to_dict(baseline)
tcp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "TCP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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=[
r'kernel_release',
r'redhat_release'])
result_udp.add_tag(product_name)
if nperf_num_parallel > 1:
result_udp.add_tag("multithreaded")
result_udp.set_parameter('num_parallel', nperf_num_parallel)
result_udp.set_parameter('encryption', setting)
baseline = perf_api.get_baseline_of_result(result_udp)
baseline = perfrepo_baseline_to_dict(baseline)
udp_res_data = netperf((m1, m1_tif, 1, {"scope": 0}),
(m2, m2_tif, 1, {"scope": 0}),
client_opts={"duration" : netperf_duration,
"testname" : "UDP_STREAM",
"confidence" : nperf_confidence,
"num_parallel" : nperf_num_parallel,
"cpu_util" : nperf_cpu_util,
"runs": nperf_max_runs,
"debug": nperf_debug,
"max_deviation": nperf_max_dev,
"netperf_opts" : nperf_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)
- m1.run("ip link delete %s" % msec_tif_name)
- m2.run("ip link delete %s" % msec_tif_name)
+if nperf_cpupin:
- m1.run("service irqbalance start")
- m2.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase3/simple_macsec.xml b/recipes/regression_tests/phase3/simple_macsec.xml new file mode 100644 index 0000000..275db4a --- /dev/null +++ b/recipes/regression_tests/phase3/simple_macsec.xml @@ -0,0 +1,37 @@ +<lnstrecipe>
<define>
<alias name="ipv" value="both" />
<alias name="mtu" value="1500" />
<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="nperf_debug" value="0"/>
<alias name="nperf_max_dev" value="20%"/>
<alias name="mapping_file" value="simple_macsec.mapping" />
<alias name="net" value="192.168.0" />
</define>
<network>
<host id="machine1">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.1/24</address>
</addresses>
</eth>
</interfaces>
</host>
<host id="machine2">
<interfaces>
<eth id="eth" label="tnet">
<addresses>
<address>{$net}.2/24</address>
</addresses>
</eth>
</interfaces>
</host>
</network>
<task python="simple_macsec.py"/>
+</lnstrecipe>
2.5.5 _______________________________________________ LNST-developers mailing list -- lnst-developers@lists.fedorahosted.org To unsubscribe send an email to lnst-developers-leave@lists.fedorahosted.org
one final thing... git is giving me this error about trailing whitespaces:
Applying: regression-tests: add simple_macsec test .git/rebase-apply/patch:45: trailing whitespace.
.git/rebase-apply/patch:49: trailing whitespace.
.git/rebase-apply/patch:185: trailing whitespace. m2.run("ip link add link %s %s type macsec encrypt %s" % .git/rebase-apply/patch:251: trailing whitespace.
warning: 4 lines add whitespace errors.
lnst-developers@lists.fedorahosted.org