[patch lnst] Task: add fail_expected boolean arg
by Jiri Pirko
From: Jiri Pirko <jiri(a)mellanox.com>
Similar to "expected". But that for some odd reason does not accept
bool, but rather "pass" of "fail".
Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
---
lnst/Controller/Task.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 48aa0fe..7f9dc8e 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -236,6 +236,8 @@ class HostAPI(object):
raise TaskError(msg)
cmd["expect"] = argval == "pass"
+ elif arg == "fail_expected":
+ cmd["expect"] = not argval
elif arg == "timeout":
try:
cmd["timeout"] = int(argval)
--
2.4.3
8 years, 4 months
[PATCH] Controller: print the path instead of object for nonexistent
python task
by Jan Tluka
This is a simple fix if user specified non existing python task in xml.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Controller/NetTestController.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py
index fd029cb..0051c4d 100644
--- a/lnst/Controller/NetTestController.py
+++ b/lnst/Controller/NetTestController.py
@@ -374,7 +374,7 @@ class NetTestController:
task["python"] = path
if not path.exists():
- msg = "Task file '%s' not found." % path
+ msg = "Task file '%s' not found." % path.to_str()
raise RecipeError(msg, task_data)
self._tasks.append(task)
--
2.4.3
8 years, 4 months
[patch lnst 1/2] NetConfigDevice: add support for bridge sysfs options
by Jiri Pirko
Similar to what bonding has. This allows user to setup needed bridge
options.
Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
---
lnst/Slave/NetConfigDevice.py | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 5de8c73..85eef7f 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -174,6 +174,19 @@ class NetConfigDeviceBridge(NetConfigDeviceGeneric):
def _add_rm_bridge(self, prefix):
exec_cmd("brctl %sbr %s " % (prefix, self._dev_config["name"]))
+ def _get_bridge_dir(self):
+ return "/sys/class/net/%s/bridge" % self._dev_config["name"]
+
+ def _setup_options(self):
+ if not "options" in self._dev_config:
+ return
+ options = self._dev_config["options"]
+
+ for option, value in options:
+ exec_cmd('echo "%s" > %s/%s' % (value,
+ self._get_bridge_dir(),
+ option))
+
def _add_rm_port(self, prefix, slave_id):
port_name = self._if_manager.get_mapped_device(slave_id).get_name()
exec_cmd("brctl %sif %s %s" % (prefix, self._dev_config["name"],
@@ -190,6 +203,7 @@ class NetConfigDeviceBridge(NetConfigDeviceGeneric):
self._add_rm_bridge("del")
def configure(self):
+ self._setup_options()
self._add_rm_ports("add")
def deconfigure(self):
--
2.4.3
8 years, 4 months
[PATCH 1/2] recipes: fix ip6 addresses in regression tests
by Jan Tluka
The patch changes the IPv6 addresses used in phase1 and phase2 tests.
Instead of 2002: prefix that is used for documentation purposes the tests
now use local IPv6 unicast addresses as described in RFC 4193.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
recipes/regression_tests/phase1/3_vlans.xml | 12 ++++++------
.../phase1/3_vlans_over_active_backup_bond.xml | 12 ++++++------
.../virtual_bridge_2_vlans_over_active_backup_bond.xml | 8 ++++----
.../regression_tests/phase1/virtual_bridge_vlan_in_guest.xml | 4 ++--
.../regression_tests/phase1/virtual_bridge_vlan_in_host.xml | 4 ++--
.../phase2/3_vlans_over_active_backup_team.xml | 12 ++++++------
.../virtual_ovs_bridge_2_vlans_over_active_backup_bond.xml | 8 ++++----
.../phase2/virtual_ovs_bridge_vlan_in_guest.xml | 4 ++--
.../phase2/virtual_ovs_bridge_vlan_in_host.xml | 4 ++--
9 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/recipes/regression_tests/phase1/3_vlans.xml b/recipes/regression_tests/phase1/3_vlans.xml
index 064475e..b530269 100644
--- a/recipes/regression_tests/phase1/3_vlans.xml
+++ b/recipes/regression_tests/phase1/3_vlans.xml
@@ -29,7 +29,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.1/24" />
- <address value="2002::10:1/64" />
+ <address value="fc00:0:0:10::1/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -41,7 +41,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.1/24" />
- <address value="2002::20:1/64" />
+ <address value="fc00:0:0:20::1/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -53,7 +53,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.1/24" />
- <address value="2002::30:1/64" />
+ <address value="fc00:0:0:30::1/64" />
</addresses>
</vlan>
</interfaces>
@@ -70,7 +70,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.2/24" />
- <address value="2002::10:2/64" />
+ <address value="fc00:0:0:10::2/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -82,7 +82,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.2/24" />
- <address value="2002::20:2/64" />
+ <address value="fc00:0:0:20::2/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -94,7 +94,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.2/24" />
- <address value="2002::30:2/64" />
+ <address value="fc00:0:0:30::2/64" />
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase1/3_vlans_over_active_backup_bond.xml b/recipes/regression_tests/phase1/3_vlans_over_active_backup_bond.xml
index ca63ddb..4ecb507 100644
--- a/recipes/regression_tests/phase1/3_vlans_over_active_backup_bond.xml
+++ b/recipes/regression_tests/phase1/3_vlans_over_active_backup_bond.xml
@@ -43,7 +43,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.1/24" />
- <address value="2002::10:1/64" />
+ <address value="fc00:0:0:10::1/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -55,7 +55,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.1/24" />
- <address value="2002::20:1/64" />
+ <address value="fc00:0:0:20::1/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -67,7 +67,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.1/24" />
- <address value="2002::30:1/64" />
+ <address value="fc00:0:0:30::1/64" />
</addresses>
</vlan>
</interfaces>
@@ -84,7 +84,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.2/24" />
- <address value="2002::10:2/64" />
+ <address value="fc00:0:0:10::2/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -96,7 +96,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.2/24" />
- <address value="2002::20:2/64" />
+ <address value="fc00:0:0:20::2/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -108,7 +108,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.2/24" />
- <address value="2002::30:2/64" />
+ <address value="fc00:0:0:30::2/64" />
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
index 7af6b2b..1cdd708 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_2_vlans_over_active_backup_bond.xml
@@ -75,7 +75,7 @@
<eth id="guestnic" label="to_guest1">
<addresses>
<address>{$vlan10_net}.100/24</address>
- <address value="2002::10:100/64"/>
+ <address value="fc00:0:0:10::100/64"/>
</addresses>
</eth>
</interfaces>
@@ -85,7 +85,7 @@
<eth id="guestnic" label="to_guest2">
<addresses>
<address>{$vlan20_net}.100/24</address>
- <address value="2002::20:100/64"/>
+ <address value="fc00:0:0:20::100/64"/>
</addresses>
</eth>
</interfaces>
@@ -151,7 +151,7 @@
<eth id="guestnic" label="to_guest3">
<addresses>
<address>{$vlan10_net}.101/24</address>
- <address value="2002::10:101/64"/>
+ <address value="fc00:0:0:10::101/64"/>
</addresses>
</eth>
</interfaces>
@@ -161,7 +161,7 @@
<eth id="guestnic" label="to_guest4">
<addresses>
<address>{$vlan20_net}.101/24</address>
- <address value="2002::20:101/64"/>
+ <address value="fc00:0:0:20::101/64"/>
</addresses>
</eth>
</interfaces>
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
index f710d0a..a483e3b 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_guest.xml
@@ -44,7 +44,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.10/24</address>
- <address>2002::10:10/64</address>
+ <address>fc00:0:0:10::10/64</address>
</addresses>
</vlan>
</interfaces>
@@ -61,7 +61,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.11/24</address>
- <address>2002::10:11/64</address>
+ <address>fc00:0:0:10::11/64</address>
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
index 5d403b2..2318cfb 100644
--- a/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
+++ b/recipes/regression_tests/phase1/virtual_bridge_vlan_in_host.xml
@@ -44,7 +44,7 @@
</params>
<addresses>
<address>{$vlan10_net}.10/24</address>
- <address>2002::10:10/64</address>
+ <address>fc00:0:0:10::10/64</address>
</addresses>
</eth>
</interfaces>
@@ -61,7 +61,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.11/24</address>
- <address>2002::10:11/64</address>
+ <address>fc00:0:0:10::11/64</address>
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase2/3_vlans_over_active_backup_team.xml b/recipes/regression_tests/phase2/3_vlans_over_active_backup_team.xml
index 9adac61..d323141 100644
--- a/recipes/regression_tests/phase2/3_vlans_over_active_backup_team.xml
+++ b/recipes/regression_tests/phase2/3_vlans_over_active_backup_team.xml
@@ -47,7 +47,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.1/24" />
- <address value="2002::10:1/64" />
+ <address value="fc00:0:0:10::1/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -59,7 +59,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.1/24" />
- <address value="2002::20:1/64" />
+ <address value="fc00:0:0:20::1/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -71,7 +71,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.1/24" />
- <address value="2002::30:1/64" />
+ <address value="fc00:0:0:30::1/64" />
</addresses>
</vlan>
</interfaces>
@@ -88,7 +88,7 @@
</slaves>
<addresses>
<address value="{$vlan10_net}.2/24" />
- <address value="2002::10:2/64" />
+ <address value="fc00:0:0:10::2/64" />
</addresses>
</vlan>
<vlan id="vlan20">
@@ -100,7 +100,7 @@
</slaves>
<addresses>
<address value="{$vlan20_net}.2/24" />
- <address value="2002::20:2/64" />
+ <address value="fc00:0:0:20::2/64" />
</addresses>
</vlan>
<vlan id="vlan30">
@@ -112,7 +112,7 @@
</slaves>
<addresses>
<address value="{$vlan30_net}.2/24" />
- <address value="2002::30:2/64" />
+ <address value="fc00:0:0:30::2/64" />
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.xml b/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.xml
index 58f0a9f..b692461 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.xml
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_2_vlans_over_active_backup_bond.xml
@@ -55,7 +55,7 @@
<eth id="guestnic" label="to_guest1">
<addresses>
<address>{$vlan10_net}.100/24</address>
- <address>2002::10:100/64</address>
+ <address>fc00:0:0:10::100/64</address>
</addresses>
</eth>
</interfaces>
@@ -65,7 +65,7 @@
<eth id="guestnic" label="to_guest2">
<addresses>
<address>{$vlan20_net}.100/24</address>
- <address>2002::20:100/64</address>
+ <address>fc00:0:0:20::100/64</address>
</addresses>
</eth>
</interfaces>
@@ -112,7 +112,7 @@
<eth id="guestnic" label="to_guest3">
<addresses>
<address>{$vlan10_net}.101/24</address>
- <address>2002::10:101/64</address>
+ <address>fc00:0:0:10::101/64</address>
</addresses>
</eth>
</interfaces>
@@ -122,7 +122,7 @@
<eth id="guestnic" label="to_guest4">
<addresses>
<address>{$vlan20_net}.101/24</address>
- <address>2002::20:100/64</address>
+ <address>fc00:0:0:20::101/64</address>
</addresses>
</eth>
</interfaces>
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.xml b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.xml
index 30bac5f..5dad461 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.xml
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_guest.xml
@@ -40,7 +40,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.10/24</address>
- <address>2002::10:10/64</address>
+ <address>fc00:0:0:10::10/64</address>
</addresses>
</vlan>
</interfaces>
@@ -57,7 +57,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.11/24</address>
- <address>2002::10:11/64</address>
+ <address>fc00:0:0:10::11/64</address>
</addresses>
</vlan>
</interfaces>
diff --git a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.xml b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.xml
index 02f5c6d..5398d93 100644
--- a/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.xml
+++ b/recipes/regression_tests/phase2/virtual_ovs_bridge_vlan_in_host.xml
@@ -37,7 +37,7 @@
</params>
<addresses>
<address>{$vlan10_net}.10/24</address>
- <address>2002::10:10/64</address>
+ <address>fc00:0:0:10::10/64</address>
</addresses>
</eth>
</interfaces>
@@ -55,7 +55,7 @@
</slaves>
<addresses>
<address>{$vlan10_net}.11/24</address>
- <address>2002::10:11/64</address>
+ <address>fc00:0:0:10::11/64</address>
</addresses>
</vlan>
</interfaces>
--
2.4.3
8 years, 4 months
[PATCH] lnst-ctl: accept directoris with the --pools option
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
The --pools option now also accepts a directory path instead of just
pool names. Pool names still have the priority now so if you want to
specify a directory the path you specify can't be the same as the name
of some pool. An easy way to do this is to just include the final '/'
character.
Expands on issue #157
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst-ctl | 3 ++-
lnst/Controller/NetTestController.py | 2 ++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/lnst-ctl b/lnst-ctl
index c991247..bf97c1f 100755
--- a/lnst-ctl
+++ b/lnst-ctl
@@ -52,7 +52,8 @@ def usage(retval=0):
print " -p, --packet-capture capture and log all ongoing " \
"network communication during the test"
print " --pools=NAME[,...] restricts which pools to use "\
- "for matching"
+ "for matching, value can be a comma separated list of values or"
+ print " --pools=PATH a single path to a pool directory"
print " -r, --reduce-sync reduces resource synchronization "\
"for python tasks, see documentation"
print " -s, --xslt-url=URL URL to a XSLT document that will "\
diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py
index 2afa992..fd029cb 100644
--- a/lnst/Controller/NetTestController.py
+++ b/lnst/Controller/NetTestController.py
@@ -83,6 +83,8 @@ class NetTestController:
for pool_name in restrict_pools:
if pool_name in conf_pools:
pools[pool_name] = conf_pools[pool_name]
+ elif len(restrict_pools) == 1 and os.path.isdir(pool_name):
+ pools = {"cmd_line_pool": pool_name}
else:
raise NetTestError("Pool %s does not exist!" % pool_name)
else:
--
2.6.4
8 years, 4 months
[PATCH 1/6] VirtUtils: later initialization of libvirt connection
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
The connection to libvirt should only be initialized if it's going to be
used. This should solve problems with LNST crashing because of libvirt
errors when running recipes that don't use virtual machines.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/VirtUtils.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/lnst/Controller/VirtUtils.py b/lnst/Controller/VirtUtils.py
index 9d2a6ff..54baabc 100644
--- a/lnst/Controller/VirtUtils.py
+++ b/lnst/Controller/VirtUtils.py
@@ -20,7 +20,12 @@ from lnst.Common.NetUtils import scan_netdevs
#this is a global object because opening the connection to libvirt in every
#object instance that uses it sometimes fails - the libvirt server probably
#can't handle that many connections at a time
-_libvirt_conn = libvirt.open(None)
+_libvirt_conn = None
+
+def init_libvirt_con():
+ global _libvirt_conn
+ if _libvirt_conn is None:
+ _libvirt_conn = libvirt.open(None)
class VirtUtilsError(Exception):
pass
@@ -74,6 +79,8 @@ class VirtDomainCtl:
self._name = domain_name
self._created_interfaces = {}
+ init_libvirt_con()
+
try:
self._domain = _libvirt_conn.lookupByName(domain_name)
except:
@@ -147,6 +154,8 @@ class VirtNetCtl(NetCtl):
"""
def __init__(self, name=None):
+ init_libvirt_con()
+
if not name:
name = self._generate_name()
self._name = name
--
2.6.4
8 years, 4 months
[PATCH 1/2] regression-tests: add simple_netperf test
by Jiri Prochazka
This patch adds new test to phase1 of ENRT. The topology is
the same as in ping_flood test, but instead of ping, only
netperf is run.
This tests covers raw performance of ethernet, without any extra layer
like VLAN, bond, team, etc.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
.../regression_tests/phase1/simple_netperf.README | 33 +++
recipes/regression_tests/phase1/simple_netperf.py | 246 +++++++++++++++++++++
recipes/regression_tests/phase1/simple_netperf.xml | 37 ++++
3 files changed, 316 insertions(+)
create mode 100644 recipes/regression_tests/phase1/simple_netperf.README
create mode 100644 recipes/regression_tests/phase1/simple_netperf.py
create mode 100644 recipes/regression_tests/phase1/simple_netperf.xml
diff --git a/recipes/regression_tests/phase1/simple_netperf.README b/recipes/regression_tests/phase1/simple_netperf.README
new file mode 100644
index 0000000..6d04821
--- /dev/null
+++ b/recipes/regression_tests/phase1/simple_netperf.README
@@ -0,0 +1,33 @@
+Topology:
+ +--------+
+ | |
+ +----------------------+ switch +----------------------+
+ | | | |
+ | +--------+ |
+ | |
+ | |
+ | |
+ | |
+ +--+-+ +-+--+
++-------|eth1|-------+ +-------|eth1|-------+
+| +----+ | | +----+ |
+| | | |
+| | | |
+| | | |
+| | | |
+| host1 | | host2 |
+| | | |
+| | | |
+| | | |
+| | | |
+| | | |
++--------------------+ +--------------------+
+
+
+Number of hosts: 2
+Host #1 description:
+ One ethernet device
+Host #2 description:
+ One ethernet device
+Test name:
+ simple_netperf.py
diff --git a/recipes/regression_tests/phase1/simple_netperf.py b/recipes/regression_tests/phase1/simple_netperf.py
new file mode 100644
index 0000000..a8ca07b
--- /dev/null
+++ b/recipes/regression_tests/phase1/simple_netperf.py
@@ -0,0 +1,246 @@
+from lnst.Controller.Task import ctl
+from lnst.Controller.PerfRepoUtils import netperf_baseline_template
+from lnst.Controller.PerfRepoUtils import netperf_result_template
+
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+
+# ------
+# SETUP
+# ------
+
+mapping_file = ctl.get_alias("mapping_file")
+perf_api = ctl.connect_PerfRepo(mapping_file)
+
+product_name = ctl.get_alias("product_name")
+
+m1 = ctl.get_host("machine1")
+m2 = ctl.get_host("machine2")
+
+m1.sync_resources(modules=["Netperf"])
+m2.sync_resources(modules=["Netperf"])
+
+# ------
+# TESTS
+# ------
+
+offloads = ["gro", "gso", "tso", "tx"]
+offload_settings = [ [("gro", "on"), ("gso", "on"), ("tso", "on"), ("tx", "on")],
+ [("gro", "off"), ("gso", "on"), ("tso", "on"), ("tx", "on")],
+ [("gro", "on"), ("gso", "off"), ("tso", "off"), ("tx", "on")],
+ [("gro", "on"), ("gso", "on"), ("tso", "off"), ("tx", "off")]]
+
+ipv = ctl.get_alias("ipv")
+mtu = ctl.get_alias("mtu")
+netperf_duration = int(ctl.get_alias("netperf_duration"))
+nperf_reserve = int(ctl.get_alias("nperf_reserve"))
+nperf_confidence = ctl.get_alias("nperf_confidence")
+nperf_max_runs = int(ctl.get_alias("nperf_max_runs"))
+nperf_cpupin = ctl.get_alias("nperf_cpupin")
+nperf_cpu_util = ctl.get_alias("nperf_cpu_util")
+nperf_mode = ctl.get_alias("nperf_mode")
+nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel"))
+
+m1_testiface = m1.get_interface("testiface")
+m2_testiface = m2.get_interface("testiface")
+
+m1_testiface.set_mtu(mtu)
+m2_testiface.set_mtu(mtu)
+
+if nperf_cpupin:
+ m1.run("service irqbalance stop")
+ m2.run("service irqbalance stop")
+
+ for m, d in [ (m1, m1_testiface), (m2, m2_testiface) ]:
+ pin_dev_irqs(m, d, 0)
+
+ctl.wait(15)
+
+p_opts = "-L %s" % (m2_testiface.get_ip(0))
+if nperf_cpupin and nperf_mode != "multi":
+ p_opts += " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+
+netperf_cli_tcp = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" : m1_testiface.get_ip(0),
+ "duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" : p_opts
+ })
+netperf_cli_tcp6 = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" : m1_testiface.get_ip(1),
+ "duration" : netperf_duration,
+ "testname" : "TCP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" :
+ "-L %s -6" % (m2_testiface.get_ip(1))
+ })
+netperf_cli_udp = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" : m1_testiface.get_ip(0),
+ "duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" : p_opts
+ })
+netperf_cli_udp6 = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" : m1_testiface.get_ip(1),
+ "duration" : netperf_duration,
+ "testname" : "UDP_STREAM",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" :
+ "-L %s -6" % (m2_testiface.get_ip(1))
+ })
+
+netperf_srv = ctl.get_module("Netperf",
+ options={
+ "role" : "server",
+ "bind" : m1_testiface.get_ip(0)
+ })
+
+netperf_srv6 = ctl.get_module("Netperf",
+ options={
+ "role" : "server",
+ "bind" : m1_testiface.get_ip(1)
+ })
+
+if nperf_mode == "multi":
+ netperf_cli_tcp.unset_option("confidence")
+ netperf_cli_udp.unset_option("confidence")
+ netperf_cli_tcp6.unset_option("confidence")
+ netperf_cli_udp6.unset_option("confidence")
+
+ netperf_cli_tcp.update_options({"num_parallel" : nperf_num_parallel})
+ netperf_cli_udp.update_options({"num_parallel" : nperf_num_parallel})
+ netperf_cli_tcp6.update_options({"num_parallel" : nperf_num_parallel})
+ netperf_cli_udp6.update_options({"num_parallel" : nperf_num_parallel})
+
+ctl.wait(15)
+
+for setting in offload_settings:
+ dev_features = ""
+ for offload in setting:
+ dev_features += " %s %s" % (offload[0], offload[1])
+ m1.run("ethtool -K %s %s" % (m1_testiface.get_devname(), dev_features))
+ m2.run("ethtool -K %s %s" % (m2_testiface.get_devname(), dev_features))
+
+ # Netperf test
+ if ipv in [ 'ipv4', 'both' ]:
+ srv_proc = m1.run(netperf_srv, bg=True)
+
+ # prepare PerfRepo result for tcp
+ result_tcp = perf_api.new_result("tcp_ipv4_id",
+ "tcp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ for offload in setting:
+ result_tcp.set_parameter(offload[0], offload[1])
+
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter("num_parallel", nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ netperf_baseline_template(netperf_cli_tcp, baseline)
+ tcp_res_data = m2.run(netperf_cli_tcp,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ perf_api.save_result(result_tcp)
+ # prepare PerfRepo result for udp
+ result_udp = perf_api.new_result("udp_ipv4_id",
+ "udp_ipv4_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ for offload in setting:
+ result_udp.set_parameter(offload[0], offload[1])
+
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter("num_parallel", nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ netperf_baseline_template(netperf_cli_udp, baseline)
+ udp_res_data = m2.run(netperf_cli_udp,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ perf_api.save_result(result_udp)
+ srv_proc.intr()
+
+ if ipv in [ 'ipv6', 'both' ]:
+ srv_proc = m1.run(netperf_srv6, bg=True)
+
+ # prepare PerfRepo result for tcp ipv6
+ result_tcp = perf_api.new_result("tcp_ipv6_id",
+ "tcp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ for offload in setting:
+ result_tcp.set_parameter(offload[0], offload[1])
+
+ result_tcp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp.add_tag("multithreaded")
+ result_tcp.set_parameter("num_parallel", nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp)
+ netperf_baseline_template(netperf_cli_tcp6, baseline)
+ tcp_res_data = m2.run(netperf_cli_tcp6,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp, tcp_res_data)
+ perf_api.save_result(result_tcp)
+ # prepare PerfRepo result for udp ipv6
+ result_udp = perf_api.new_result("udp_ipv6_id",
+ "udp_ipv6_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ for offload in setting:
+ result_udp.set_parameter(offload[0], offload[1])
+
+ result_udp.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_udp.add_tag("multithreaded")
+ result_udp.set_parameter("num_parallel", nperf_num_parallel)
+
+ baseline = perf_api.get_baseline_of_result(result_udp)
+ netperf_baseline_template(netperf_cli_udp6, baseline)
+ udp_res_data = m2.run(netperf_cli_udp,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_udp, udp_res_data)
+ perf_api.save_result(result_udp)
+ srv_proc.intr()
+
+# reset offload states
+dev_features = ""
+for offload in offloads:
+ dev_features += " %s %s" % (offload, "on")
+
+m1.run("ethtool -K %s %s" % (m1_testiface.get_devname(), dev_features))
+m2.run("ethtool -K %s %s" % (m2_testiface.get_devname(), dev_features))
+
+if nperf_cpupin:
+ m1.run("service irqbalance start")
+ m2.run("service irqbalance start")
diff --git a/recipes/regression_tests/phase1/simple_netperf.xml b/recipes/regression_tests/phase1/simple_netperf.xml
new file mode 100644
index 0000000..2123b3e
--- /dev/null
+++ b/recipes/regression_tests/phase1/simple_netperf.xml
@@ -0,0 +1,37 @@
+<lnstrecipe>
+ <define>
+ <alias name="ipv" value="both" />
+ <alias name="mtu" value="1500" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5" />
+ <alias name="nperf_mode" value="default" />
+ <alias name="nperf_num_parallel" value="2" />
+ <alias name="mapping_file" value="simple_netperf.mapping" />
+ <alias name="net" value="192.168.101" />
+ </define>
+ <network>
+ <host id="machine1">
+ <interfaces>
+ <eth id="testiface" label="testnet">
+ <addresses>
+ <address>{$net}.10/24</address>
+ <address>2002::1/64</address>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ <host id="machine2">
+ <interfaces>
+ <eth id="testiface" label="testnet">
+ <addresses>
+ <address>{$net}.11/24</address>
+ <address>2002::2/64</address>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ </network>
+ <task python="simple_netperf.py"/>
+</lnstrecipe>
--
2.4.3
8 years, 4 months
[PATCH] setup.py: added xslt files
by Jan Tluka
The patch adds files under result_xslt that are used for generating html to
setup.py so that they are distributed with LNST.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
setup.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 628ac1f..286d465 100755
--- a/setup.py
+++ b/setup.py
@@ -169,8 +169,11 @@ BASH_COMP = [(BASH_COMP_DIR, ["install/lnst-ctl.bash",
SCHEMAS = [(CTL_RESOURCE_DIR, ["schema-recipe.rng", "schema-sm.rng"])]
+RESULT_XSLT_DATA = [(CTL_RESOURCE_DIR + "result_xslt/",
+ ["result_xslt/" + f for f in os.listdir("result_xslt")])]
+
DATA_FILES = CONFIG + TEST_MODULES + MULTICAST_TEST_TOOLS + MAN_PAGES + \
- SCHEMAS + BASH_COMP + RECIPE_FILES
+ SCHEMAS + BASH_COMP + RECIPE_FILES + RESULT_XSLT_DATA
setup(name="lnst",
version="10",
--
2.4.3
8 years, 4 months
[PATCH] Wizard: fix query of ip address by guest name
by Jan Tluka
Wizard in virtual mode uses libvirt's DHCPLeases() method to check if the
lease table contains guest libvirt domain name. Unfortunately the hostname
key is not the libvirt guest's name but really a hostname. So unless a user
has a mapping in /etc/hosts the current approach won't work and the hostname
contains 'None'. The solution is to get guest's XML and based on the
interface data there search the entry in the lease table provided by
DHCPLeases().
Fixes issue #156
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/Controller/Wizard.py | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/lnst/Controller/Wizard.py b/lnst/Controller/Wizard.py
index ddd461a..562efe1 100644
--- a/lnst/Controller/Wizard.py
+++ b/lnst/Controller/Wizard.py
@@ -22,6 +22,7 @@ from lnst.Common.Utils import mkdir_p, check_process_running
from lnst.Common.Config import DefaultRPCPort
from lnst.Common.ConnectionHandler import send_data, recv_data
from xml.dom.minidom import getDOMImplementation
+from lxml import etree
DefaultPoolDir = os.path.expanduser("~/.lnst/pool/")
PATH_IS_DIR_ACCESSIBLE = 0
@@ -416,20 +417,31 @@ class Wizard:
sys.stderr.write("No domain entered\n")
continue
try:
- conn.lookupByName(libvirt_domain)
+ guest = conn.lookupByName(libvirt_domain)
except:
continue
- # when libvirtd is old
+ guestxml = etree.fromstring(guest.XMLDesc())
+
+ macs = list()
+ for mac in guestxml.findall(".//interface/source[@network='default']/../mac"):
+ macs.append(mac.get('address'))
+
+ guest_ip = None
try:
for lease in conn.networkLookupByName("default").DHCPLeases():
- if lease["hostname"] == libvirt_domain:
- return (libvirt_domain, lease["ipaddr"])
+ if lease['mac'] in macs:
+ guest_ip = lease['ipaddr']
+ break
except:
sys.stderr.write("Failed getting DHCPLeases from hypervisor\n")
- sys.stderr.write("Couldn't find any IP associated with "
- "libvirt_domain '%s'\n" % libvirt_domain)
+ if guest_ip == None:
+ sys.stderr.write("Couldn't find any IP associated with "
+ "libvirt_domain '%s'\n" % libvirt_domain)
+ else:
+ return libvirt_domain, lease['ipaddr']
+
hostname = self._query_hostname()
return libvirt_domain, hostname
--
2.4.3
8 years, 4 months
[PATCH 1/3] RecipeCommon: add IRQ module
by Jan Tluka
This module provides functions that are related to IRQ mangling.
The function pin_dev_irqs in the module can be used to pin IRQs assigned
to a device to a specific CPU.
It takes three arguments, HostAPI object, InterfaceAPI object and cpu number.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
lnst/RecipeCommon/IRQ.py | 33 +++++++++++++++++++++++++++++++++
lnst/RecipeCommon/__init__.py | 0
setup.py | 3 ++-
3 files changed, 35 insertions(+), 1 deletion(-)
create mode 100644 lnst/RecipeCommon/IRQ.py
create mode 100644 lnst/RecipeCommon/__init__.py
diff --git a/lnst/RecipeCommon/IRQ.py b/lnst/RecipeCommon/IRQ.py
new file mode 100644
index 0000000..441bbc8
--- /dev/null
+++ b/lnst/RecipeCommon/IRQ.py
@@ -0,0 +1,33 @@
+"""
+This module defines the functions for IRQ tuning that can be imported
+directly into LNST Python tasks.
+
+Copyright 2015 Red Hat, Inc.
+Licensed under the GNU General Public License, version 2 as
+published by the Free Software Foundation; see COPYING for details.
+"""
+
+__author__ = """
+jtluka(a)redhat.com (Jan Tluka)
+"""
+
+
+'''
+Pins all device IRQs to specified cpu on machine.
+
+machine: HostAPI object
+device: InterfaceAPI object
+cpu: integer
+'''
+def pin_dev_irqs(machine, device, cpu):
+ pi = machine.run("grep %s /proc/interrupts | cut -f1 -d: | sed 's/ //'"
+ % device.get_devname(), save_output=True)
+ res = pi.get_result()
+ intrs = res["res_data"]["stdout"]
+ for intr in intrs.split('\n'):
+ try:
+ int(intr)
+ except:
+ continue
+ machine.config("/proc/irq/%s/smp_affinity_list" % intr.strip(), cpu)
+
diff --git a/lnst/RecipeCommon/__init__.py b/lnst/RecipeCommon/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/setup.py b/setup.py
index 43925dd..628ac1f 100755
--- a/setup.py
+++ b/setup.py
@@ -101,7 +101,8 @@ For detailed description of the architecture of LNST please refer to
project website <https://fedorahosted.org/lnst>.
"""
-PACKAGES = ["lnst", "lnst.Common", "lnst.Controller", "lnst.Slave"]
+PACKAGES = ["lnst", "lnst.Common", "lnst.Controller", "lnst.Slave",
+ "lnst.RecipeCommon" ]
SCRIPTS = ["lnst-ctl", "lnst-slave", "lnst-pool-wizard"]
RECIPE_FILES = []
--
2.4.3
8 years, 4 months