[lnst] XmlProcessing: Adding possition info to DOM root
by Jiří Pírko
commit 9871e066bf500ee4609675a9830f8575c8f3678b
Author: Radek Pazdera <rpazdera(a)redhat.com>
Date: Mon Oct 8 15:36:39 2012 +0200
XmlProcessing: Adding possition info to DOM root
Error reporting didn't work correctly when an error happended on
the root level of the tree.
This patch adds the position information to the root as well.
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
Common/XmlProcessing.py | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
---
diff --git a/Common/XmlProcessing.py b/Common/XmlProcessing.py
index 4f26958..47d3702 100644
--- a/Common/XmlProcessing.py
+++ b/Common/XmlProcessing.py
@@ -122,6 +122,8 @@ class XmlDomTreeInit:
exc.set_pos(pos)
raise exc
+ pos = {"file": self._filename, "line": 0, "col": 0}
+ dom.parse_position = pos
return dom
11 years, 7 months
[lnst] XmlProcessing: Normalize paths in XmlDomTreeInit
by Jiří Pírko
commit 1fb2dec7749618d7dd6305cc863ace7f9948362e
Author: Radek Pazdera <rpazdera(a)redhat.com>
Date: Mon Oct 8 15:36:38 2012 +0200
XmlProcessing: Normalize paths in XmlDomTreeInit
Path passed to XmlTreeInit.parse_string() is now stripped
to a filename only, so the error messages don't get too long.
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
Common/XmlProcessing.py | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
---
diff --git a/Common/XmlProcessing.py b/Common/XmlProcessing.py
index b3c0109..4f26958 100644
--- a/Common/XmlProcessing.py
+++ b/Common/XmlProcessing.py
@@ -111,11 +111,11 @@ class XmlDomTreeInit:
return self.parse_string(xml_text, filename)
def parse_string(self, xml_text, filename="xml_string"):
- self._filename = filename
+ self._filename = os.path.basename(filename)
try:
dom = parseString(xml_text, self._sax)
except sax.SAXParseException, err:
- pos = {"file": filename,
+ pos = {"file": self._filename,
"line": err.getLineNumber(),
"col": err.getColumnNumber()}
exc = XmlProcessingError(err.getMessage())
11 years, 7 months
[lnst] Forgot to change file_path to new RecipePath in case of error
by Jiří Pírko
commit 62ee9f67baf01c4ef96915fa922c9a7c4134f8bc
Author: Jan Tluka <jtluka(a)redhat.com>
Date: Mon Oct 8 15:37:57 2012 +0200
Forgot to change file_path to new RecipePath in case of error
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
Common/XmlProcessing.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/Common/XmlProcessing.py b/Common/XmlProcessing.py
index 2ae5f4c..b3c0109 100644
--- a/Common/XmlProcessing.py
+++ b/Common/XmlProcessing.py
@@ -302,7 +302,7 @@ class RecipeParser(XmlParser):
loaded_node = dom.getElementsByTagName(node.nodeName)[0]
except Exception:
msg = ("No '%s' element present in included file '%s'."
- % (node.nodeName, file_path))
+ % (node.nodeName, source_rp.abs_path()))
raise XmlProcessingError(msg, node)
old_attrs = self._get_all_attributes(node)
11 years, 7 months
[PATCH v2 0/7] Machine Provisioning Support
by Radek Pazdera
This is a second revison of the patch. The following things were changed:
* <machineconfig provisioned="true"> to <machinerequires>
* some code cleanup in MachinePool.py
###
This patch series introduces full provisioning support to LNST.
It allows you to create a pool of machines at the controler and then
create tests that can provision machines from that pool and run tests
on them instead of supplying their own configuration for machines.
This idea is useful, because it separates the hardware configuration
from the recipe, so you don't need to rely on any specific hardware
details other than that are important for your test.
To use provisioning, all you need to do is set the 'provisioned' parameter
of the <machineconfig> that you want to have provisioned. It is vital to
point out, that mixing of provisioned machines with your own machineconfigs
is not supported at the moment (and probably will never be). You can chose
either to provision the whole setup or none of it.
Here is an example of provisioned machine's config:
<machinerequires>
<netdevices>
<netdevice network="ttnet" phys_id="1" type="eth"/>
<netdevice network="ttnet" phys_id="2"/>
</netdevices>
</machinerequires>
This machineconfig indicates, that it wants a machine that has two interfaces
plugged into the same network and at least one needs to be of type ethernet.
You can specify even more information about the machine, such as,
* hostname (do this when you want a specific machine from the pool)
* libvirt_domain
* device hwaddr
* device type
More of these parameters will probably be added in the future.
LNST will take this config, find a suitable provisioner machine and run your
test there.
The pool of machines is a set of directories (can be configured in the
lnst.conf file) with a machineconfig per file.
For instance this is a machine from my pool fedora16-clone.xml:
<machineconfig>
<info hostname="192.168.122.10" libvirt_domain="Fedora16-clone"
rootpass="redhat"/>
<netdevices>
<netdevice network="tnet" phys_id="1" type="eth" hwaddr="52:54:00:e4:75:16"/>
<netdevice network="tnet" phys_id="2" type="eth" hwaddr="52:54:00:91:01:9c"/>
<netdevice network="tnet" phys_id="3" type="eth" hwaddr="52:54:00:94:b7:32"/>
<netdevice network="tnet" phys_id="4" type="eth" hwaddr="52:54:00:f3:a1:b4"/>
</netdevices>
</machineconfig>
I will write some more detailed documentation and how to to the wiki next
week.
I hope I didn't break anything, if so, please let me know and I'll fix it
as soon as I can :).
Cheers,
Radek
Radek Pazdera (7):
XmlProcessing: Normalize paths in XmlDomTreeInit
XmlProcessing: Adding possition info to DOM root
XmlProcessing: Adding default handler to XmlParser
NetTestSlave: Adding method for turning of ifaces
MachinePool: Adding provisioning support
NetTestController: Adding support for provisioning
NetTestParse: Adding support for provisioning
Common/XmlProcessing.py | 16 +-
NetTest/MachinePool.py | 491 +++++++++++++++++++++++++++++++++++++++++-
NetTest/NetTestController.py | 31 +++
NetTest/NetTestParse.py | 153 +++++++++++++-
NetTest/NetTestSlave.py | 9 +
5 files changed, 683 insertions(+), 17 deletions(-)
--
1.7.7.6
11 years, 7 months
[PATCH] Forgot to change file_path to new RecipePath in case of error
by Jan Tluka
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
Common/XmlProcessing.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/Common/XmlProcessing.py b/Common/XmlProcessing.py
index 2ae5f4c..b3c0109 100644
--- a/Common/XmlProcessing.py
+++ b/Common/XmlProcessing.py
@@ -302,7 +302,7 @@ class RecipeParser(XmlParser):
loaded_node = dom.getElementsByTagName(node.nodeName)[0]
except Exception:
msg = ("No '%s' element present in included file '%s'."
- % (node.nodeName, file_path))
+ % (node.nodeName, source_rp.abs_path()))
raise XmlProcessingError(msg, node)
old_attrs = self._get_all_attributes(node)
--
1.7.7.6
11 years, 7 months
Machine Pool User Manual on Wiki
by Radek Pazdera
Hi!
I created a draft of an user manual for the machine pool/provisioning.
It is available on wiki:
https://fedorahosted.org/lnst/wiki/MachinePool
Does it look ok? I used the ascii art idea from Honza (thanks for
that) :-).
If you find anything, let me know. Or feel free to edit the article
right away. I'm not sure if I explained everything properly.
Radek
11 years, 7 months
[PATCH 0/7] Machine Provisioning Support
by Radek Pazdera
This patch series introduces full provisioning support to LNST.
It allows you to create a pool of machines at the controler and then
create tests that can provision machines from that pool and run tests
on them instead of supplying their own configuration for machines.
This idea is useful, because it separates the hardware configuration
from the recipe, so you don't need to rely on any specific hardware
details other than that are important for your test.
To use provisioning, all you need to do is set the 'provisioned' parameter
of the <machineconfig> that you want to have provisioned. It is vital to
point out, that mixing of provisioned machines with your own machineconfigs
is not supported at the moment (and probably will never be). You can chose
either to provision the whole setup or none of it.
Here is an example of provisioned machine's config:
<machineconfig provisioned="true">
<netdevices>
<netdevice network="ttnet" phys_id="1" type="eth"/>
<netdevice network="ttnet" phys_id="2"/>
</netdevices>
</machineconfig>
This machineconfig indicates, that it wants a machine that has two interfaces
plugged into the same network and at least one needs to be of type ethernet.
You can specify even more information about the machine, such as,
* hostname (do this when you want a specific machine from the pool)
* libvirt_domain
* device hwaddr
* device type
More of these parameters will probably be added in the future.
LNST will take this config, find a suitable provisioner machine and run your
test there.
The pool of machines is a set of directories (can be configured in the
lnst.conf file) with a machineconfig per file.
For instance this is a machine from my pool fedora16-clone.xml:
<machineconfig>
<info hostname="192.168.122.10" libvirt_domain="Fedora16-clone"
rootpass="redhat"/>
<netdevices>
<netdevice network="tnet" phys_id="1" type="eth" hwaddr="52:54:00:e4:75:16"/>
<netdevice network="tnet" phys_id="2" type="eth" hwaddr="52:54:00:91:01:9c"/>
<netdevice network="tnet" phys_id="3" type="eth" hwaddr="52:54:00:94:b7:32"/>
<netdevice network="tnet" phys_id="4" type="eth" hwaddr="52:54:00:f3:a1:b4"/>
</netdevices>
</machineconfig>
I will write some more detailed documentation and how to to the wiki next
week.
I hope I didn't break anything, if so, please let me know and I'll fix it
as soon as I can :).
Cheers,
Radek
Radek Pazdera (7):
XmlProcessing: Normalize paths in XmlDomTreeInit
XmlProcessing: Adding possition info to DOM root
XmlProcessing: Adding default handler to XmlParser
NetTestSlave: Adding method for turning of ifaces
MachinePool: Adding provisioning support
NetTestController: Adding support for provisioning
NetTestParse: Adding support for provisioning
Common/XmlProcessing.py | 16 +-
NetTest/MachinePool.py | 488 +++++++++++++++++++++++++++++++++++++++++-
NetTest/NetTestController.py | 31 +++
NetTest/NetTestParse.py | 153 +++++++++++++-
NetTest/NetTestSlave.py | 9 +
5 files changed, 680 insertions(+), 17 deletions(-)
--
1.7.7.6
11 years, 7 months
[lnst] recipes: team: add active loadbalance func testing recipes
by Jiří Pírko
commit cf359ae27b73a7436a24786cc004fdfcad49c62c
Author: Jiri Pirko <jiri(a)resnulli.us>
Date: Fri Oct 5 17:51:11 2012 +0200
recipes: team: add active loadbalance func testing recipes
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
recipes/team/recipey_lacp_act_flows.xml | 21 +++++++++++++++++++++
recipes/team/recipey_lb_act_flows.xml | 21 +++++++++++++++++++++
recipes/team/sequence_pktgen_flows.xml | 22 ++++++++++++++++++++++
3 files changed, 64 insertions(+), 0 deletions(-)
---
diff --git a/recipes/team/recipey_lacp_act_flows.xml b/recipes/team/recipey_lacp_act_flows.xml
new file mode 100644
index 0000000..82c4166
--- /dev/null
+++ b/recipes/team/recipey_lacp_act_flows.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_pktgen_flows.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/recipey_lb_act_flows.xml b/recipes/team/recipey_lb_act_flows.xml
new file mode 100644
index 0000000..c2f6abd
--- /dev/null
+++ b/recipes/team/recipey_lb_act_flows.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lb_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-simple_br.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_pktgen_flows.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/sequence_pktgen_flows.xml b/recipes/team/sequence_pktgen_flows.xml
new file mode 100644
index 0000000..9975f86
--- /dev/null
+++ b/recipes/team/sequence_pktgen_flows.xml
@@ -0,0 +1,22 @@
+<command_sequence>
+ <command type="exec" value="sleep 4"/>
+ <command machine_id="1" type="test" value="PktgenTx" bg_id="1">
+ <options>
+ <option name="pktgen_option" value="count 0"/>
+ <option name="pktgen_option" value="clone_skb 0"/>
+ <option name="pktgen_option" value="flag IPDST_RND"/>
+ <option name="pktgen_option" value="flag TXSIZE_RND"/>
+ <option name="pktgen_option" value="dst_min 172.0.0.1"/>
+ <option name="pktgen_option" value="dst_max 172.0.0.200"/>
+ <option name="pktgen_option" value="src_min {ip(1,testiface)}"/>
+ <option name="pktgen_option" value="dst_mac 00:11:22:33:44:66"/>
+ <option name="pktgen_option" value="min_pkt_size 60"/>
+ <option name="pktgen_option" value="max_pkt_size 1000"/>
+ <option name="pktgen_option" value="flows 128"/>
+ <option name="pktgen_option" value="flowlen 20000"/>
+ <option name="netdev_name" value="{devname(1,testiface)}"/>
+ </options>
+ </command>
+ <command type="exec" value="sleep 400"/>
+ <command machine_id="1" type="intr" value="1"/>
+</command_sequence>
11 years, 7 months
[lnst] recipes: team: add lacp active loadbalancing recipes
by Jiří Pírko
commit 83a9fca68a96fa4659bbeb789c5a4d53f155cc1f
Author: Jiri Pirko <jiri(a)resnulli.us>
Date: Fri Oct 5 17:55:10 2012 +0200
recipes: team: add lacp active loadbalancing recipes
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
recipes/team/netconfig-team_lacp_act.xml | 41 ++++++++++++++++++++++++++++++
recipes/team/recipex_lacp_act_001.xml | 21 +++++++++++++++
recipes/team/recipex_lacp_act_002.xml | 36 ++++++++++++++++++++++++++
recipes/team/recipex_lacp_act_003.xml | 21 +++++++++++++++
recipes/team/recipex_lacp_act_004.xml | 21 +++++++++++++++
5 files changed, 140 insertions(+), 0 deletions(-)
---
diff --git a/recipes/team/netconfig-team_lacp_act.xml b/recipes/team/netconfig-team_lacp_act.xml
new file mode 100644
index 0000000..386e1a4
--- /dev/null
+++ b/recipes/team/netconfig-team_lacp_act.xml
@@ -0,0 +1,41 @@
+<netconfig>
+ <interface id="1" phys_id="1" type="eth">
+ <options>
+ <option name="teamd_port_config">
+ {
+ "prio": -10
+ }
+ </option>
+ </options>
+ </interface>
+ <interface id="2" phys_id="2" type="eth"/>
+ <interface id="3" phys_id="3" type="eth"/>
+ <interface id="testiface" type="team">
+ <options>
+ <option name="teamd_config">
+ {
+ "hwaddr": "00:11:22:33:44:55",
+ "runner": {
+ "name": "lacp",
+ "active": true,
+ "fast_rate": true,
+ "tx_hash": ["eth", "ipv4", "ipv6"],
+ "tx_balancer": {
+ "name": "basic"
+ }
+ },
+ "link_watch": {"name": "ethtool"}
+ }
+ </option>
+ </options>
+ <slaves>
+ <slave id="1"/>
+ <slave id="2"/>
+ <slave id="3"/>
+ </slaves>
+ <addresses>
+ <address value="{$testip}"/>
+ <address value="{$testip6}"/>
+ </addresses>
+ </interface>
+</netconfig>
diff --git a/recipes/team/recipex_lacp_act_001.xml b/recipes/team/recipex_lacp_act_001.xml
new file mode 100644
index 0000000..8fcbe2a
--- /dev/null
+++ b/recipes/team/recipex_lacp_act_001.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_ping_simple.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/recipex_lacp_act_002.xml b/recipes/team/recipex_lacp_act_002.xml
new file mode 100644
index 0000000..c338571
--- /dev/null
+++ b/recipes/team/recipex_lacp_act_002.xml
@@ -0,0 +1,36 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <define>
+ <alias name="multicast_group" value="239.1.2.3"/>
+ <alias name="port" value="1337"/>
+ <alias name="test_duration" value="10"/>
+ <alias name="send_delay" value="0.1"/>
+ <alias name="nonexistent_ip" value="127.0.0.200"/>
+ </define>
+
+ <command_sequence source="../multicast/cmd_sequences/max_groups.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/block_source.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/source_membership.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/membership.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/if.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/ttl.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/loop.xml"/>
+ <command_sequence source="../multicast/cmd_sequences/simple.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/recipex_lacp_act_003.xml b/recipes/team/recipex_lacp_act_003.xml
new file mode 100644
index 0000000..a1bc09c
--- /dev/null
+++ b/recipes/team/recipex_lacp_act_003.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_pktgen_lacp.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/recipex_lacp_act_004.xml b/recipes/team/recipex_lacp_act_004.xml
new file mode 100644
index 0000000..e3b5d05
--- /dev/null
+++ b/recipes/team/recipex_lacp_act_004.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp_act.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_iperf.xml"/>
+</nettestrecipe>
11 years, 7 months
[lnst] recipes: team: add hash test recipes
by Jiří Pírko
commit 62620bf86beae965eebcfcb7b152060bbf486873
Author: Jiri Pirko <jiri(a)resnulli.us>
Date: Thu Oct 4 18:19:21 2012 +0200
recipes: team: add hash test recipes
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
recipes/team/recipey_lacp_hashes.xml | 21 +++++++++++++++++++++
recipes/team/recipey_lb_hashes.xml | 21 +++++++++++++++++++++
recipes/team/sequence_pktgen_hashes.xml | 14 ++++++++++++++
3 files changed, 56 insertions(+), 0 deletions(-)
---
diff --git a/recipes/team/recipey_lacp_hashes.xml b/recipes/team/recipey_lacp_hashes.xml
new file mode 100644
index 0000000..8e648d6
--- /dev/null
+++ b/recipes/team/recipey_lacp_hashes.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lacp.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-bond_lacp.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_pktgen_hashes.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/recipey_lb_hashes.xml b/recipes/team/recipey_lb_hashes.xml
new file mode 100644
index 0000000..4180aa4
--- /dev/null
+++ b/recipes/team/recipey_lb_hashes.xml
@@ -0,0 +1,21 @@
+<nettestrecipe>
+ <machines>
+ <define>
+ <alias name="testip" value="192.168.111.1/24"/>
+ <alias name="testip6" value="fe01::1/64"/>
+ </define>
+ <machine id="1">
+ <machineconfig source="machineconfig-peanut.xml"/>
+ <netconfig source="netconfig-team_lb.xml"/>
+ </machine>
+ <define>
+ <alias name="testip" value="192.168.111.2/24"/>
+ <alias name="testip6" value="fe01::2/64"/>
+ </define>
+ <machine id="2">
+ <machineconfig source="machineconfig-dhcp-37-128.xml"/>
+ <netconfig source="netconfig-simple_br.xml"/>
+ </machine>
+ </machines>
+ <command_sequence source="sequence_pktgen_hashes.xml"/>
+</nettestrecipe>
diff --git a/recipes/team/sequence_pktgen_hashes.xml b/recipes/team/sequence_pktgen_hashes.xml
new file mode 100644
index 0000000..978e8c1
--- /dev/null
+++ b/recipes/team/sequence_pktgen_hashes.xml
@@ -0,0 +1,14 @@
+<command_sequence>
+ <command type="exec" value="sleep 4"/>
+ <command machine_id="1" type="test" value="PktgenTx" timeout="200">
+ <options>
+ <option name="pktgen_option" value="count 10000"/>
+ <option name="pktgen_option" value="clone_skb 0"/>
+ <option name="pktgen_option" value="dst_min 172.0.0.1"/>
+ <option name="pktgen_option" value="dst_max 172.0.0.10"/>
+ <option name="pktgen_option" value="dst_mac 00:11:22:33:44:55"/>
+ <option name="pktgen_option" value="src_min {ip(1,testiface)}"/>
+ <option name="netdev_name" value="{devname(1,testiface)}"/>
+ </options>
+ </command>
+</command_sequence>
11 years, 7 months