[PATCH] Utils: allow non-secure md5 use
by Jan Tluka
This will fix the issue with LNST on FIPS enabled system. FIPS does not allow
use of md5. Python's hashlib has a parameter that can be used to allow use of
md5 for non-security purpose. LNST uses md5 for caching test modules and tools
only.
Tested both with python2.6 and python2.7
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Common/Utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lnst/Common/Utils.py b/lnst/Common/Utils.py
index d6d6c57..1a7c926 100644
--- a/lnst/Common/Utils.py
+++ b/lnst/Common/Utils.py
@@ -98,7 +98,7 @@ def bool_it(val):
return True if int_it(val) else False
def md5sum(file_path, block_size=2**20):
- md5 = hashlib.md5()
+ md5 = hashlib.md5(usedforsecurity=False)
with open(file_path, "rb") as f:
while True:
data = f.read(block_size)
--
2.7.5
6 years, 3 months
[PATCH] recipes/tunnels: add VXLAN/Geneve tests
by Jiri Prochazka
This patch adds new test for testing VXLAN or Geneve tunnels. The test
scenario consists of two baremetal hosts, each with one NIC. On both
hosts, there is an OVS bridge, where number of internal devices are
created along with the same number of VXLAN/Geneve interfaces. The
number is set in the task in TUNNEL_COUNT variable. This variable is set
to 16 by default. Netperf is run in parallel over each tunnel and over each
tunnel number of STREAM are run in parallel in order to maximize link
utilization. This number is specified with nperf_num_parallel alias and is set
to 4 by default.
The result throughputs are then summarized and displayed with Custom module.
This is temporary solution before we implement more complex parallel netperf in
LNST test module.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
recipes/tunnels/ovs_geneve.xml | 727 +++++++++++++++++++++++++++++++++++++++++
recipes/tunnels/ovs_tunnels.py | 170 ++++++++++
recipes/tunnels/ovs_vxlan.xml | 727 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 1624 insertions(+)
create mode 100644 recipes/tunnels/ovs_geneve.xml
create mode 100644 recipes/tunnels/ovs_tunnels.py
create mode 100644 recipes/tunnels/ovs_vxlan.xml
diff --git a/recipes/tunnels/ovs_geneve.xml b/recipes/tunnels/ovs_geneve.xml
new file mode 100644
index 0000000..d3ada78
--- /dev/null
+++ b/recipes/tunnels/ovs_geneve.xml
@@ -0,0 +1,727 @@
+<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_num_parallel" value="4"/>
+ <alias name="nperf_debug" value="0"/>
+ <alias name="nperf_max_dev" value="20%"/>
+ <alias name="nperf_protocols" value="tcp udp"/>
+ <alias name="mapping_file" value="novirt_ovs_geneve.mapping" />
+ <alias name="net" value="192.168.2"/>
+ <alias name="geneve_net" value="192.168.111"/>
+ <alias name="geneve_net6" value="fc00:0:0:0"/>
+ <alias name="driver" value=""/>
+ </define>
+ <network>
+ <host id="test_host1">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <params>
+ <param name="driver" value="{$driver}"/>
+ </params>
+ <addresses>
+ <address value="{$net}.1/24"/>
+ <address value="{$net}.2/24"/>
+ <address value="{$net}.3/24"/>
+ <address value="{$net}.4/24"/>
+ <address value="{$net}.5/24"/>
+ <address value="{$net}.6/24"/>
+ <address value="{$net}.7/24"/>
+ <address value="{$net}.8/24"/>
+ <address value="{$net}.9/24"/>
+ <address value="{$net}.10/24"/>
+ <address value="{$net}.11/24"/>
+ <address value="{$net}.12/24"/>
+ <address value="{$net}.13/24"/>
+ <address value="{$net}.14/24"/>
+ <address value="{$net}.15/24"/>
+ <address value="{$net}.16/24"/>
+ </addresses>
+ </eth>
+ <ovs_bridge id="ovs1">
+ <internal id="int0">
+ <addresses>
+ <address value="{$geneve_net}.1/24"/>
+ <address value="{$geneve_net6}::1/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="5"/>
+ <option name="name" value="int0"/>
+ </options>
+ </internal>
+ <internal id="int1">
+ <addresses>
+ <address value="{$geneve_net}.2/24"/>
+ <address value="{$geneve_net6}::2/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="6"/>
+ <option name="name" value="int1"/>
+ </options>
+ </internal>
+ <internal id="int2">
+ <addresses>
+ <address value="{$geneve_net}.3/24"/>
+ <address value="{$geneve_net6}::3/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="7"/>
+ <option name="name" value="int2"/>
+ </options>
+ </internal>
+ <internal id="int3">
+ <addresses>
+ <address value="{$geneve_net}.4/24"/>
+ <address value="{$geneve_net6}::4/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="8"/>
+ <option name="name" value="int3"/>
+ </options>
+ </internal>
+ <internal id="int4">
+ <addresses>
+ <address value="{$geneve_net}.5/24"/>
+ <address value="{$geneve_net6}::5/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="9"/>
+ <option name="name" value="int4"/>
+ </options>
+ </internal>
+ <internal id="int5">
+ <addresses>
+ <address value="{$geneve_net}.6/24"/>
+ <address value="{$geneve_net6}::6/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="10"/>
+ <option name="name" value="int5"/>
+ </options>
+ </internal>
+ <internal id="int6">
+ <addresses>
+ <address value="{$geneve_net}.7/24"/>
+ <address value="{$geneve_net6}::7/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="11"/>
+ <option name="name" value="int6"/>
+ </options>
+ </internal>
+ <internal id="int7">
+ <addresses>
+ <address value="{$geneve_net}.8/24"/>
+ <address value="{$geneve_net6}::8/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="12"/>
+ <option name="name" value="int7"/>
+ </options>
+ </internal>
+ <internal id="int8">
+ <addresses>
+ <address value="{$geneve_net}.9/24"/>
+ <address value="{$geneve_net6}::9/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="13"/>
+ <option name="name" value="int8"/>
+ </options>
+ </internal>
+ <internal id="int9">
+ <addresses>
+ <address value="{$geneve_net}.10/24"/>
+ <address value="{$geneve_net6}::10/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="14"/>
+ <option name="name" value="int9"/>
+ </options>
+ </internal>
+ <internal id="int10">
+ <addresses>
+ <address value="{$geneve_net}.11/24"/>
+ <address value="{$geneve_net6}::11/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="15"/>
+ <option name="name" value="int10"/>
+ </options>
+ </internal>
+ <internal id="int11">
+ <addresses>
+ <address value="{$geneve_net}.12/24"/>
+ <address value="{$geneve_net6}::12/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="16"/>
+ <option name="name" value="int11"/>
+ </options>
+ </internal>
+ <internal id="int12">
+ <addresses>
+ <address value="{$geneve_net}.13/24"/>
+ <address value="{$geneve_net6}::13/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="17"/>
+ <option name="name" value="int12"/>
+ </options>
+ </internal>
+ <internal id="int13">
+ <addresses>
+ <address value="{$geneve_net}.14/24"/>
+ <address value="{$geneve_net6}::14/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="18"/>
+ <option name="name" value="int13"/>
+ </options>
+ </internal>
+ <internal id="int14">
+ <addresses>
+ <address value="{$geneve_net}.15/24"/>
+ <address value="{$geneve_net6}::15/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="19"/>
+ <option name="name" value="int14"/>
+ </options>
+ </internal>
+ <internal id="int15">
+ <addresses>
+ <address value="{$geneve_net}.16/24"/>
+ <address value="{$geneve_net6}::16/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="20"/>
+ <option name="name" value="int15"/>
+ </options>
+ </internal>
+ <tunnel id="geneve1" type="geneve">
+ <options>
+ <option name="name" value="geneve1"/>
+ <option name="option:remote_ip" value="{$net}.20"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="30"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve2" type="geneve">
+ <options>
+ <option name="name" value="geneve2"/>
+ <option name="option:remote_ip" value="{$net}.21"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="31"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve3" type="geneve">
+ <options>
+ <option name="name" value="geneve3"/>
+ <option name="option:remote_ip" value="{$net}.22"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="32"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve4" type="geneve">
+ <options>
+ <option name="name" value="geneve4"/>
+ <option name="option:remote_ip" value="{$net}.23"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="33"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve5" type="geneve">
+ <options>
+ <option name="name" value="geneve5"/>
+ <option name="option:remote_ip" value="{$net}.24"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="34"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve6" type="geneve">
+ <options>
+ <option name="name" value="geneve6"/>
+ <option name="option:remote_ip" value="{$net}.25"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="35"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve7" type="geneve">
+ <options>
+ <option name="name" value="geneve7"/>
+ <option name="option:remote_ip" value="{$net}.26"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="36"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve8" type="geneve">
+ <options>
+ <option name="name" value="geneve8"/>
+ <option name="option:remote_ip" value="{$net}.27"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="37"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve9" type="geneve">
+ <options>
+ <option name="name" value="geneve9"/>
+ <option name="option:remote_ip" value="{$net}.28"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="38"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve10" type="geneve">
+ <options>
+ <option name="name" value="geneve10"/>
+ <option name="option:remote_ip" value="{$net}.29"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="39"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve11" type="geneve">
+ <options>
+ <option name="name" value="geneve11"/>
+ <option name="option:remote_ip" value="{$net}.30"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="40"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve12" type="geneve">
+ <options>
+ <option name="name" value="geneve12"/>
+ <option name="option:remote_ip" value="{$net}.31"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="41"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve13" type="geneve">
+ <options>
+ <option name="name" value="geneve13"/>
+ <option name="option:remote_ip" value="{$net}.32"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="42"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve14" type="geneve">
+ <options>
+ <option name="name" value="geneve14"/>
+ <option name="option:remote_ip" value="{$net}.33"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="43"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve15" type="geneve">
+ <options>
+ <option name="name" value="geneve15"/>
+ <option name="option:remote_ip" value="{$net}.34"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="44"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve16" type="geneve">
+ <options>
+ <option name="name" value="geneve16"/>
+ <option name="option:remote_ip" value="{$net}.35"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="45"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+ <entry>table=0,in_port=5,actions=set_field:100->tun_id,output:30</entry>
+ <entry>table=0,in_port=6,actions=set_field:100->tun_id,output:31</entry>
+ <entry>table=0,in_port=7,actions=set_field:100->tun_id,output:32</entry>
+ <entry>table=0,in_port=8,actions=set_field:100->tun_id,output:33</entry>
+ <entry>table=0,in_port=9,actions=set_field:100->tun_id,output:34</entry>
+ <entry>table=0,in_port=10,actions=set_field:100->tun_id,output:35</entry>
+ <entry>table=0,in_port=11,actions=set_field:100->tun_id,output:36</entry>
+ <entry>table=0,in_port=12,actions=set_field:100->tun_id,output:37</entry>
+ <entry>table=0,in_port=13,actions=set_field:100->tun_id,output:38</entry>
+ <entry>table=0,in_port=14,actions=set_field:100->tun_id,output:39</entry>
+ <entry>table=0,in_port=15,actions=set_field:100->tun_id,output:40</entry>
+ <entry>table=0,in_port=16,actions=set_field:100->tun_id,output:41</entry>
+ <entry>table=0,in_port=17,actions=set_field:100->tun_id,output:42</entry>
+ <entry>table=0,in_port=18,actions=set_field:100->tun_id,output:43</entry>
+ <entry>table=0,in_port=19,actions=set_field:100->tun_id,output:44</entry>
+ <entry>table=0,in_port=20,actions=set_field:100->tun_id,output:45</entry>
+ <entry>table=0,in_port=30,tun_id=100,actions=output:5</entry>
+ <entry>table=0,in_port=31,tun_id=100,actions=output:6</entry>
+ <entry>table=0,in_port=32,tun_id=100,actions=output:7</entry>
+ <entry>table=0,in_port=33,tun_id=100,actions=output:8</entry>
+ <entry>table=0,in_port=34,tun_id=100,actions=output:9</entry>
+ <entry>table=0,in_port=35,tun_id=100,actions=output:10</entry>
+ <entry>table=0,in_port=36,tun_id=100,actions=output:11</entry>
+ <entry>table=0,in_port=37,tun_id=100,actions=output:12</entry>
+ <entry>table=0,in_port=38,tun_id=100,actions=output:13</entry>
+ <entry>table=0,in_port=39,tun_id=100,actions=output:14</entry>
+ <entry>table=0,in_port=40,tun_id=100,actions=output:15</entry>
+ <entry>table=0,in_port=41,tun_id=100,actions=output:16</entry>
+ <entry>table=0,in_port=42,tun_id=100,actions=output:17</entry>
+ <entry>table=0,in_port=43,tun_id=100,actions=output:18</entry>
+ <entry>table=0,in_port=44,tun_id=100,actions=output:19</entry>
+ <entry>table=0,in_port=45,tun_id=100,actions=output:20</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">
+ <params>
+ <param name="driver" value="{$driver}"/>
+ </params>
+ <addresses>
+ <address value="{$net}.20/24"/>
+ <address value="{$net}.21/24"/>
+ <address value="{$net}.22/24"/>
+ <address value="{$net}.23/24"/>
+ <address value="{$net}.24/24"/>
+ <address value="{$net}.25/24"/>
+ <address value="{$net}.26/24"/>
+ <address value="{$net}.27/24"/>
+ <address value="{$net}.28/24"/>
+ <address value="{$net}.29/24"/>
+ <address value="{$net}.30/24"/>
+ <address value="{$net}.31/24"/>
+ <address value="{$net}.32/24"/>
+ <address value="{$net}.33/24"/>
+ <address value="{$net}.34/24"/>
+ <address value="{$net}.35/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="{$geneve_net}.20/24"/>
+ <address value="{$geneve_net6}::20/24"/>
+ </addresses>
+ </internal>
+ <internal id="int1">
+ <addresses>
+ <address value="{$geneve_net}.21/24"/>
+ <address value="{$geneve_net6}::21/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="6"/>
+ <option name="name" value="int1"/>
+ </options>
+ </internal>
+ <internal id="int2">
+ <addresses>
+ <address value="{$geneve_net}.22/24"/>
+ <address value="{$geneve_net6}::22/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="7"/>
+ <option name="name" value="int2"/>
+ </options>
+ </internal>
+ <internal id="int3">
+ <addresses>
+ <address value="{$geneve_net}.23/24"/>
+ <address value="{$geneve_net6}::23/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="8"/>
+ <option name="name" value="int3"/>
+ </options>
+ </internal>
+ <internal id="int4">
+ <addresses>
+ <address value="{$geneve_net}.24/24"/>
+ <address value="{$geneve_net6}::24/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="9"/>
+ <option name="name" value="int4"/>
+ </options>
+ </internal>
+ <internal id="int5">
+ <addresses>
+ <address value="{$geneve_net}.25/24"/>
+ <address value="{$geneve_net6}::25/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="10"/>
+ <option name="name" value="int5"/>
+ </options>
+ </internal>
+ <internal id="int6">
+ <addresses>
+ <address value="{$geneve_net}.26/24"/>
+ <address value="{$geneve_net6}::26/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="11"/>
+ <option name="name" value="int6"/>
+ </options>
+ </internal>
+ <internal id="int7">
+ <addresses>
+ <address value="{$geneve_net}.27/24"/>
+ <address value="{$geneve_net6}::27/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="12"/>
+ <option name="name" value="int7"/>
+ </options>
+ </internal>
+ <internal id="int8">
+ <addresses>
+ <address value="{$geneve_net}.28/24"/>
+ <address value="{$geneve_net6}::28/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="13"/>
+ <option name="name" value="int8"/>
+ </options>
+ </internal>
+ <internal id="int9">
+ <addresses>
+ <address value="{$geneve_net}.29/24"/>
+ <address value="{$geneve_net6}::29/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="14"/>
+ <option name="name" value="int9"/>
+ </options>
+ </internal>
+ <internal id="int10">
+ <addresses>
+ <address value="{$geneve_net}.30/24"/>
+ <address value="{$geneve_net6}::30/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="15"/>
+ <option name="name" value="int10"/>
+ </options>
+ </internal>
+ <internal id="int11">
+ <addresses>
+ <address value="{$geneve_net}.31/24"/>
+ <address value="{$geneve_net6}::31/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="16"/>
+ <option name="name" value="int11"/>
+ </options>
+ </internal>
+ <internal id="int12">
+ <addresses>
+ <address value="{$geneve_net}.32/24"/>
+ <address value="{$geneve_net6}::32/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="17"/>
+ <option name="name" value="int12"/>
+ </options>
+ </internal>
+ <internal id="int13">
+ <addresses>
+ <address value="{$geneve_net}.33/24"/>
+ <address value="{$geneve_net6}::33/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="18"/>
+ <option name="name" value="int13"/>
+ </options>
+ </internal>
+ <internal id="int14">
+ <addresses>
+ <address value="{$geneve_net}.34/24"/>
+ <address value="{$geneve_net6}::34/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="19"/>
+ <option name="name" value="int14"/>
+ </options>
+ </internal>
+ <internal id="int15">
+ <addresses>
+ <address value="{$geneve_net}.35/24"/>
+ <address value="{$geneve_net6}::35/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="20"/>
+ <option name="name" value="int15"/>
+ </options>
+ </internal>
+ <tunnel id="geneve1" type="geneve">
+ <options>
+ <option name="name" value="geneve1"/>
+ <option name="option:remote_ip" value="{$net}.1"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="30"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve2" type="geneve">
+ <options>
+ <option name="name" value="geneve2"/>
+ <option name="option:remote_ip" value="{$net}.2"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="31"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve3" type="geneve">
+ <options>
+ <option name="name" value="geneve3"/>
+ <option name="option:remote_ip" value="{$net}.3"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="32"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve4" type="geneve">
+ <options>
+ <option name="name" value="geneve4"/>
+ <option name="option:remote_ip" value="{$net}.4"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="33"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve5" type="geneve">
+ <options>
+ <option name="name" value="geneve5"/>
+ <option name="option:remote_ip" value="{$net}.5"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="34"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve6" type="geneve">
+ <options>
+ <option name="name" value="geneve6"/>
+ <option name="option:remote_ip" value="{$net}.6"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="35"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve7" type="geneve">
+ <options>
+ <option name="name" value="geneve7"/>
+ <option name="option:remote_ip" value="{$net}.7"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="36"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve8" type="geneve">
+ <options>
+ <option name="name" value="geneve8"/>
+ <option name="option:remote_ip" value="{$net}.8"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="37"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve9" type="geneve">
+ <options>
+ <option name="name" value="geneve9"/>
+ <option name="option:remote_ip" value="{$net}.9"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="38"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve10" type="geneve">
+ <options>
+ <option name="name" value="geneve10"/>
+ <option name="option:remote_ip" value="{$net}.10"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="39"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve11" type="geneve">
+ <options>
+ <option name="name" value="geneve11"/>
+ <option name="option:remote_ip" value="{$net}.11"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="40"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve12" type="geneve">
+ <options>
+ <option name="name" value="geneve12"/>
+ <option name="option:remote_ip" value="{$net}.12"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="41"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve13" type="geneve">
+ <options>
+ <option name="name" value="geneve13"/>
+ <option name="option:remote_ip" value="{$net}.13"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="42"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve14" type="geneve">
+ <options>
+ <option name="name" value="geneve14"/>
+ <option name="option:remote_ip" value="{$net}.14"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="43"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve15" type="geneve">
+ <options>
+ <option name="name" value="geneve15"/>
+ <option name="option:remote_ip" value="{$net}.15"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="44"/>
+ </options>
+ </tunnel>
+ <tunnel id="geneve16" type="geneve">
+ <options>
+ <option name="name" value="geneve16"/>
+ <option name="option:remote_ip" value="{$net}.16"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="45"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+ <entry>table=0,in_port=5,actions=set_field:100->tun_id,output:30</entry>
+ <entry>table=0,in_port=6,actions=set_field:100->tun_id,output:31</entry>
+ <entry>table=0,in_port=7,actions=set_field:100->tun_id,output:32</entry>
+ <entry>table=0,in_port=8,actions=set_field:100->tun_id,output:33</entry>
+ <entry>table=0,in_port=9,actions=set_field:100->tun_id,output:34</entry>
+ <entry>table=0,in_port=10,actions=set_field:100->tun_id,output:35</entry>
+ <entry>table=0,in_port=11,actions=set_field:100->tun_id,output:36</entry>
+ <entry>table=0,in_port=12,actions=set_field:100->tun_id,output:37</entry>
+ <entry>table=0,in_port=13,actions=set_field:100->tun_id,output:38</entry>
+ <entry>table=0,in_port=14,actions=set_field:100->tun_id,output:39</entry>
+ <entry>table=0,in_port=15,actions=set_field:100->tun_id,output:40</entry>
+ <entry>table=0,in_port=16,actions=set_field:100->tun_id,output:41</entry>
+ <entry>table=0,in_port=17,actions=set_field:100->tun_id,output:42</entry>
+ <entry>table=0,in_port=18,actions=set_field:100->tun_id,output:43</entry>
+ <entry>table=0,in_port=19,actions=set_field:100->tun_id,output:44</entry>
+ <entry>table=0,in_port=20,actions=set_field:100->tun_id,output:45</entry>
+ <entry>table=0,in_port=30,tun_id=100,actions=output:5</entry>
+ <entry>table=0,in_port=31,tun_id=100,actions=output:6</entry>
+ <entry>table=0,in_port=32,tun_id=100,actions=output:7</entry>
+ <entry>table=0,in_port=33,tun_id=100,actions=output:8</entry>
+ <entry>table=0,in_port=34,tun_id=100,actions=output:9</entry>
+ <entry>table=0,in_port=35,tun_id=100,actions=output:10</entry>
+ <entry>table=0,in_port=36,tun_id=100,actions=output:11</entry>
+ <entry>table=0,in_port=37,tun_id=100,actions=output:12</entry>
+ <entry>table=0,in_port=38,tun_id=100,actions=output:13</entry>
+ <entry>table=0,in_port=39,tun_id=100,actions=output:14</entry>
+ <entry>table=0,in_port=40,tun_id=100,actions=output:15</entry>
+ <entry>table=0,in_port=41,tun_id=100,actions=output:16</entry>
+ <entry>table=0,in_port=42,tun_id=100,actions=output:17</entry>
+ <entry>table=0,in_port=43,tun_id=100,actions=output:18</entry>
+ <entry>table=0,in_port=44,tun_id=100,actions=output:19</entry>
+ <entry>table=0,in_port=45,tun_id=100,actions=output:20</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="ovs_tunnels.py"/>
+</lnstrecipe>
diff --git a/recipes/tunnels/ovs_tunnels.py b/recipes/tunnels/ovs_tunnels.py
new file mode 100644
index 0000000..2075d84
--- /dev/null
+++ b/recipes/tunnels/ovs_tunnels.py
@@ -0,0 +1,170 @@
+from lnst.Controller.Task import ctl
+
+from lnst.RecipeCommon.ModuleWrap import netperf
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+
+def run_netperf(netperf_servers, netperf_clients, testname):
+ netperf_cli_procs = []
+ netperf_srv_procs = []
+
+ timeout = (netperf_duration + nperf_reserve) * nperf_max_runs
+
+ for i in range(0, TUNNEL_COUNT):
+ netperf_clients[i].update_options({"testname" : testname})
+
+ netperf_srv_procs.append(h2.run(netperf_servers[i], bg=True, timeout=timeout))
+ netperf_cli_procs.append(h1.run(netperf_clients[i], bg=True, timeout=timeout))
+
+ for i in range(0, TUNNEL_COUNT):
+ netperf_cli_procs[i].wait()
+ netperf_srv_procs[i].intr()
+
+ sum = 0
+
+ for i in range(0, TUNNEL_COUNT):
+ sum += netperf_cli_procs[i].get_result()['res_data']['rate']
+
+ res = ctl.get_module("Custom",
+ options={
+ "rate" : sum,
+ "unit" : "bps",
+ "testname" : testname
+ })
+
+ return res
+
+# ------
+# SETUP
+# ------
+
+# test hosts
+h1 = ctl.get_host("test_host1")
+h2 = ctl.get_host("test_host2")
+
+for h in [h1, h2]:
+ h.sync_resources(modules=["Netperf", "Custom"])
+
+TUNNEL_COUNT = 16
+
+# ------
+# 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")
+nperf_msg_size = ctl.get_alias("nperf_msg_size")
+nperf_protocols = ctl.get_alias("nperf_protocols")
+
+devices = []
+
+h1_nic = h1.get_interface("if1")
+h2_nic = h2.get_interface("if1")
+
+for i in range(0, TUNNEL_COUNT):
+ d1 = h1.get_device("int" + str(i))
+ d2 = h2.get_device("int" + str(i))
+ devices.append((d1, d2))
+
+for h1_dev, h2_dev in devices:
+ h1_dev.set_mtu(mtu)
+ h2_dev.set_mtu(mtu)
+
+nperf_opts = ""
+if nperf_cpupin:
+ 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_cpupin and nperf_num_parallel == 1:
+ nperf_opts = " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+
+
+ctl.wait(15)
+
+netperf_clients = []
+netperf_servers = []
+netperf_clients6 = []
+netperf_servers6 = []
+
+
+for h1_dev, h2_dev in devices:
+ netperf_clients.append(ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server": h2_dev.get_ip(0),
+ "bind": h1_dev.get_ip(0),
+ "duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "debug" : nperf_debug,
+ "num_parallel" : nperf_num_parallel,
+ "max_deviation" : nperf_max_dev}))
+
+ netperf_clients6.append(ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server": h2_dev.get_ip(1),
+ "bind": h1_dev.get_ip(1),
+ "duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs": nperf_max_runs,
+ "debug" : nperf_debug,
+ "num_parallel" : nperf_num_parallel,
+ "max_deviation" : nperf_max_dev}))
+
+ netperf_servers.append(ctl.get_module("Netperf",
+ options={
+ "role" : "server",
+ "bind": h2_dev.get_ip(0)}))
+
+ netperf_servers6.append(ctl.get_module("Netperf",
+ options={
+ "role" : "server",
+ "bind": h2_dev.get_ip(1)}))
+
+
+for action in ["on", "off"]:
+ h1.run("ethtool -K %s tx-udp_tnl-segmentation %s" % (h1_nic.get_devname(), action))
+ h2.run("ethtool -K %s tx-udp_tnl-segmentation %s" % (h2_nic.get_devname(), action))
+
+ #netperfs
+ ctl.wait(5)
+
+ if ipv in ["ipv4", "both"]:
+ if nperf_protocols.find("tcp") > -1:
+ testname = "TCP_STREAM"
+ res = run_netperf(netperf_servers, netperf_clients, testname)
+ h1.run(res)
+ if nperf_protocols.find("udp") > -1:
+ testname = "UDP_STREAM"
+ res = run_netperf(netperf_servers, netperf_clients, testname)
+ h1.run(res)
+ if ipv in ["ipv6", "both"]:
+ if nperf_protocols.find("tcp") > -1:
+ testname = "TCP_STREAM"
+ res = run_netperf(netperf_servers6, netperf_clients6, testname)
+ h1.run(res)
+ if nperf_protocols.find("udp") > -1:
+ testname = "UDP_STREAM"
+ res = run_netperf(netperf_servers6, netperf_clients6, testname)
+ h1.run(res)
+
+if nperf_cpupin:
+ h1.run("service irqbalance start")
+ h2.run("service irqbalance start")
diff --git a/recipes/tunnels/ovs_vxlan.xml b/recipes/tunnels/ovs_vxlan.xml
new file mode 100644
index 0000000..773e464
--- /dev/null
+++ b/recipes/tunnels/ovs_vxlan.xml
@@ -0,0 +1,727 @@
+<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_num_parallel" value="4"/>
+ <alias name="nperf_debug" value="0"/>
+ <alias name="nperf_max_dev" value="20%"/>
+ <alias name="nperf_protocols" value="tcp udp"/>
+ <alias name="mapping_file" value="novirt_ovs_vxlan.mapping" />
+ <alias name="net" value="192.168.2"/>
+ <alias name="vxlan_net" value="192.168.111"/>
+ <alias name="vxlan_net6" value="fc00:0:0:0"/>
+ <alias name="driver" value=""/>
+ </define>
+ <network>
+ <host id="test_host1">
+ <interfaces>
+ <eth id="if1" label="n1">
+ <params>
+ <param name="driver" value="{$driver}"/>
+ </params>
+ <addresses>
+ <address value="{$net}.1/24"/>
+ <address value="{$net}.2/24"/>
+ <address value="{$net}.3/24"/>
+ <address value="{$net}.4/24"/>
+ <address value="{$net}.5/24"/>
+ <address value="{$net}.6/24"/>
+ <address value="{$net}.7/24"/>
+ <address value="{$net}.8/24"/>
+ <address value="{$net}.9/24"/>
+ <address value="{$net}.10/24"/>
+ <address value="{$net}.11/24"/>
+ <address value="{$net}.12/24"/>
+ <address value="{$net}.13/24"/>
+ <address value="{$net}.14/24"/>
+ <address value="{$net}.15/24"/>
+ <address value="{$net}.16/24"/>
+ </addresses>
+ </eth>
+ <ovs_bridge id="ovs1">
+ <internal id="int0">
+ <addresses>
+ <address value="{$vxlan_net}.1/24"/>
+ <address value="{$vxlan_net6}::1/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="5"/>
+ <option name="name" value="int0"/>
+ </options>
+ </internal>
+ <internal id="int1">
+ <addresses>
+ <address value="{$vxlan_net}.2/24"/>
+ <address value="{$vxlan_net6}::2/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="6"/>
+ <option name="name" value="int1"/>
+ </options>
+ </internal>
+ <internal id="int2">
+ <addresses>
+ <address value="{$vxlan_net}.3/24"/>
+ <address value="{$vxlan_net6}::3/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="7"/>
+ <option name="name" value="int2"/>
+ </options>
+ </internal>
+ <internal id="int3">
+ <addresses>
+ <address value="{$vxlan_net}.4/24"/>
+ <address value="{$vxlan_net6}::4/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="8"/>
+ <option name="name" value="int3"/>
+ </options>
+ </internal>
+ <internal id="int4">
+ <addresses>
+ <address value="{$vxlan_net}.5/24"/>
+ <address value="{$vxlan_net6}::5/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="9"/>
+ <option name="name" value="int4"/>
+ </options>
+ </internal>
+ <internal id="int5">
+ <addresses>
+ <address value="{$vxlan_net}.6/24"/>
+ <address value="{$vxlan_net6}::6/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="10"/>
+ <option name="name" value="int5"/>
+ </options>
+ </internal>
+ <internal id="int6">
+ <addresses>
+ <address value="{$vxlan_net}.7/24"/>
+ <address value="{$vxlan_net6}::7/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="11"/>
+ <option name="name" value="int6"/>
+ </options>
+ </internal>
+ <internal id="int7">
+ <addresses>
+ <address value="{$vxlan_net}.8/24"/>
+ <address value="{$vxlan_net6}::8/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="12"/>
+ <option name="name" value="int7"/>
+ </options>
+ </internal>
+ <internal id="int8">
+ <addresses>
+ <address value="{$vxlan_net}.9/24"/>
+ <address value="{$vxlan_net6}::9/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="13"/>
+ <option name="name" value="int8"/>
+ </options>
+ </internal>
+ <internal id="int9">
+ <addresses>
+ <address value="{$vxlan_net}.10/24"/>
+ <address value="{$vxlan_net6}::10/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="14"/>
+ <option name="name" value="int9"/>
+ </options>
+ </internal>
+ <internal id="int10">
+ <addresses>
+ <address value="{$vxlan_net}.11/24"/>
+ <address value="{$vxlan_net6}::11/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="15"/>
+ <option name="name" value="int10"/>
+ </options>
+ </internal>
+ <internal id="int11">
+ <addresses>
+ <address value="{$vxlan_net}.12/24"/>
+ <address value="{$vxlan_net6}::12/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="16"/>
+ <option name="name" value="int11"/>
+ </options>
+ </internal>
+ <internal id="int12">
+ <addresses>
+ <address value="{$vxlan_net}.13/24"/>
+ <address value="{$vxlan_net6}::13/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="17"/>
+ <option name="name" value="int12"/>
+ </options>
+ </internal>
+ <internal id="int13">
+ <addresses>
+ <address value="{$vxlan_net}.14/24"/>
+ <address value="{$vxlan_net6}::14/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="18"/>
+ <option name="name" value="int13"/>
+ </options>
+ </internal>
+ <internal id="int14">
+ <addresses>
+ <address value="{$vxlan_net}.15/24"/>
+ <address value="{$vxlan_net6}::15/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="19"/>
+ <option name="name" value="int14"/>
+ </options>
+ </internal>
+ <internal id="int15">
+ <addresses>
+ <address value="{$vxlan_net}.16/24"/>
+ <address value="{$vxlan_net6}::16/65"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="20"/>
+ <option name="name" value="int15"/>
+ </options>
+ </internal>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="name" value="vxlan1"/>
+ <option name="option:remote_ip" value="{$net}.20"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="30"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan2" type="vxlan">
+ <options>
+ <option name="name" value="vxlan2"/>
+ <option name="option:remote_ip" value="{$net}.21"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="31"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan3" type="vxlan">
+ <options>
+ <option name="name" value="vxlan3"/>
+ <option name="option:remote_ip" value="{$net}.22"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="32"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan4" type="vxlan">
+ <options>
+ <option name="name" value="vxlan4"/>
+ <option name="option:remote_ip" value="{$net}.23"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="33"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan5" type="vxlan">
+ <options>
+ <option name="name" value="vxlan5"/>
+ <option name="option:remote_ip" value="{$net}.24"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="34"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan6" type="vxlan">
+ <options>
+ <option name="name" value="vxlan6"/>
+ <option name="option:remote_ip" value="{$net}.25"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="35"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan7" type="vxlan">
+ <options>
+ <option name="name" value="vxlan7"/>
+ <option name="option:remote_ip" value="{$net}.26"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="36"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan8" type="vxlan">
+ <options>
+ <option name="name" value="vxlan8"/>
+ <option name="option:remote_ip" value="{$net}.27"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="37"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan9" type="vxlan">
+ <options>
+ <option name="name" value="vxlan9"/>
+ <option name="option:remote_ip" value="{$net}.28"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="38"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan10" type="vxlan">
+ <options>
+ <option name="name" value="vxlan10"/>
+ <option name="option:remote_ip" value="{$net}.29"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="39"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan11" type="vxlan">
+ <options>
+ <option name="name" value="vxlan11"/>
+ <option name="option:remote_ip" value="{$net}.30"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="40"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan12" type="vxlan">
+ <options>
+ <option name="name" value="vxlan12"/>
+ <option name="option:remote_ip" value="{$net}.31"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="41"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan13" type="vxlan">
+ <options>
+ <option name="name" value="vxlan13"/>
+ <option name="option:remote_ip" value="{$net}.32"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="42"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan14" type="vxlan">
+ <options>
+ <option name="name" value="vxlan14"/>
+ <option name="option:remote_ip" value="{$net}.33"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="43"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan15" type="vxlan">
+ <options>
+ <option name="name" value="vxlan15"/>
+ <option name="option:remote_ip" value="{$net}.34"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="44"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan16" type="vxlan">
+ <options>
+ <option name="name" value="vxlan16"/>
+ <option name="option:remote_ip" value="{$net}.35"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="45"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+ <entry>table=0,in_port=5,actions=set_field:100->tun_id,output:30</entry>
+ <entry>table=0,in_port=6,actions=set_field:100->tun_id,output:31</entry>
+ <entry>table=0,in_port=7,actions=set_field:100->tun_id,output:32</entry>
+ <entry>table=0,in_port=8,actions=set_field:100->tun_id,output:33</entry>
+ <entry>table=0,in_port=9,actions=set_field:100->tun_id,output:34</entry>
+ <entry>table=0,in_port=10,actions=set_field:100->tun_id,output:35</entry>
+ <entry>table=0,in_port=11,actions=set_field:100->tun_id,output:36</entry>
+ <entry>table=0,in_port=12,actions=set_field:100->tun_id,output:37</entry>
+ <entry>table=0,in_port=13,actions=set_field:100->tun_id,output:38</entry>
+ <entry>table=0,in_port=14,actions=set_field:100->tun_id,output:39</entry>
+ <entry>table=0,in_port=15,actions=set_field:100->tun_id,output:40</entry>
+ <entry>table=0,in_port=16,actions=set_field:100->tun_id,output:41</entry>
+ <entry>table=0,in_port=17,actions=set_field:100->tun_id,output:42</entry>
+ <entry>table=0,in_port=18,actions=set_field:100->tun_id,output:43</entry>
+ <entry>table=0,in_port=19,actions=set_field:100->tun_id,output:44</entry>
+ <entry>table=0,in_port=20,actions=set_field:100->tun_id,output:45</entry>
+ <entry>table=0,in_port=30,tun_id=100,actions=output:5</entry>
+ <entry>table=0,in_port=31,tun_id=100,actions=output:6</entry>
+ <entry>table=0,in_port=32,tun_id=100,actions=output:7</entry>
+ <entry>table=0,in_port=33,tun_id=100,actions=output:8</entry>
+ <entry>table=0,in_port=34,tun_id=100,actions=output:9</entry>
+ <entry>table=0,in_port=35,tun_id=100,actions=output:10</entry>
+ <entry>table=0,in_port=36,tun_id=100,actions=output:11</entry>
+ <entry>table=0,in_port=37,tun_id=100,actions=output:12</entry>
+ <entry>table=0,in_port=38,tun_id=100,actions=output:13</entry>
+ <entry>table=0,in_port=39,tun_id=100,actions=output:14</entry>
+ <entry>table=0,in_port=40,tun_id=100,actions=output:15</entry>
+ <entry>table=0,in_port=41,tun_id=100,actions=output:16</entry>
+ <entry>table=0,in_port=42,tun_id=100,actions=output:17</entry>
+ <entry>table=0,in_port=43,tun_id=100,actions=output:18</entry>
+ <entry>table=0,in_port=44,tun_id=100,actions=output:19</entry>
+ <entry>table=0,in_port=45,tun_id=100,actions=output:20</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">
+ <params>
+ <param name="driver" value="{$driver}"/>
+ </params>
+ <addresses>
+ <address value="{$net}.20/24"/>
+ <address value="{$net}.21/24"/>
+ <address value="{$net}.22/24"/>
+ <address value="{$net}.23/24"/>
+ <address value="{$net}.24/24"/>
+ <address value="{$net}.25/24"/>
+ <address value="{$net}.26/24"/>
+ <address value="{$net}.27/24"/>
+ <address value="{$net}.28/24"/>
+ <address value="{$net}.29/24"/>
+ <address value="{$net}.30/24"/>
+ <address value="{$net}.31/24"/>
+ <address value="{$net}.32/24"/>
+ <address value="{$net}.33/24"/>
+ <address value="{$net}.34/24"/>
+ <address value="{$net}.35/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="{$vxlan_net}.20/24"/>
+ <address value="{$vxlan_net6}::20/24"/>
+ </addresses>
+ </internal>
+ <internal id="int1">
+ <addresses>
+ <address value="{$vxlan_net}.21/24"/>
+ <address value="{$vxlan_net6}::21/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="6"/>
+ <option name="name" value="int1"/>
+ </options>
+ </internal>
+ <internal id="int2">
+ <addresses>
+ <address value="{$vxlan_net}.22/24"/>
+ <address value="{$vxlan_net6}::22/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="7"/>
+ <option name="name" value="int2"/>
+ </options>
+ </internal>
+ <internal id="int3">
+ <addresses>
+ <address value="{$vxlan_net}.23/24"/>
+ <address value="{$vxlan_net6}::23/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="8"/>
+ <option name="name" value="int3"/>
+ </options>
+ </internal>
+ <internal id="int4">
+ <addresses>
+ <address value="{$vxlan_net}.24/24"/>
+ <address value="{$vxlan_net6}::24/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="9"/>
+ <option name="name" value="int4"/>
+ </options>
+ </internal>
+ <internal id="int5">
+ <addresses>
+ <address value="{$vxlan_net}.25/24"/>
+ <address value="{$vxlan_net6}::25/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="10"/>
+ <option name="name" value="int5"/>
+ </options>
+ </internal>
+ <internal id="int6">
+ <addresses>
+ <address value="{$vxlan_net}.26/24"/>
+ <address value="{$vxlan_net6}::26/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="11"/>
+ <option name="name" value="int6"/>
+ </options>
+ </internal>
+ <internal id="int7">
+ <addresses>
+ <address value="{$vxlan_net}.27/24"/>
+ <address value="{$vxlan_net6}::27/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="12"/>
+ <option name="name" value="int7"/>
+ </options>
+ </internal>
+ <internal id="int8">
+ <addresses>
+ <address value="{$vxlan_net}.28/24"/>
+ <address value="{$vxlan_net6}::28/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="13"/>
+ <option name="name" value="int8"/>
+ </options>
+ </internal>
+ <internal id="int9">
+ <addresses>
+ <address value="{$vxlan_net}.29/24"/>
+ <address value="{$vxlan_net6}::29/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="14"/>
+ <option name="name" value="int9"/>
+ </options>
+ </internal>
+ <internal id="int10">
+ <addresses>
+ <address value="{$vxlan_net}.30/24"/>
+ <address value="{$vxlan_net6}::30/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="15"/>
+ <option name="name" value="int10"/>
+ </options>
+ </internal>
+ <internal id="int11">
+ <addresses>
+ <address value="{$vxlan_net}.31/24"/>
+ <address value="{$vxlan_net6}::31/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="16"/>
+ <option name="name" value="int11"/>
+ </options>
+ </internal>
+ <internal id="int12">
+ <addresses>
+ <address value="{$vxlan_net}.32/24"/>
+ <address value="{$vxlan_net6}::32/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="17"/>
+ <option name="name" value="int12"/>
+ </options>
+ </internal>
+ <internal id="int13">
+ <addresses>
+ <address value="{$vxlan_net}.33/24"/>
+ <address value="{$vxlan_net6}::33/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="18"/>
+ <option name="name" value="int13"/>
+ </options>
+ </internal>
+ <internal id="int14">
+ <addresses>
+ <address value="{$vxlan_net}.34/24"/>
+ <address value="{$vxlan_net6}::34/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="19"/>
+ <option name="name" value="int14"/>
+ </options>
+ </internal>
+ <internal id="int15">
+ <addresses>
+ <address value="{$vxlan_net}.35/24"/>
+ <address value="{$vxlan_net6}::35/64"/>
+ </addresses>
+ <options>
+ <option name="ofport_request" value="20"/>
+ <option name="name" value="int15"/>
+ </options>
+ </internal>
+ <tunnel id="vxlan1" type="vxlan">
+ <options>
+ <option name="name" value="vxlan1"/>
+ <option name="option:remote_ip" value="{$net}.1"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="30"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan2" type="vxlan">
+ <options>
+ <option name="name" value="vxlan2"/>
+ <option name="option:remote_ip" value="{$net}.2"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="31"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan3" type="vxlan">
+ <options>
+ <option name="name" value="vxlan3"/>
+ <option name="option:remote_ip" value="{$net}.3"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="32"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan4" type="vxlan">
+ <options>
+ <option name="name" value="vxlan4"/>
+ <option name="option:remote_ip" value="{$net}.4"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="33"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan5" type="vxlan">
+ <options>
+ <option name="name" value="vxlan5"/>
+ <option name="option:remote_ip" value="{$net}.5"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="34"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan6" type="vxlan">
+ <options>
+ <option name="name" value="vxlan6"/>
+ <option name="option:remote_ip" value="{$net}.6"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="35"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan7" type="vxlan">
+ <options>
+ <option name="name" value="vxlan7"/>
+ <option name="option:remote_ip" value="{$net}.7"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="36"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan8" type="vxlan">
+ <options>
+ <option name="name" value="vxlan8"/>
+ <option name="option:remote_ip" value="{$net}.8"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="37"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan9" type="vxlan">
+ <options>
+ <option name="name" value="vxlan9"/>
+ <option name="option:remote_ip" value="{$net}.9"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="38"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan10" type="vxlan">
+ <options>
+ <option name="name" value="vxlan10"/>
+ <option name="option:remote_ip" value="{$net}.10"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="39"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan11" type="vxlan">
+ <options>
+ <option name="name" value="vxlan11"/>
+ <option name="option:remote_ip" value="{$net}.11"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="40"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan12" type="vxlan">
+ <options>
+ <option name="name" value="vxlan12"/>
+ <option name="option:remote_ip" value="{$net}.12"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="41"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan13" type="vxlan">
+ <options>
+ <option name="name" value="vxlan13"/>
+ <option name="option:remote_ip" value="{$net}.13"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="42"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan14" type="vxlan">
+ <options>
+ <option name="name" value="vxlan14"/>
+ <option name="option:remote_ip" value="{$net}.14"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="43"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan15" type="vxlan">
+ <options>
+ <option name="name" value="vxlan15"/>
+ <option name="option:remote_ip" value="{$net}.15"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="44"/>
+ </options>
+ </tunnel>
+ <tunnel id="vxlan16" type="vxlan">
+ <options>
+ <option name="name" value="vxlan16"/>
+ <option name="option:remote_ip" value="{$net}.16"/>
+ <option name="option:key" value="flow"/>
+ <option name="ofport_request" value="45"/>
+ </options>
+ </tunnel>
+ <flow_entries>
+ <entry>table=0,in_port=5,actions=set_field:100->tun_id,output:30</entry>
+ <entry>table=0,in_port=6,actions=set_field:100->tun_id,output:31</entry>
+ <entry>table=0,in_port=7,actions=set_field:100->tun_id,output:32</entry>
+ <entry>table=0,in_port=8,actions=set_field:100->tun_id,output:33</entry>
+ <entry>table=0,in_port=9,actions=set_field:100->tun_id,output:34</entry>
+ <entry>table=0,in_port=10,actions=set_field:100->tun_id,output:35</entry>
+ <entry>table=0,in_port=11,actions=set_field:100->tun_id,output:36</entry>
+ <entry>table=0,in_port=12,actions=set_field:100->tun_id,output:37</entry>
+ <entry>table=0,in_port=13,actions=set_field:100->tun_id,output:38</entry>
+ <entry>table=0,in_port=14,actions=set_field:100->tun_id,output:39</entry>
+ <entry>table=0,in_port=15,actions=set_field:100->tun_id,output:40</entry>
+ <entry>table=0,in_port=16,actions=set_field:100->tun_id,output:41</entry>
+ <entry>table=0,in_port=17,actions=set_field:100->tun_id,output:42</entry>
+ <entry>table=0,in_port=18,actions=set_field:100->tun_id,output:43</entry>
+ <entry>table=0,in_port=19,actions=set_field:100->tun_id,output:44</entry>
+ <entry>table=0,in_port=20,actions=set_field:100->tun_id,output:45</entry>
+ <entry>table=0,in_port=30,tun_id=100,actions=output:5</entry>
+ <entry>table=0,in_port=31,tun_id=100,actions=output:6</entry>
+ <entry>table=0,in_port=32,tun_id=100,actions=output:7</entry>
+ <entry>table=0,in_port=33,tun_id=100,actions=output:8</entry>
+ <entry>table=0,in_port=34,tun_id=100,actions=output:9</entry>
+ <entry>table=0,in_port=35,tun_id=100,actions=output:10</entry>
+ <entry>table=0,in_port=36,tun_id=100,actions=output:11</entry>
+ <entry>table=0,in_port=37,tun_id=100,actions=output:12</entry>
+ <entry>table=0,in_port=38,tun_id=100,actions=output:13</entry>
+ <entry>table=0,in_port=39,tun_id=100,actions=output:14</entry>
+ <entry>table=0,in_port=40,tun_id=100,actions=output:15</entry>
+ <entry>table=0,in_port=41,tun_id=100,actions=output:16</entry>
+ <entry>table=0,in_port=42,tun_id=100,actions=output:17</entry>
+ <entry>table=0,in_port=43,tun_id=100,actions=output:18</entry>
+ <entry>table=0,in_port=44,tun_id=100,actions=output:19</entry>
+ <entry>table=0,in_port=45,tun_id=100,actions=output:20</entry>
+ <entry>table=0,priority=100,actions=drop</entry>
+ </flow_entries>
+ </ovs_bridge>
+ </interfaces>
+ </host>
+ </network>
+
+ <task python="ovs_tunnels.py"/>
+</lnstrecipe>
--
2.9.4
6 years, 3 months
[PATCH 1/2] Task: add official_result parameter
by olichtne@redhat.com
From: Ondrej Lichtner <olichtne(a)redhat.com>
When the official_result parameter is set to True it indicates that
the result will be filtered by a hash tag. So the save_result method
calculates and adds this tag before submitting the object.
If set to False the hash calculation and the tag is skipped.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Task.py | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index a5fb0d3..b5080d2 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -921,7 +921,7 @@ class PerfRepoAPI(object):
result = PerfRepoResult(test, name, hash_ignore)
return result
- def save_result(self, result):
+ def save_result(self, result, official_result=False):
if isinstance(result, Noop):
return
elif not self.connected():
@@ -931,9 +931,13 @@ class PerfRepoAPI(object):
logging.debug("PerfRepoResult with no result data, skipping "\
"send to PerfRepo.")
return
+
h = result.generate_hash()
- logging.debug("Adding hash '%s' as tag to result." % h)
- result.add_tag(h)
+ if official_result:
+ logging.debug("Adding hash '%s' as tag to result." % h)
+ result.add_tag(h)
+ else:
+ logging.debug("Unofficial results - skipping hash tag.")
logging.info("Sending TestExecution to PerfRepo.")
try:
self._rest_api.testExecution_create(result.get_testExecution())
--
2.13.0
6 years, 5 months
[PATCH 1/2] test_modules/Netperf: fix typo in message for supported_test
by Jiri Prochazka
The attribute is called supported tests, not supported test.
Thanks to Jan Tluka (jtluka(a)redhat.com) for discovering this issue.
Fixes: 9dae9cf9 ("test_modules/netperf: print actual supported tests in
warning message")
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
test_modules/Netperf.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test_modules/Netperf.py b/test_modules/Netperf.py
index 6cbd504..f74d06a 100644
--- a/test_modules/Netperf.py
+++ b/test_modules/Netperf.py
@@ -100,7 +100,7 @@ class Netperf(TestGeneric):
supported_tests = ', '.join(self.supported_tests)
logging.warning("Only %s tests are now officialy supported "
"by LNST. You can use other tests, but test result may not "
- "be correct." % supported_test)
+ "be correct." % supported_tests)
cmd += " -t %s" % self._testname
if self._confidence is not None and self._num_parallel <= 1:
--
2.9.4
6 years, 5 months
[PATCH v3 1/4] PerfRepoUtils: add support for RR test in perfrepo templates
by Jiri Prochazka
This patch adds test_type param to all PerfRepo template functions. When
this param is not specified, it is expected the test to be *_STREAM and
metric labels are throughput, throughput_deviation, etc. When the param
is set to RR, metric labels used are rr_rate, rr_rate_deviation, etc.
This is needed for the new short-lived connections test, where the unit
we measure is not throughput but request/response rate.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Controller/PerfRepoUtils.py | 52 ++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 15 deletions(-)
diff --git a/lnst/Controller/PerfRepoUtils.py b/lnst/Controller/PerfRepoUtils.py
index 4c545e4..8d5a29d 100644
--- a/lnst/Controller/PerfRepoUtils.py
+++ b/lnst/Controller/PerfRepoUtils.py
@@ -14,7 +14,7 @@ olichtne(a)redhat.com (Ondrej Lichtner)
import logging
from lnst.Common.Utils import Noop
-def netperf_baseline_template(module, baseline):
+def netperf_baseline_template(module, baseline, test_type="STREAM"):
module.unset_option('threshold')
module.unset_option('threshold_deviation')
@@ -22,35 +22,51 @@ def netperf_baseline_template(module, baseline):
return module
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return module
logging.debug("Setting Netperf threshold.")
if throughput is not None and deviation is not None:
- module.update_options({'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation})
+ if test_type == "RR":
+ module.update_options({'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation})
+ else:
+ module.update_options({'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation})
return module
-def perfrepo_baseline_to_dict(baseline):
+def perfrepo_baseline_to_dict(baseline, test_type="STREAM"):
if baseline.get_texec() is None:
return {}
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return {}
if throughput is not None and deviation is not None:
- return {'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation}
+ if test_type == "RR":
+ return {'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation}
+ else:
+ return {'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation}
return {}
-def netperf_result_template(perfrepo_result, netperf_result):
+def netperf_result_template(perfrepo_result, netperf_result, test_type="STREAM"):
if isinstance(perfrepo_result, Noop):
return perfrepo_result
@@ -64,9 +80,15 @@ def netperf_result_template(perfrepo_result, netperf_result):
return perfrepo_result
logging.debug("Adding Netperf results to PerfRepo object.")
- perfrepo_result.add_value('throughput', rate)
- perfrepo_result.add_value('throughput_min', rate - deviation)
- perfrepo_result.add_value('throughput_max', rate + deviation)
- perfrepo_result.add_value('throughput_deviation', deviation)
+ if test_type == "RR":
+ perfrepo_result.add_value('rr_rate', rate)
+ perfrepo_result.add_value('rr_rate_min', rate - deviation)
+ perfrepo_result.add_value('rr_rate_max', rate + deviation)
+ perfrepo_result.add_value('rr_rate_deviation', deviation)
+ else:
+ perfrepo_result.add_value('throughput', rate)
+ perfrepo_result.add_value('throughput_min', rate - deviation)
+ perfrepo_result.add_value('throughput_max', rate + deviation)
+ perfrepo_result.add_value('throughput_deviation', deviation)
return perfrepo_result
--
2.9.4
6 years, 5 months
[RFC v2 00/47] Python Recipes
by olichtne@redhat.com
From: Ondrej Lichtner <olichtne(a)redhat.com>
v2 changes:
add lnst.Common.IpAddress
* modify exception string.
add lnst.Common.Parameters
* add docstring explaining the __getattribute__ magic
* make val a property
* rename x to attr in Parameters dir() iterations
* fix IpParam value setter for string values
* modify IpParam Exception string
add lnst.Devices
* make Device a Meta class and register RemoteDevice as implementing
the Device interface
* removed unnecessary imports
* added MasterDevice class for slave* methods
* made master_set to be a 'master' property setter
* renamed {add, del}_route to route_{add, del}
* renamed set_speed to speed_set
* renamed set_autoneg to autoneg_set
* removed modprobes where unnecessary
* link_stats are now retrieved from netlink message
* added link_stats64
* OvsBridge calls parent _type_init for modprobe
* remove SoftDevice import - not required
add lnst.Controller.Host
* removed debug pprint import
* added docstrings to requested methods
* Host::run throws an exception when netns set (not supported yet)
* added TODO comments to some parts that need to be implemented
add lnst.Controller.MachineMapper
* docstring now explains that implementing your own MachineMapper is
not supported at this moment
* removed debug pprint import
add lnst.Controller.Recipe
* renamed variable 'x' to 'attr'
Machine, NetTestSlave: heavy reimplementation
* improved class and module synchronization implementation
* join split lines in deviceref_to_device method
lnst.Common.Parameters: IpParam accepts Device objects
* import Device on demand (Device class arrives on Slave later) and
check isinstance Device instead of RemoteDevice (not available on
Slave)
* fix IpParam Exception string
v2 new commits:
Controller, Devices: removing unused imports
NetTestSlave: create dynamic lnst.Tests package
lnst.Tests: add package docstring
lnst.Common.Parameters: add DeviceParam
lnst.Tests.IcmpPing: use DeviceParam for iface parameter
Including the original cover letter as well:
Hi all,
the long avaited patchset for Python Recipes is here.
At this point there's still quite a lot of work left, but since the current
state is functional and the tester facing API should be mostly stable I think
it's a good time to get this merged into upstream so that more people can get
involved with filling in the missing pieces and can slowly start experimenting
and porting their XML recipes.
This I know are missing:
* Recipe run summary - how the Summary should look like was described in the
running proposal document, but I didn't manage to start with the
implementation yet...
* Porting of all the old test_modules into the lnst.Tests package, so far we
only have the IcmpPing module that should still be reworked to be more
universal (ip4 and ip6 in one class). Porting test_modules should be fairly
easy, but at this point there's no guide how to do it so if you're having
trouble feel free to contact me either on irc or email.
* test_tools - we haven't even thought of these yet
* network namespaces - also didn't think about them yet, though I'm hoping this
will be simple
* Ip address and network generators as we've discussed them on the upstream
meeting
Please review and provide any comments or features I forgot that should be
added to the above list.
Regards,
Ondrej
Ondrej Lichtner (47):
add lnst.Common.LnstError
add lnst.Common.DeviceError
add lnst.Common.DeviceRef
add lnst.Common.IpAddress
add lnst.Common.Parameters
add lnst.Common.TestModule
add lnst.Common.JobError
add lnst.Controller.Common
add lnst.Devices
add lnst.Controller.Requirements
add lnst.Controller.Job
add lnst.Controller.Host
add lnst.Controller.Config
add lnst.Slave.Config
add lnst.Controller.MachineMapper
lnst.Controller.Machine: change object initialization
add lnst.Controller.MessageDispatcher
add lnst.Controller.SlavePoolManager
add lnst.Controller.Recipe
add lnst.Controller.Controller
various files: retype exceptions
add lnst.Tests package
lnst.Common.Config: remove {controller, slave}_init
lnst.Common.Config: remove global lnst_config
Slave: use a local config object instead of a global one
lnst.Common.Utils: add sha256sum function
lnst.Common.ResourceCache: simplification
lnst.Controller.CtlSecSocket: remove lnst_config import
lnst.Controller.SlaveMachineParser: make standalone
add lnst.Common.InterfaceManagerError
add lnst.Slave.Job
lnst.Slave.InterfaceManager: heavy reimplementation
Machine, NetTestSlave: heavy reimplementation
lnst.Slave.InterfaceManager: remove Device class implementation
add lnst.Controller package imports
lnst/__init__.py remove imports
lnst.Controller: remove old modules
setup.py: add new packages
add lnst.Devices.VirtNetCtl
lnst.Controller: move VirtUtils to VirtDomainCtl, remove VirtNetCtl
class
lnst.Common.Parameters: IpParam accepts Device objects
add example python_recipe.py script
Controller, Devices: removing unused imports
NetTestSlave: create dynamic lnst.Tests package
lnst.Tests: add package docstring
lnst.Common.Parameters: add DeviceParam
lnst.Tests.IcmpPing: use DeviceParam for iface parameter
lnst-slave | 20 +-
lnst/Common/Config.py | 152 +---
lnst/Common/DeviceError.py | 22 +
lnst/Common/DeviceRef.py | 19 +
lnst/Common/ExecCmd.py | 3 +-
lnst/Common/InterfaceManagerError.py | 16 +
lnst/Common/IpAddress.py | 99 +++
lnst/Common/JobError.py | 22 +
lnst/Common/LnstError.py | 18 +
lnst/Common/NetTestCommand.py | 5 +-
lnst/Common/Parameters.py | 157 ++++
lnst/Common/ResourceCache.py | 128 ++--
lnst/Common/SecureSocket.py | 3 +-
lnst/Common/ShellProcess.py | 3 +-
lnst/Common/TestModule.py | 67 ++
lnst/Common/TestsCommon.py | 3 +-
lnst/Common/Utils.py | 11 +
lnst/Controller/Common.py | 17 +
lnst/Controller/Config.py | 99 +++
lnst/Controller/Controller.py | 218 ++++++
lnst/Controller/CtlSecSocket.py | 2 -
lnst/Controller/Host.py | 160 ++++
lnst/Controller/Job.py | 196 +++++
lnst/Controller/Machine.py | 1356 +++++++--------------------------
lnst/Controller/MachineMapper.py | 328 ++++++++
lnst/Controller/MessageDispatcher.py | 203 +++++
lnst/Controller/NetTestController.py | 620 ---------------
lnst/Controller/Recipe.py | 97 +++
lnst/Controller/RecipeParser.py | 572 --------------
lnst/Controller/Requirements.py | 113 +++
lnst/Controller/SlaveMachineParser.py | 144 +++-
lnst/Controller/SlavePool.py | 648 ----------------
lnst/Controller/SlavePoolManager.py | 273 +++++++
lnst/Controller/Task.py | 4 +-
lnst/Controller/VirtDomainCtl.py | 98 +++
lnst/Controller/VirtUtils.py | 268 -------
lnst/Controller/XmlParser.py | 188 -----
lnst/Controller/XmlProcessing.py | 235 ------
lnst/Controller/XmlTemplates.py | 438 -----------
lnst/Controller/__init__.py | 3 +
lnst/Devices/BondDevice.py | 38 +
lnst/Devices/BridgeDevice.py | 33 +
lnst/Devices/Device.py | 355 +++++++++
lnst/Devices/MacvlanDevice.py | 38 +
lnst/Devices/MasterDevice.py | 33 +
lnst/Devices/OvsBridgeDevice.py | 115 +++
lnst/Devices/RemoteDevice.py | 98 +++
lnst/Devices/SoftDevice.py | 51 ++
lnst/Devices/TeamDevice.py | 60 ++
lnst/Devices/VethDevice.py | 58 ++
lnst/Devices/VethPair.py | 24 +
lnst/Devices/VirtNetCtl.py | 85 +++
lnst/Devices/VirtualDevice.py | 98 +++
lnst/Devices/VlanDevice.py | 35 +
lnst/Devices/VtiDevice.py | 71 ++
lnst/Devices/VxlanDevice.py | 65 ++
lnst/Devices/__init__.py | 42 +
lnst/RecipeCommon/ModuleWrap.py | 33 +-
lnst/Slave/Config.py | 73 ++
lnst/Slave/InterfaceManager.py | 648 ++--------------
lnst/Slave/Job.py | 251 ++++++
lnst/Slave/NetTestSlave.py | 846 ++++++++++----------
lnst/Tests/IcmpPing.py | 62 ++
lnst/Tests/__init__.py | 17 +
lnst/__init__.py | 1 -
recipes/examples/python_recipe.py | 32 +
setup.py | 2 +-
67 files changed, 4991 insertions(+), 5301 deletions(-)
create mode 100644 lnst/Common/DeviceError.py
create mode 100644 lnst/Common/DeviceRef.py
create mode 100644 lnst/Common/InterfaceManagerError.py
create mode 100644 lnst/Common/IpAddress.py
create mode 100644 lnst/Common/JobError.py
create mode 100644 lnst/Common/LnstError.py
create mode 100644 lnst/Common/Parameters.py
create mode 100644 lnst/Common/TestModule.py
create mode 100644 lnst/Controller/Common.py
create mode 100644 lnst/Controller/Config.py
create mode 100644 lnst/Controller/Controller.py
create mode 100644 lnst/Controller/Host.py
create mode 100644 lnst/Controller/Job.py
create mode 100644 lnst/Controller/MachineMapper.py
create mode 100644 lnst/Controller/MessageDispatcher.py
delete mode 100644 lnst/Controller/NetTestController.py
create mode 100644 lnst/Controller/Recipe.py
delete mode 100644 lnst/Controller/RecipeParser.py
create mode 100644 lnst/Controller/Requirements.py
delete mode 100644 lnst/Controller/SlavePool.py
create mode 100644 lnst/Controller/SlavePoolManager.py
create mode 100644 lnst/Controller/VirtDomainCtl.py
delete mode 100644 lnst/Controller/VirtUtils.py
delete mode 100644 lnst/Controller/XmlParser.py
delete mode 100644 lnst/Controller/XmlProcessing.py
delete mode 100644 lnst/Controller/XmlTemplates.py
create mode 100644 lnst/Devices/BondDevice.py
create mode 100644 lnst/Devices/BridgeDevice.py
create mode 100644 lnst/Devices/Device.py
create mode 100644 lnst/Devices/MacvlanDevice.py
create mode 100644 lnst/Devices/MasterDevice.py
create mode 100644 lnst/Devices/OvsBridgeDevice.py
create mode 100644 lnst/Devices/RemoteDevice.py
create mode 100644 lnst/Devices/SoftDevice.py
create mode 100644 lnst/Devices/TeamDevice.py
create mode 100644 lnst/Devices/VethDevice.py
create mode 100644 lnst/Devices/VethPair.py
create mode 100644 lnst/Devices/VirtNetCtl.py
create mode 100644 lnst/Devices/VirtualDevice.py
create mode 100644 lnst/Devices/VlanDevice.py
create mode 100644 lnst/Devices/VtiDevice.py
create mode 100644 lnst/Devices/VxlanDevice.py
create mode 100644 lnst/Devices/__init__.py
create mode 100644 lnst/Slave/Config.py
create mode 100644 lnst/Slave/Job.py
create mode 100644 lnst/Tests/IcmpPing.py
create mode 100644 lnst/Tests/__init__.py
create mode 100755 recipes/examples/python_recipe.py
--
2.13.0
6 years, 5 months
[PATCH v2 1/4] PerfRepoUtils: add support for RR test in perfrepo templates
by Jiri Prochazka
This patch adds test_type param to all PerfRepo template functions. When
this param is not specified, it is expected the test to be *_STREAM and
metric labels are throughput, throughput_deviation, etc. When the param
is set to RR, metric labels used are rr_rate, rr_rate_deviation, etc.
This is needed for the new short-lived connections test, where the unit
we measure is not throughput but request/response rate.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Controller/PerfRepoUtils.py | 52 ++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 15 deletions(-)
diff --git a/lnst/Controller/PerfRepoUtils.py b/lnst/Controller/PerfRepoUtils.py
index 4c545e4..8d5a29d 100644
--- a/lnst/Controller/PerfRepoUtils.py
+++ b/lnst/Controller/PerfRepoUtils.py
@@ -14,7 +14,7 @@ olichtne(a)redhat.com (Ondrej Lichtner)
import logging
from lnst.Common.Utils import Noop
-def netperf_baseline_template(module, baseline):
+def netperf_baseline_template(module, baseline, test_type="STREAM"):
module.unset_option('threshold')
module.unset_option('threshold_deviation')
@@ -22,35 +22,51 @@ def netperf_baseline_template(module, baseline):
return module
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return module
logging.debug("Setting Netperf threshold.")
if throughput is not None and deviation is not None:
- module.update_options({'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation})
+ if test_type == "RR":
+ module.update_options({'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation})
+ else:
+ module.update_options({'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation})
return module
-def perfrepo_baseline_to_dict(baseline):
+def perfrepo_baseline_to_dict(baseline, test_type="STREAM"):
if baseline.get_texec() is None:
return {}
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return {}
if throughput is not None and deviation is not None:
- return {'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation}
+ if test_type == "RR":
+ return {'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation}
+ else:
+ return {'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation}
return {}
-def netperf_result_template(perfrepo_result, netperf_result):
+def netperf_result_template(perfrepo_result, netperf_result, test_type="STREAM"):
if isinstance(perfrepo_result, Noop):
return perfrepo_result
@@ -64,9 +80,15 @@ def netperf_result_template(perfrepo_result, netperf_result):
return perfrepo_result
logging.debug("Adding Netperf results to PerfRepo object.")
- perfrepo_result.add_value('throughput', rate)
- perfrepo_result.add_value('throughput_min', rate - deviation)
- perfrepo_result.add_value('throughput_max', rate + deviation)
- perfrepo_result.add_value('throughput_deviation', deviation)
+ if test_type == "RR":
+ perfrepo_result.add_value('rr_rate', rate)
+ perfrepo_result.add_value('rr_rate_min', rate - deviation)
+ perfrepo_result.add_value('rr_rate_max', rate + deviation)
+ perfrepo_result.add_value('rr_rate_deviation', deviation)
+ else:
+ perfrepo_result.add_value('throughput', rate)
+ perfrepo_result.add_value('throughput_min', rate - deviation)
+ perfrepo_result.add_value('throughput_max', rate + deviation)
+ perfrepo_result.add_value('throughput_deviation', deviation)
return perfrepo_result
--
2.9.4
6 years, 5 months
LNST upstream meeting
by Ondrej Lichtner
Hi,
last weeks lnst upstream meeting didn't work out, can we schedule one
for this or next week? What days/times do/don't work for you? We wanted
to talk about agreeing on a specific Device API (naming of methods
etc...).
Personally, I prefer next week Monday, Thursday and Friday.
Also feel free to add more people to this thread in case someone is
interested in joining the meeting.
@jbenc also mentioned an option coming to Brno around 20th of June (confirm?)
this however doesn't work for jtluka so we can either choose a different
date or maybe meet without him?
@jpirko you also wanted to come to Brno what are your options?
-Ondrej
6 years, 5 months
[PATCH 0/3] TC VLAN tests
by Petr Machata
Hi,
this patchset adds a helper to make it simpler to express TC actions.
The goal is not to make it fully expressive like the TC command line,
but rather to abstract away tasts that are repeated over and over again
in recipes.
On top of that I include a test for VLAN modify and for flower matches
on 802.1q tags.
Please consider for inclusion.
Thanks,
Petr Machata
Petr Machata (3):
recipes: switchdev: Add Qdisc helper
recipes: switchdev: tc: Add test for vlan modify action
recipes: switchdev: tc: Add a test for flower vlan matching
recipes/switchdev/TestLib.py | 21 +++++++-
recipes/switchdev/tc-001-action-vlan-modify.py | 44 ++++++++++++++++
recipes/switchdev/tc-001-action-vlan-modify.xml | 24 +++++++++
recipes/switchdev/tc-002-flower-vlan.py | 68 +++++++++++++++++++++++++
recipes/switchdev/tc-002-flower-vlan.xml | 24 +++++++++
5 files changed, 180 insertions(+), 1 deletion(-)
create mode 100644 recipes/switchdev/tc-001-action-vlan-modify.py
create mode 100644 recipes/switchdev/tc-001-action-vlan-modify.xml
create mode 100644 recipes/switchdev/tc-002-flower-vlan.py
create mode 100644 recipes/switchdev/tc-002-flower-vlan.xml
--
2.8.4
6 years, 6 months
[PATCH 1/4] PerfRepoUtils: add support for RR test in perfrepo templates
by Jiri Prochazka
This patch adds test_type param to all PerfRepo template functions. When
this param is not specified, it is expected the test to be *_STREAM and
metric labels are throughput, throughput_deviation, etc. When the param
is set to RR, metric labels used are rr_rate, rr_rate_deviation, etc.
This is needed for the new short-lived connections test, where the unit
we measure is not throughput but request/response rate.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
lnst/Controller/PerfRepoUtils.py | 52 ++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 15 deletions(-)
diff --git a/lnst/Controller/PerfRepoUtils.py b/lnst/Controller/PerfRepoUtils.py
index 4c545e4..8d5a29d 100644
--- a/lnst/Controller/PerfRepoUtils.py
+++ b/lnst/Controller/PerfRepoUtils.py
@@ -14,7 +14,7 @@ olichtne(a)redhat.com (Ondrej Lichtner)
import logging
from lnst.Common.Utils import Noop
-def netperf_baseline_template(module, baseline):
+def netperf_baseline_template(module, baseline, test_type="STREAM"):
module.unset_option('threshold')
module.unset_option('threshold_deviation')
@@ -22,35 +22,51 @@ def netperf_baseline_template(module, baseline):
return module
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return module
logging.debug("Setting Netperf threshold.")
if throughput is not None and deviation is not None:
- module.update_options({'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation})
+ if test_type == "RR":
+ module.update_options({'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation})
+ else:
+ module.update_options({'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation})
return module
-def perfrepo_baseline_to_dict(baseline):
+def perfrepo_baseline_to_dict(baseline, test_type="STREAM"):
if baseline.get_texec() is None:
return {}
try:
- throughput = baseline.get_value('throughput')
- deviation = baseline.get_value('throughput_deviation')
+ if test_type == "RR":
+ throughput = baseline.get_value('rr_rate')
+ deviation = baseline.get_value('rr_rate_deviation')
+ else:
+ throughput = baseline.get_value('throughput')
+ deviation = baseline.get_value('throughput_deviation')
except:
logging.error("Invalid baseline TestExecution passed.")
return {}
if throughput is not None and deviation is not None:
- return {'threshold': '%s bits/sec' % throughput,
- 'threshold_deviation': '%s bits/sec' % deviation}
+ if test_type == "RR":
+ return {'threshold': '%s Trans/sec' % throughput,
+ 'threshold_deviation': '%s Trans/sec' % deviation}
+ else:
+ return {'threshold': '%s bits/sec' % throughput,
+ 'threshold_deviation': '%s bits/sec' % deviation}
return {}
-def netperf_result_template(perfrepo_result, netperf_result):
+def netperf_result_template(perfrepo_result, netperf_result, test_type="STREAM"):
if isinstance(perfrepo_result, Noop):
return perfrepo_result
@@ -64,9 +80,15 @@ def netperf_result_template(perfrepo_result, netperf_result):
return perfrepo_result
logging.debug("Adding Netperf results to PerfRepo object.")
- perfrepo_result.add_value('throughput', rate)
- perfrepo_result.add_value('throughput_min', rate - deviation)
- perfrepo_result.add_value('throughput_max', rate + deviation)
- perfrepo_result.add_value('throughput_deviation', deviation)
+ if test_type == "RR":
+ perfrepo_result.add_value('rr_rate', rate)
+ perfrepo_result.add_value('rr_rate_min', rate - deviation)
+ perfrepo_result.add_value('rr_rate_max', rate + deviation)
+ perfrepo_result.add_value('rr_rate_deviation', deviation)
+ else:
+ perfrepo_result.add_value('throughput', rate)
+ perfrepo_result.add_value('throughput_min', rate - deviation)
+ perfrepo_result.add_value('throughput_max', rate + deviation)
+ perfrepo_result.add_value('throughput_deviation', deviation)
return perfrepo_result
--
2.9.4
6 years, 6 months