Re: [lnst trac] #26: add man pages
by fedora-badges
#26: add man pages
-------------------------+------------------------------------------------
Reporter: olichtne | Owner: somebody
Type: task | Status: closed
Priority: major | Milestone: Push LNST as a package into Fedora
Component: component1 | Version:
Resolution: fixed | Keywords:
Blocked By: | Blocking:
-------------------------+------------------------------------------------
Changes (by rpazdera):
* resolution: => fixed
* status: new => closed
--
Ticket URL: <https://fedorahosted.org/lnst/ticket/26#comment:5>
lnst <https://fedorahosted.org/lnst/>
Linux Network Stack Test
11 years, 5 months
[PATCH] Logs: multiple recipes bug fix
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
Somwhere during the changes to the logging I created a bug that makes it
that multiple recipes are logged into incorrect directories, getting
further into the folder hierarchy. A related problem that occured is
that the logs specific to a recipe would also contain the logs of all
recipes executed after it.
This patch fixes that by saving the paths and then restoring them when
moving on to the next recipe.
The bug was created by moving code from the LoggingServer to the
NetTestController. The LoggingServer had one static variable as the base
for the paths, however after moving it to the controller the variable is
no longer static and is changed by every slave we are connecting to.
This results in the next recipe being logged in the directory for the
last connected slave of the previous recipe.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst-ctl | 4 ++++
lnst/Common/Logs.py | 36 +++++++++++++++++++++++++++---------
2 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/lnst-ctl b/lnst-ctl
index 2ce304f..8504ae1 100755
--- a/lnst-ctl
+++ b/lnst-ctl
@@ -140,6 +140,7 @@ def main():
summary = []
res_serializer = NetTestResultSerializer()
+ Logs.save_state()
for recipe_path in args:
if os.path.isdir(recipe_path):
all_files = []
@@ -151,6 +152,7 @@ def main():
for f in all_files:
recipe_file = os.path.join(recipe_path, f)
if re.match(r'^.*\.xml$', recipe_file):
+ Logs.reset_state()
logging.info("Processing recipe file \"%s\"" % recipe_file)
summary.append(get_recipe_result(action, recipe_file,
cleanup,
@@ -159,11 +161,13 @@ def main():
config))
Logs.set_logging_root_path(clean=False)
else:
+ Logs.reset_state()
summary.append(get_recipe_result(action, recipe_path,
cleanup, res_serializer,
packet_capture,
config))
+ Logs.reset_state()
Logs.set_logging_root_path(clean=False)
print_summary(summary)
diff --git a/lnst/Common/Logs.py b/lnst/Common/Logs.py
index a9910eb..e9c33ea 100644
--- a/lnst/Common/Logs.py
+++ b/lnst/Common/Logs.py
@@ -151,11 +151,12 @@ class Logs:
file_handlers = []
formatter = None
logFolder = None
- logger = None
+ loggers = []
root_path = None
debug = None
date = None
nameExtend = None
+ state = None
@classmethod
def __init__(cls,debug=0, waitForNet=False, logger=logging.getLogger(),
recipe_path=None, to_display=True, date=None,
@@ -175,7 +176,7 @@ class Logs:
cls.logFolder = log_folder
else:
cls.logFolder = os.path.join(os.path.dirname(sys.argv[0]), './Logs')
- cls.logger = logger
+ cls.loggers.append(logger)
cls.debug = debug
if date is None:
cls.date = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S")
@@ -186,6 +187,23 @@ class Logs:
recipe_path, to_display)
@classmethod
+ def save_state(cls):
+ cls.state = {"logFolder": cls.logFolder, "date": cls.date}
+
+ @classmethod
+ def reset_state(cls):
+ cls.logFolder = cls.state["logFolder"]
+ cls.date = cls.state["date"]
+
+ for logger in cls.loggers:
+ handlers = list(logger.handlers)
+ for handler in handlers:
+ if type(handler) == logging.FileHandler:
+ logger.removeHandler(handler)
+
+ cls.loggers = cls.loggers[:1]
+
+ @classmethod
def clean_root_log_folder(cls, logRootPath):
try:
shutil.rmtree(logRootPath)
@@ -204,8 +222,6 @@ class Logs:
file_info.setFormatter(cls.formatter)
file_info.setLevel(logging.INFO)
- cls.file_handlers.append(file_debug)
- cls.file_handlers.append(file_info)
return (file_debug, file_info)
@@ -217,15 +233,17 @@ class Logs:
if recipe_path is None:
recipe_path = ""
- root_logger = cls.logger
+ root_logger = cls.loggers[-1]
recipe_name = os.path.splitext(os.path.split(recipe_path)[1])[0]
cls.root_path = os.path.join(cls.logFolder, cls.date+cls.nameExtend,
recipe_name)
if (clean):
cls.clean_root_log_folder(cls.root_path)
- for fhandler in cls.file_handlers:
- root_logger.removeHandler(fhandler)
- del cls.file_handlers[:]
+
+ handlers = list(root_logger.handlers)
+ for handler in handlers:
+ if type(handler) == logging.FileHandler:
+ logger.removeHandler(handler)
(file_debug, file_info) = cls._create_file_handler(cls.root_path)
root_logger.addHandler(file_debug)
@@ -249,7 +267,7 @@ class Logs:
@param debug: If True print to terminal debug level of logging messages.
"""
- root_logger = cls.logger
+ root_logger = cls.loggers[-1]
if to_display:
display = logging.StreamHandler()
display.setFormatter(cls.formatter)
--
1.7.11.7
11 years, 5 months
[lnst] Remove the documentation from git
by Jiří Pírko
commit 837c9081e3e6a775a099c5a38f963a252d4df63b
Author: Jan Tluka <jtluka(a)redhat.com>
Date: Thu Nov 22 11:15:21 2012 +0100
Remove the documentation from git
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
Documentation/LNSTIntro.html | 771 ---------------------
Documentation/README | 24 -
Documentation/controller-slave-communication.dia | Bin 3304 -> 0 bytes
Documentation/lnst_intro_images.sh | 15 -
Documentation/machineconfig-netconfig-mapping.dia | Bin 3854 -> 0 bytes
Documentation/real-hardware-setup.dia | Bin 2925 -> 0 bytes
6 files changed, 0 insertions(+), 810 deletions(-)
11 years, 5 months
[PATCH] Logs: multiple recipes bug fix
by Ondrej Lichtner
From: Ondrej Lichtner <olichtne(a)redhat.com>
Somwhere during the changes to the logging I created a bug that makes it
that multiple recipes are logged into incorrect directories, getting
further into the folder hierarchy. This patch fixes that by saving the
paths and then restoring them when moving on to the next recipe.
The bug was created by moving code from the LoggingServer to the
NetTestController. The LoggingServer had one static variable as the base
for the paths, however after moving it to the controller the variable is
no longer static and is changed by every slave we are connecting to.
This results in the next recipe being logged in the directory for the
last connected slave of the previous recipe.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst-ctl | 2 ++
lnst/Common/Logs.py | 10 ++++++++++
2 files changed, 12 insertions(+)
diff --git a/lnst-ctl b/lnst-ctl
index 2ce304f..89fadec 100755
--- a/lnst-ctl
+++ b/lnst-ctl
@@ -140,7 +140,9 @@ def main():
summary = []
res_serializer = NetTestResultSerializer()
+ Logs.save_state()
for recipe_path in args:
+ Logs.reset_state()
if os.path.isdir(recipe_path):
all_files = []
for root, dirs, files in os.walk(recipe_path):
diff --git a/lnst/Common/Logs.py b/lnst/Common/Logs.py
index a9910eb..5156af3 100644
--- a/lnst/Common/Logs.py
+++ b/lnst/Common/Logs.py
@@ -156,6 +156,7 @@ class Logs:
debug = None
date = None
nameExtend = None
+ state = None
@classmethod
def __init__(cls,debug=0, waitForNet=False, logger=logging.getLogger(),
recipe_path=None, to_display=True, date=None,
@@ -186,6 +187,15 @@ class Logs:
recipe_path, to_display)
@classmethod
+ def save_state(cls):
+ cls.state = {"logFolder": cls.logFolder, "date": cls.date}
+
+ @classmethod
+ def reset_state(cls):
+ cls.logFolder = cls.state["logFolder"]
+ cls.date = cls.state["date"]
+
+ @classmethod
def clean_root_log_folder(cls, logRootPath):
try:
shutil.rmtree(logRootPath)
--
1.7.11.7
11 years, 5 months
[PATCH] Remove the documentation from git
by Jan Tluka
Removing the documentation from git since it will be maintained on the project
wiki.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
---
Documentation/LNSTIntro.html | 771 ---------------------
Documentation/README | 24 -
Documentation/controller-slave-communication.dia | Bin 3304 -> 0 bytes
Documentation/lnst_intro_images.sh | 15 -
Documentation/machineconfig-netconfig-mapping.dia | Bin 3854 -> 0 bytes
Documentation/real-hardware-setup.dia | Bin 2925 -> 0 bytes
6 files changed, 0 insertions(+), 810 deletions(-)
delete mode 100644 Documentation/LNSTIntro.html
delete mode 100644 Documentation/README
delete mode 100644 Documentation/controller-slave-communication.dia
delete mode 100755 Documentation/lnst_intro_images.sh
delete mode 100644 Documentation/machineconfig-netconfig-mapping.dia
delete mode 100644 Documentation/real-hardware-setup.dia
diff --git a/Documentation/LNSTIntro.html b/Documentation/LNSTIntro.html
deleted file mode 100644
index c83d03f..0000000
--- a/Documentation/LNSTIntro.html
+++ /dev/null
@@ -1,771 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
- <title>LNST - Linux Network Stack Test</title>
- <meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" />
-
- <style>
- pre {background-color: #eaeaea;}
- </style>
-</head>
-
-<body>
-<h1>Linux Network Stack Test - LNST Project</h1>
-
-<p></p>
-
-<h2>About</h2>
-
-<p>LNST is an automated testing framework focused on the Linux network stack testing. It supports bonding, vlan, bridging and macvlan.</p>
-
-<h3><em>People</em></h3>
-<ul>
- <li>JiÅÃ PÃrko (jpirko) â author of the project, kernel developer</li>
- <li>JiÅà Župka (jzupka) â contributor, framework infrastructure implementation,
- quality engineer</li>
- <li>Jan Tluka (jtluka) â contributor, test development, Beaker
- integration, quality engineer</li>
- <li>Radek Pazdera (rpazdera) - contributor, framework infrastructure implementation, test development, quality engineer
- <li>Ondrej Lichtner (olichtne) - contributor, framework infrastructure implementation, quality engineer
-</ul>
-
-<h3><em>Communication channels</em></h3>
-
-<ul>
- <li>Project web page on <a>https://fedorahosted.org/lnst/</a>
- <li>We are on irc: #lnst @ freenode (irc://irc.freenode.net#lnst)</li>
- <li>The development mailing list: <a href="https://fedorahosted.org/mailman/listinfo/lnst-developers">https://fedorahosted.org/mailman/listinfo/lnst-developers</a></li>
- </ul>
-
-
-<h3><em>Goals</em></h3>
-<ul>
- <li>QE: extend our current network code coverage in Tier tests</li>
- <li>Devel: create a tool/test environment to easily catch regressions in network stack during development</li>
-</ul>
-
-<h3><em>Target audience</em></h3>
-<ul>
- <li>developers (to catch regressions)</li>
- <li>quality engineers (to develop new tests)</li>
-</ul>
-
-<h3><em>Topology</em></h3>
-
-<p>In the following picture you can see an example of the network topology along with the roles and communication paths. There are 3 basic entities, </p>
-<ul>
- <li>controller </li>
- <li>test machines</li>
- <li>network infrastructure (network switches)</li>
-</ul>
-
-<p></p>
-
-<p style="text-align:left;margin-left:0;margin-right:auto;"><img
-alt="Roles and communication paths" src="real-hardware-setup.png"
-style="display: block; text-align: center; margin-left: auto; margin-right: auto"
-width="712" height="279" /></p>
-
-<p></p>
-
-<p>In the picture you can see two network connections drawn in different colors. </p>
-
-<p>The green one is the <strong>controller path</strong> and is used to setup network interfaces on machine1 and machine2 through the <strong>controller interfaces</strong> (eth3 on both test machines). The <strong>controller path</strong> is also used to do setup of the test switch and live changes on it such as vlan and bonding configuration, port disconnection, etc.</p>
-
-<p>The red one is the <strong>test path</strong> and is used for network traffic generated in tests executed on test machines.</p>
-
-<p></p>
-<hr />
-
-<h2>Getting the source</h2>
-
-<p>You can access the sources at the following urls:</p>
-<ul>
- <li><a
- href="http://git.fedorahosted.org/git/?p=lnst.git">http://git.fedorahosted.org/git/?p=lnst.git</a></li>
-</ul>
-
-<p>In your comand line checkout the code:</p>
-<pre>$ git clone git://git.fedorahosted.org/lnst.git</pre>
-
-<p></p>
-<hr />
-
-<h2>Source code structure</h2>
-
-Please note, that not every file is listed.
-
-<p></p>
-<pre>[./]
- nettestctl.py (tool to control remote machines/execute tests)
- nettestslave.py (app that runs on remote machine and
- accepts commands from controller (nettestctl.py))
-
-[./Common] (common code for the framework)
-
-[./recipes] (inspiration for test setups â netconfigs, machineconfigs, recipes)
-
-[./NetConfig] (network configuration class implementation)
-
-[./NetTest] (test execution class implementation)
-
-[./Switch] (network switch configuration implementation)
-
-[./Tests] (implementation of network tests)
-
-[./test_tools] (place to keep non-python testing tools and scripts)
-</pre>
-
-<p></p>
-<hr />
-
-<h2>Setting up the test environmnent</h2>
-
-<h3><em>Controller-Slave connection setup</em></h3>
-
-<p>
-It's mandatory to have a dedicated controller network interface on all of the test machines for both the XML-RPC connection that is used to setup network interfaces for testing and for the test execution itself. By default the xml-rpc client listens on port 9999 so if you use firewall of any sort this port needs to be open. If you want to run the tests using the "remote execution" (see chapter The Workflow - running LNST at the end of this document) you also need to have SSH daemon running on all of the test machines. It is also important to separate "controller path" and "test path" infrastructure, e.g. using two switches.</p>
-
-<p></p>
-
-<h3><em>Required packages</em></h3>
-
-<p>Basically you need to have python installed. If you use RHEL5 on a machine you need to install additional package <strong>python-ctypes</strong> from EPEL repository on it.</p>
-<ul>
- <li><a
- href="http://fedoraproject.org/wiki/EPEL">http://fedoraproject.org/wiki/EPEL</a></li>
- <li>rpm -ivh <a
- href="http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch...">http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch...</a></li>
- <li><a
- href="http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch..."></a>yum
- install python-ctypes</li>
-</ul>
-
-<h3><em>Optional packages</em></h3>
-
-<p>It is recommended to install following packages. Either optional framework features rely on them or the LNST tests require them to do their work.</p>
-<ul>
- <li>tcpdump</li>
- <li>nc (netcat)</li>
- <li>iperf</li>
- <li>iptables</li>
-</ul>
-
-<p></p>
-<hr />
-
-<h2>LNST Recipes</h2>
-
-<p>The LNST recipe contains all information to do a test run.</p>
-
-<p>It consists of:</p>
-<ul>
- <li><span style="background-color:#ffc0cb">machineconfigs</span> - to define the set of machines under testing</li>
- <li><span style="background-color:#90ee90">netconfigs</span> - to define how the network interfaces should be configured</li>
- <li><span style="background-color:#add8e6">command sequences</span> - to define all test sub-tasks</li>
-</ul>
-
-<p>The following XML code is an example of the LNST recipe:</p>
-<pre><nettestrecipe>
- <machines>
- <machine id="1">
- <span style="background-color:#ffc0cb"><machineconfig source="recipes/team/machineconfig-test1.xml"/></span>
- <span style="background-color:#90ee90"><netconfig source="recipes/team/netconfig-simple.xml"/></span>
- </machine>
- <machine id="2">
- <span style="background-color:#ffc0cb"><machineconfig source="recipes/team/machineconfig-test2.xml"/></span>
- <span style="background-color:#90ee90"><netconfig source="recipes/team/netconfig-team_ab_lw_001.xml"/></span>
- </machine>
- </machines>
-
- <span style="background-color:#add8e6"><command_sequence></span>
- <span style="background-color:#add8e6"><command type="exec" value="sleep 4"/></span>
- <span style="background-color:#add8e6"><command type="test" machine_id="1" value="IcmpPing" timeout="30"></span>
- <span style="background-color:#add8e6"><options></span>
- <span style="background-color:#add8e6"><option name="addr" value="{ip(2,testip)}"/></span>
- <span style="background-color:#add8e6"><option name="count" value="40"/></span>
- <span style="background-color:#add8e6"><option name="interval" value="0.2"/></span>
- <span style="background-color:#add8e6"><option name="limit_rate" value="95"/></span>
- <span style="background-color:#add8e6"></options></span>
- <span style="background-color:#add8e6"></command></span>
- <span style="background-color:#add8e6"></command_sequence></span>
-</nettestrecipe></pre>
-
-<p></p>
-
-<p>Every test machine's network setup is defined by two configuration XML snippets â MachineConfig describing the machine's physical hardware (available NICs) and NetConfig describing configuration of these devices (IP addresses, bonding setup, bridging, vlans, etc.)</p>
-
-<h3><em>MachineConfig</em></h3>
-
-<p>The MachineConfig</p>
-<ul>
- <li>describes test machine's control interface and root login information (for remote execution) - <strong>info</strong> tag</li>
- <li>describes available network interfaces of a test machine â <strong>netdevice</strong> tags</li>
-</ul>
-
-<p>Example:</p>
-
-<p></p>
-<pre><machineconfig>
- <info hostname="10.34.37.141" rootpass="aaa"/>
- <netdevices>
- <netdevice type="eth" network="testnet" <span style="background-color:#00ff00">phys_id="1"</span> hwaddr="00:E0:4C:14:2E:5D"/>
- <netdevice type="eth" network="testnet" <span style="background-color:#00ff00">phys_id="2"</span> hwaddr="00:30:4F:7F:FD:30"/>
- </netdevices>
-</machineconfig></pre>
-
-<p></p>
-
-<p>Test machine with this configuration will be accessible via IP address 10.34.37.141 using root password 'aaa' (<strong>rootpass</strong>). Two interfaces are made available for testing - one with MAC address 00:E0:4C:14:2E:5D (<strong>hwaddr</strong>) exported as physical device '1' (<strong>phys_id</strong>) and second with MAC address 00:30:4F:7F:FD:30 exported as physical device '2' in LNST framework.</p>
-
-<p></p>
-
-<h3><em>NetConfig</em></h3>
-
-<p>Example:</p>
-<pre><netconfig>
- <interface id="1" type="eth" <span style="background-color:#00ff00">phys_id="1"</span>/>
- <interface id="2" type="eth" <span style="background-color:#00ff00">phys_id="2"</span>/>
- <interface id="testifc1" <span style="background-color:#add8e6">type="bond"</span>>
- <options>
- <option name="mode" value="1"/>
- <option name="miimon" value="100"/>
- <option name="primary" value="2"/>
- </options>
- <slaves>
- <slave id="1"/>
- <slave id="2"/>
- </slaves>
- <addresses>
- <address value="192.168.101.1/24"/>
- </addresses>
- </interface>
-</netconfig></pre>
-
-<p></p>
-
-<p>This configuration snippet uses two physical devices
-(<strong>phys_id</strong>="1" and <strong>phys_id</strong>="2") defined in the previous MachineConfig. It also defines third network device (<strong>netdevice id="3"</strong>) as <strong>bond</strong> device and adds the two physical device as its <strong>slaves</strong>. Further options are defined in <strong>options</strong> element and IP address of the bond interface is defined in <strong>addresses</strong> element.</p>
-
-<p>Please note that you can use strings instead of just numbers for interface identification. This is very helpful when you're referring these interfaces in your command sequences. More on this in following chapter.</p>
-<p></p>
-
-<h3><em>Mapping of physical interfaces inside LNST recipes</em></h3>
-
-<p></p>
-
-<p><img alt="machineconfig-netconfig-mapping"
-src="machineconfig-netconfig-mapping.png" width="793" height="318" /></p>
-
-<p></p>
-<h4><strong></strong></h4>
-
-<h3><em>Command sequences</em></h3>
-
-<p>Command sequence in a LNST recipe is a list of commands that is executed on test machines or controller. </p>
-
-<h4><em>Commands</em></h4>
-
-<p>Commands can be of type:</p>
-<ul>
- <li><strong>type="exec"</strong> or</li>
- <li><strong>type="test"</strong>(can be run on test machines only)</li>
- <li><strong>type="intr"</strong> to interrupt (SIG_INT) commands running in background</li>
- <li><strong>type="kill"</strong> to kill (SIG_KILL) commands running in background</li>
- <li><strong>type="wait"</strong> to wait for completion of a command running in background</li>
-</ul>
-
-<p>The <strong>exec</strong> command is anything that you can enter on a
-command line. E.g. </p>
-<ul>
- <li>yum install tcpdump</li>
- <li>echo 1 > /proc/net/ipv4/ip_forwarding</li>
-</ul>
-
-<p></p>
-
-<p>The <strong>test</strong> command is an implemented test. The code of the test in the example below is present in Tests/Test<strong>IcmpPing</strong>.py. You can pass variables to a test using the <strong>option</strong> tag. The option value can be obtained using <strong>get_opt(),get_mopt()</strong> methods. For further details see section <strong>Writing tests</strong> or look at code examples under <strong>Tests</strong> directory.</p>
-
-<p></p>
-
-<p>Example of a command sequence:</p>
-<pre><command_sequence>
- <command type="exec" value="sleep 4"/>
- <command type="test" machine_id="1" value="IcmpPing" timeout="30">
- <options>
- <option name="addr" value="<span style="background-color:#ffc0cb">{$recipe['machines'][2]['netconfig'][1]['addresses'][0]}</span>" />
- <option name="count" value="40"/>
- <option name="interval" value="0.2"/>
- <option name="limit_rate" value="95"/>
- </options>
- </command>
-</command_sequence></pre>
-
-<p></p>
-
-<p>There are two commands in this example. </p>
-
-<p>First one would execute command sleep on the controller machine because attribute <strong>machine_id</strong> is not supplied (default behavior). The <strong>machine_id</strong> attribute defines on which of the test machines command should run. It's value matches one of the machine ids defined in <strong><machine></strong> tag in LNST recipe.</p>
-
-<p>The second command would start <strong>IcmpPing</strong> test from the LNST test library on the test machine with <strong>id=1</strong>.</p>
-
-<p>You can also access the configuration of machines and their interfaces from the command sequence through a special alias <span style="background-color:#ffc0cb"><strong>{$recipe}</strong></span>. In the previous example, addr option of IcmpPing test will be set to <em>first</em> assigned address from netconfig of <em>first</em> device on <em>second</em> machine.
-</p>
-
-<h4><em>Running commands in background</em></h4>
-
-<p>Every command can be run in background. To put a command in background add the <strong>bg_id</strong> attribute to the command tag and set it's value to unique identifier, e.g. a number or a string like "iperf_server_in_bg". This identifier is later used to interrupt (<strong>intr</strong> or <strong>kill</strong>) the command or wait for it's completion(<strong>wait</strong>).
-Look at following example:
-
-<pre><command_sequence>
- <command type="test" machine_id="server" value="Iperf" <span style="background-color:#ffc0cb">bg_id="iperf_server_in_bg</span>">
- <options>
- <option name="bind" value="{ip(server,testifc1)}" />
- <option name="role" value="server"/>
- </options>
- </command>
- <command type="exec" value="sleep 3"/>
- <command type="test" machine_id="client" value="Iperf">
- <options>
- <option name="iperf_server" value="{ip(server,testifc1)}" />
- <option name="role" value="client"/>
- <option name="duration" value="10"/>
- </options>
- </command>
- <command <span style="background-color:#ffc0cb">type="intr"</span> machine_id="server" <span style="background-color:#ffc0cb">value="iperf_server_in_bg"</span>/>
-</command_sequence></pre>
-
-
-
-<h3><em>System Configuration</em></h3>
-<p>
-LNST provides a native way of changing system configuration of the slave machines from within the recipe. This can be achieved by <strong>system_config</strong> command. There are two versions of <strong>system_config</strong> command:
-</p>
-<h4>Inline version</h4>
-<pre>
- <command <span style="background-color:#add8e6">type="system_config"</span> option="/proc/sys/net/ipv4/igmp_max_memberships" value="50" machine_id="2" persistent="true" />
-</pre>
-
-<h4>Multiline version</h4>
-<pre>
- <command <span style="background-color:#add8e6">type="system_config"</span> machine_id="1">
- <options>
- <option name="/proc/sys/net/ipv4/igmp_max_memberships" value="10" />
- <option name="/proc/sys/net/ipv4/igmp_max_mfs" value="5" />
- </options>
- </commang>
-</pre>
-
-<p>
- In the multiline version you can set a several options at once.
-</p>
-<p>
- Unless <strong>persistent</strong> flag is set to <strong>true</strong>, all modified options are restored to their previous values <strong>at the end of the command sequence</strong>.
- The following example illustrates how this works:
-<pre>
- <command_sequence>
- <command type="system_config" machine_id="1" <span style="background-color:#ffc0cb">persistent="true"</span>>
- <options>
- <option name="/proc/sys/net/ipv4/igmp_max_memberships" value="10" />
- <option name="/proc/sys/net/ipv4/igmp_max_mfs" value="5" />
- </options>
- </commang>
- </command_sequence>
- <command_sequence>
- <command type="system_config" option="/proc/sys/net/ipv4/igmp_max_memberships" value="50" />
-
- execute some test here ...
- </command_sequence> <span style="background-color:#90ee90"><!-- At this point, igmp_max_memberships is set back to 10 --></span>
- <command_sequence>
- <command type="system_config" machine_id="1" <span style="background-color:#ffc0cb">persistent="true"</span>>
- <options>
- <option name="/proc/sys/net/ipv4/igmp_max_memberships" value="20" />
- <option name="/proc/sys/net/ipv4/igmp_max_mfs" value="10" />
- </options>
- </commang>
- </command_sequence>
-</pre>
-<p>
- The first command sequence serves as a global system setup phase, persistent flag is set to true, so the options <strong>will not</strong> be restored when the command sequence finishes.
-</p>
-<p>
- In the second command sequence, one option is modified for purposes of the next test, but it's not marked persistent, so the change will be automatically reverted when the command sequence comes to end.
-</p>
-<p>
- And the final command sequences issues a persistent command again, to make sure that system is left in a consistent state when recipe execution is over.
-</p>
-
-<hr />
-
-<h2>Advanced recipe techniques</h2>
-<p>
- This section introduces several features you can use when you decide to create your own recipe.
-</p>
-
-<h3><em>Defining aliases</em></h3>
-<p>LNST allows you to define arbitrary <strong>aliases</strong> and use them to access certain values from the whole recipe file while the value itself is included in the file only once. Definition of an alias occurs in the <code><define></code> tag anywhere in the document:</p>
-<pre>
-<define>
- <span style="background-color:#90ee90"><alias name="ip_addr" value="192.168.0.1" /></span>
- <span style="background-color:#add8e6"><alias name="mask" value="24" /></span>
-</define>
-</pre>
-
-<p>Defined alias can be referenced from any element's attribute or text.
-For instance:</p>
-<pre>
-<netdevice id="2" type="eth">
- <addresses>
- <address value="<span style="background-color:#90ee90">{$ip_addr}</span>/<span style="background-color:#add8e6">{$mask}</span>"/>
- </addresses>
-</netdevice>
-</pre>
-
-<h3><em>Template functions</em></h3>
-<p>
- Template functions are conceptually quite similar to aliases, but instead of a assigned value, they represent an action that will be executed when the recipe is parsed. They can be used the same way as aliases - inside of curly braces. Currently, there are three template functions available in LNST:
-</p>
-<ul>
- <li><strong>ip</strong>(<em>machine_id</em>, <em>interface_id</em><em>[, address_id]</em>)
- <p>
- Returns IP address for a specific machine and interface.
- Third argument is optional and can be used when there are
- multiple IP addresses associated with a single interface.
- </p>
- </li>
- <li><strong>hwaddr</strong>(<em>machine_id</em>, <em>interface_id</em>)
- <p>
- Returns hardware address of specified interface.
- </p>
- </li>
- <li><strong>devname</strong>(<em>machine_id</em>, <em>interface_id</em>)
- <p>
- Returns device name of specified interface.
- </p>
- </li>
-</ul>
-<p>
- All three above mentioned functions can be used for retrieving information from machine configs, therefore calling them is only valid within a command sequence. See the following example on how this templates can be used:
-</p>
-<pre>
- <command type="system_config" option="/proc/sys/net/ipv4/conf/<span style="background-color:#ffc0cb">{devname(1,1)}</span>/forwarding" value="1" machine_id="1" />
- <command type="test" value="Multicast" machine_id="1" timeout="30">
- <options>
- <option name="setup" value="max_groups" />
- <option name="interface" value="<span style="background-color:#ffc0cb">{ip(1,1)}</span>" />
- <option name="condition" value="max_groups > 0" />
- </options>
- </command>
-</pre>
-<p>
- Aliases can be passed to functions as parameters, but the preprocessor does not support nesting (e.g. function cannot have another function passed as an argument).
-</p>
-
-<h3><em>Splitting recipes into multiple files</em></h3>
-<p>
-LNST also offers a possibility of splitting the recipe into several files. It's very helpful if you want to re-use the code in different recipes. This can be achieved by supplying <strong>source</strong> argument to an arbitrary tag. The contents of that tag then will be loaded from the file specified in the attribute's value. For instance, the following machine configuration will be loaded from file <em>peanut.xml</em>:
-</p>
-<pre>
-<machine <span style="background-color:#90ee90">source="machine_configs/peanut.xml"</span> />
-</pre>
-Example (<em>peanut.xml</em>):
-<pre>
-<machine id="1">
- <machineconfig <span style="background-color:#add8e6">source="example_recipes/machine_configs/config-f14peanut.xml"</span> />
- <netconfig <span style="background-color:#add8e6">source="example_recipes/net_configs/netconfig1.xml"</span> />
-</machine>
-</pre>
-<p>Note that parts of the included machine config are again external.</p>
-
-<p></p>
-<hr />
-
-<h2>Writing a test for LNST</h2>
-
-<p>In this chapter I'm going to guide you through the process of writing a test for the LNST framework.</p>
-
-<h3><em>Basic test</em></h3>
-<h4><em>Tests code location</em></h4>
-
-<p>All tests are stored within <b>Tests</b> directory in git repo.</p>
-
-<p>For the purpose of this document let's assume that you're going to implement test with name <b>MyNetworkTest</b>. LNST requires that you name the python class with the prefix <b>Test</b>, therefore the class will be called <b>TestMyNetworkTest</b> and the file <b>TestMyNetworkTest.py</b>. This prefix should be omitted when you're referring it from the recipe xml.</p>
-
-<p>So, let's start with implementation. Change to the directory <b>Tests</b> and create file <b>TestMyNetworkTest.py</b> and open it with your favorite editor.</p>
-
-<p>Every class implementing an LNST test inherits from <code>TestGeneric</code> class from <code>TestsCommon</code> module:</p>
-
-<pre><code>from Common.TestsCommon import TestGeneric
-
-class TestMyNetworkTest(TestGeneric):
- ...
-</code></pre>
-
-<p>The only method you need to implement is the <code>run()</code> method and this is the code that will be executed whenever the test is referenced from the recipe.</p>
-
-<h4><em>Passing the parameters to the test</em></h4>
-
-<p><code>TestGeneric</code> class provides set of methods to get the parameters and their values specified in the recipe.</p>
-
-<ul>
- <li><code>get_opt()</code></li>
- <li><code>get_mopt()</code></li>
- <li><code>get_multi_opt()</code></li>
- <li><code>get_multi_mopt()</code></li>
-</ul>
-
-<p>The <code>get_opt()</code> and <code>get_multi_opt()</code> are used to get <u>optional</u> parameters. To make a parameter <u>mandatory</u> use their <b>mopt</b> variants, <code>get_mopt()</code> and <code>get_multi_mopt()</code>.</p>
-
-<p>For example, let's assume that your test requires a parameter containing an IP address to connect to. It's name is <b>remote_ip</b>. Additionally you want to let user to specify optional parameter saying how many messages the test should send. Let's name it <b>message_count</b>.</p>
-
-<pre><code>class TestMyNetworkTest(TestGeneric):
-
- def do_some_stuff_with_parameters(self, remote_ip, count):
- s = connect(remote_ip)
- for n in range(count):
- s.send_message("data%s" % n)
- s.close()
-
- def run(self):
- rip = self.get_mopt("remote_ip")
- mc = self.get_opt("message_count", default=10)
-
- do_some_stuff_with_parameters(rip, mc)
-</code></pre>
-
-<p>And following is an example how to run your test from the recipe.</p>
-
-<pre><code><command type="test" name="MyNetworkTest">
- <options>
- <option name="remote_ip" value="192.168.100.10" />
- <option name="message_count" value="50" />
- </options>
-</command>
-</code></pre>
-
-<p>The <b>multi</b> variants let you specify multi-value parameters. Let's consider following example. You'd like to specify multiple remote targets for your test. Without the multi opt variant you would have to run the test multiple times from the recipe in the background. Using it you can write following command:</p>
-
-<pre><code><command type="test" value="MyNetworkTest">
- <options>
- <option name="remote_target" value="192.168.100.10" />
- <option name="remote_target" value="192.168.100.20" />
- <option name="remote_target" value="192.168.100.30" />
- </options>
-</command>
-</code></pre>
-
-<p>And you can use following code to use all of the values:</p>
-
-<pre><code>class TestMyNetworkTest(TestGeneric):
-
- def do_some_stuff_with_target(self)
- s = connect(t)
- s.send_message("hello")
- s.close()
-
- def run(self):
- targets = self.get_multi_opt("remote_target)
- for t in targets:
- self.do_some_stuff_with_target(t)
-</code></pre>
-
-<p>Method <code>get_multi_mopt()</code> is the same but at least one value has to be specified.</p>
-
-<h4><em>Reporting test result</em></h4>
-
-<p>For what reason do we have tests if they don't tell us their result?</p>
-
-<p>The <code>TestGeneric</code> class provides two methods related to reporting the test results.</p>
-
-<ul>
- <li><code>set_fail([message])</code></li>
- <li><code>set_pass([message])</code></li>
-</ul>
-
-<p>If you don't call any of these methods from your test the result will be always success (pass).
- Both methods take optional parameter <code>message</code> that can be used to report the result in more detail, e.g. what was the transfer rate, how many connections have been established, etc.</p>
-
-<p>So let's enhance our example above a bit.</p>
-
-<pre><code>class TestMyNetworkTest(TestGeneric):
-
- def do_some_stuff_with_target(self)
- s = connect(t)
- if not s:
- return False
- s.send_message("hello")
- s.close()
-
- def run(self):
- targets = self.get_multi_opt("remote_target)
- for t in targets:
- rc = self.do_some_stuff_with_target(t)
- if not rc:
- self.set_fail("Could not connect to target %s" % t)
-
- # if we're not reporting anything interesting, you can omit the
- # following line
- self.set_pass()
-
-</code></pre>
-
-<h3><em>Advanced topics</em></h3>
-
-<h4><em>Handling interrupts</em></h4>
-
-<p>There are two approaches how to do this depending on the desired behaviour.</p>
-
-<h5><em>Using the LNST facilities</em></h5>
-
-<p>This approach is used if you need to block the execution of test. The <code>TestGeneric</code> class provides following two methods to support interrupt handling:</p>
-
-<ul>
- <li><code>set_handle_intr()</code></li>
- <li><code>wait_on_interrupt()</code></li>
-</ul>
-
-<p>If <code>set_handle_intr()</code> method is called from the test code it simply tells the framework that the test is interested in delivering the interrupt signal. The test then can be suspended until the delivery of this signal using the <code>wait_on_interrupt()</code> method.</p>
-
-<p>So, let's assume following command sequence:</p>
-
-<pre><code>
-<command type="test" value="IntrExample" bg_id="1" /> <!-- (1) -->
-<command type="exec" value="sleep 30" /> <!-- (2) -->
-<command type="intr" bg_id="1" /> <!-- (3) -->
-<command type="wait" bg_id="1" /> <!-- (4) -->
-</pre></code>
-
-<p>We're telling the framework that we want to run <b>IntrExample</b> test in the background (1), then wait for 30 seconds (2) and finally interrupt the test (3) and wait for it's exit (4).</p>
-
-<p>The python code would look like following:</p>
-
-<pre><code>TestIntrExample(TestGeneric):
- def run():
- self.set_handle_intr()
-
- ...
- # parse options
- ...
- # spawn workers or whatever that runs in background
- ...
- self.wait_on_interrupt()
- # we're blocked until type="intr" command is executed
-</code></pre>
-
-<h5><em>Self-managed interrupt handling</em></h5>
-
-<p>If you plan to use more complex interrupt signal handling you have to code it directly into your test code. As an example you can look at the code in <b>Tests/TestPacketAssert.py</b> or <b>Tests/TCPConnect.py</b> and <b>TCPListen.py</b></p>
-
-<p>Basically you need to register a method for the interrupt signal. The following code should do it:</p>
-
-<pre><code>TestIntrExample2(TestGeneric):
- def _interrupt_handler(self):
- self.do_whatever_needs_to_be_done_upon_signal_delivery()
-
- def run(self):
- signal.signal(signal.SIGINT, self._interrupt_handler)
-</code></pre>
-
-<p></p>
-<hr />
-
-<h2>Running in virtual environment</h2>
-
-<p></p>
-<ul>
- <li>good for developing tests</li>
- <li>easily reboot a panicked machine (virsh destroy <domain>; virsh
- start <domain></li>
-</ul>
-
-<p>Following is an example of libvirt xmls (reduced to network snippets only). MAC addresses marked with green color should be specified in the relevant machine configs. Don't forget to add dedicated control network interface that has to stay up during the whole testing. The configuration below expects that virt guests are accessible via host's network interface therefore they're set up as <strong>type='bridge'</strong>.</p>
-<pre><domain type='kvm'>
- <name>rhel5.6-snap1</name>
- ...
- <devices>
- ...
- <interface type='bridge'> <!-- dedicated control interface (therefore bridged) -->
- <mac address='52:54:00:cc:f1:88'/>
- <source bridge='br0'/>
- <model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
- </interface>
- <interface type='network'>
- <mac address='<span style="background-color:#ffffff"></span><span style="background-color:#00ff00">52:54:00:3d:3e:9b</span>'/>
- <source network='default'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
- </interface>
- <interface type='network'>
- <mac address='<span style="background-color:#00ff00">52:54:00:44:1a:fb</span>'/>
- <source network='default'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
- </interface>
- ...
- </devices>
-</domain>
-
-
-<domain type='kvm'>
- <name>rhel6ga</name>
- ...
- <devices>
- ...
- <interface type='bridge'>
- <mac address='52:54:00:9f:be:73'/>
- <source bridge='br0'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
- </interface>
- <interface type='network'>
- <mac address='<span style="background-color:#00ff00">52:54:00:2f:cc:e1</span>'/>
- <source network='default'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
- </interface>
- <interface type='network'>
- <mac address='<span style="background-color:#00ff00">52:54:00:dd:44:f0</span>'/>
- <source network='default'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
- </interface>
- ...
- </devices>
-</domain></pre>
-<hr />
-
-<h2>The workflow - running LNST</h2>
-
-<h3><em>Running LNST using remote execution</em></h3>
-
-<p>On the controller machine run following command:</p>
-<pre>> ./nettestctl.py <span style="color:#ff0000">-e</span> -c my_recipe.xml run</pre>
-
-<p>The <strong>-e</strong> option of the nettestctl.py command tells the controller to make SSH connections to all machines specified in the xml file my_recipe.xml copy the LNST code to the machines and start nettestslave.py processes on these machines. The nettestslave.py processes will start listening for XMLRPC connections through which the network interfaces will get configured. The <strong>-c</strong> option tells the controller to cleanup the test machines before any network configuration, that means removal of relevant kernel module (bonding, bridge, 8021q, etc.).</p>
-
-<h3><em>Running LNST without remote execution</em></h3>
-
-<p>In this case you have to start nettestslave.py processes first on all machines that are defined in recipe by yourself. Let's assume there are 2 machines participating in the test.</p>
-
-<p>On both of these machines you have to run following command:</p>
-<pre>$ ./nettestslave.py [-d]</pre>
-
-<p>If anything goes wrong it is a good practice to pass the debug option <strong>-d</strong> because you will get information about established xmlrpc connection from the controller and also information about getting the network test interfaces ready and possible problems during the setup.</p>
-
-<p>After a successful startup you should get following line on the output:</p>
-<pre>$ ./nettestslave.py
-03/05 12:32:20| (127.0.0.1) nettestslave:0063| INFO: Started</pre>
-
-<p>After that you need to start nettestctl.py on the controller to run the test
-in a recipe:</p>
-<pre>$ ./nettestctl.py -c my_recipe.xml run</pre>
-
-<h3><em>Using LNST to configure interfaces only</em></h3>
-
-<p>You can also use LNST to do just the network configuration of the test machines. None of the tests inside your recipe file will get executed.</p>
-
-<p>To do this pass <strong>config_only</strong> instead of 'run' argument to nettestctl.py script.</p>
-<pre>$ ./nettestctl.py my_recipe.xml <span style="color:#ff0000"><span style="background-color:#ffffff">config_only</span></span></pre>
-
-<p></p>
-</body>
-</html>
diff --git a/Documentation/README b/Documentation/README
deleted file mode 100644
index 000306a..0000000
--- a/Documentation/README
+++ /dev/null
@@ -1,24 +0,0 @@
-This directory contains useful documentation to help you understand how
-Linux Network Stack Test (LNST) works and show you some hints how to start
-using it.
-
-Description of the files in Documentation directory follows.
-
-
-LNSTIntro.html
---------------
-
-General introduction to the LNST including all concepts required for
-understanding the framework.
-
-IMPORTANT NOTE:
-
-The document contains few interesting pictures that were stored in gzipped XML
-format and conversion to png is needed before viewing them. The pictures were
-created with Dia (program for drawing structured diagrams [1]). We have
-provided you a script named "lnst_intro_images.sh" to help you with the
-conversion. First install the dia package for your distribution and then
-just run the script and you'll be ready to read the document with all the
-fancy pictures.
-
-[1] http://live.gnome.org/Dia
diff --git a/Documentation/controller-slave-communication.dia b/Documentation/controller-slave-communication.dia
deleted file mode 100644
index b33fa28a735e80358032454b8095cf7c8ad25382..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3304
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
diff --git a/Documentation/lnst_intro_images.sh b/Documentation/lnst_intro_images.sh
deleted file mode 100755
index 0c584ae..0000000
--- a/Documentation/lnst_intro_images.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-FILES="real-hardware-setup machineconfig-netconfig-mapping"
-
-if [ $# -gt 0 ] && [ $1 == "clean" ]; then
- echo "Removing png files for LNSTIntro"
- for f in $FILES; do
- rm -f $f.png
- done
-else
- for f in $FILES; do
- /usr/bin/dia -e $f.png $f.dia
- done
-fi
-
diff --git a/Documentation/machineconfig-netconfig-mapping.dia b/Documentation/machineconfig-netconfig-mapping.dia
deleted file mode 100644
index 89bd78a56b79416812d21263002fd66964f97da7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3854
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
Q_vyp`0o!0)9Zul@0I@Qa;{X5v
diff --git a/Documentation/real-hardware-setup.dia b/Documentation/real-hardware-setup.dia
deleted file mode 100644
index b049fa72b9e36de3c8e612fe555bc8a5c74aa938..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2925
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
Xe^b5@|2A2$d;jMD&H!<M2&Mo437ocq
--
1.7.7.6
11 years, 5 months
[lnst] scripts usage: Formatting changes
by Jiří Pírko
commit 7ed6a041a7c9207873591c0a5a0369891fa43ff6
Author: Radek Pazdera <rpazdera(a)redhat.com>
Date: Wed Nov 21 13:39:25 2012 +0100
scripts usage: Formatting changes
Some small formatting changes were made to the scripts' help messages.
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
lnst-ctl | 21 ++++++++++-----------
lnst-slave | 12 ++++++------
2 files changed, 16 insertions(+), 17 deletions(-)
---
diff --git a/lnst-ctl b/lnst-ctl
index 00413fd..2ce304f 100755
--- a/lnst-ctl
+++ b/lnst-ctl
@@ -25,20 +25,19 @@ def usage():
"""
Print usage of this app
"""
- print "Usage:"
- print "nettestctl.py [OPTION...] [RECIPE...] ACTION"
+ print "Usage: %s [OPTION...] [RECIPE...] ACTION" % sys.argv[0]
print ""
print "ACTION = [run | dump | config_only]"
print ""
- print "options:"
- print " -d, --debug emit debugging messages"
- print " -p, --packet_capture capture and log all ongoing\n" \
- " network communication during\n" \
- " the test"
- print " -h, --help print this message"
- print " -c, --cleanup perform config cleanup\n" \
- " machines"
- print " -x, --result=FILE file to write xml_result"
+ print "OPTIONS"
+ print " -d, --debug emit debugging messages"
+ print " -p, --packet_capture capture and log all ongoing\n" \
+ " network communication during\n" \
+ " the test"
+ print " -h, --help print this message"
+ print " -c, --cleanup perform config cleanup\n" \
+ " machines"
+ print " -x, --result=FILE file to write xml_result"
sys.exit()
def process_recipe(action, file_path, cleanup, res_serializer,
diff --git a/lnst-slave b/lnst-slave
index 4244209..f0b959f 100755
--- a/lnst-slave
+++ b/lnst-slave
@@ -24,13 +24,13 @@ def usage():
"""
Print usage of this app
"""
- print "Usage: nettestslave.py [OPTION...]"
+ print "Usage: %s [OPTION...]" % sys.argv[0]
print ""
- print " -d, --debug emit debugging messages"
- print " -h, --help print this message"
- print " -e, --daemonize go to background after init"
- print " -i, --pidfile file to write daemonized process pid"
- print " -p, --port xmlrpc port"
+ print " -d, --debug emit debugging messages"
+ print " -h, --help print this message"
+ print " -e, --daemonize go to background after init"
+ print " -i, --pidfile file to write daemonized process pid"
+ print " -p, --port xmlrpc port to listen on"
sys.exit()
def main():
11 years, 5 months
[PATCH 1/5] man pages: Adding man templates
by Radek Pazdera
This patch adds man templates to the install/ directory. These templates
are processed by setup.py during the installation and turned into an
actuall man pages to be installed.
The man pages are for the following commands:
* lnst-ctl(1)
* lnst-slave(1)
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
---
install/lnst-ctl.1.in | 117 +++++++++++++++++++++++++++++++++++++++++++++++
install/lnst-slave.1.in | 99 +++++++++++++++++++++++++++++++++++++++
2 files changed, 216 insertions(+), 0 deletions(-)
create mode 100644 install/lnst-ctl.1.in
create mode 100644 install/lnst-slave.1.in
diff --git a/install/lnst-ctl.1.in b/install/lnst-ctl.1.in
new file mode 100644
index 0000000..34afdbf
--- /dev/null
+++ b/install/lnst-ctl.1.in
@@ -0,0 +1,117 @@
+.TH LNST-CTL "1" "@date@"
+
+.\" To view this file while editing, run it through groff:
+.\" groff -Tascii -man lnst-ctl.1 | less -r
+
+.\" This file is a template that contains placeholders for
+.\" certain values. It needs to be processed before it can
+.\" be used as a man-page.
+
+.SH NAME
+lnst-ctl \- Linux Network Stack Test controller
+.SH SYNOPSIS
+.BR
+.B lnst-ctl
+[\fIOPTION\fR]... \fIRECIPE\fR... \fIACTION\fR
+.SH DESCRIPTION
+Linux Network Stack Test is a tool that supports development and execution
+of automated and portable network tests. For detailed description of the
+architecture of LNST please refer to project website
+(link listed on
+.B INTERNET RESOURCES
+bellow).
+
+.B lnst-ctl
+is a script used for managing slaves. It reads a recipe XML file as an
+input and executes tests on the specified slave machines.
+.SH OPTIONS
+.TP
+.B \-c, \-\-cleanup
+Cleanup all slave machines berfore executing the recipes.
+.TP
+.B \-d, \-\-debug
+Toggle emitting debugging messages.
+.TP
+.B \-h, \-\-help
+Display usage of this command.
+.TP
+.B \-p, \-\-packet_capture
+Capture and log all ongoing network communication between the slaves
+during the test.
+.TP
+.BI "\-x, \-\-result" =file
+Write results in XML format to the specified
+.IR file .
+.PP
+.I RECIPE
+can be either a LNST recipe file or a directory containing recipe files.
+One or more files/directories can be passed at the same time. Each recipe
+is a XML file. The format is described in detail in the online documentation
+available at LNST wiki (link is listed on
+.B INTERNET RESOURCES
+bellow).
+
+.I ACTION
+can be one from
+.BR "run",
+.BR "config_only" ", and"
+.BR "dump".
+
+When it is set to
+.BR "run",
+all provided recipe files will be sequentially executed. The network will
+be configured accordingly to each recipe file and clean up
+afterwards.
+
+In case of
+.BR "config_only",
+the recipes provided are processed up to the point where all the machines
+are prepared and properly configured. No tests will be executed and the
+cleanup phase is omitted as well. This mode of operation is useful if you
+want to perform some specific actions or tests outside of LNST using
+the configuration specified in a recipe file.
+
+At last, when the
+.I ACTION
+chosen is
+.BR "dump",
+the network will be configured as specified in the recipe.
+.B lnst-ctl
+will then dump contents of its internal data structures to the standard
+output. This feature can be used for debugging recipes or network setups.
+.SH CONFIGURATION
+.B lnst-ctl
+will look for configuration in the following locations:
+
+.I @conf_dir(a)lnst-ctl.conf
+.br
+.I ~/.lnst/lnst-ctl.conf
+
+For further description of file format or configuration options available,
+please refer to the configuration file itself, where each option is
+documented.
+
+.SH INTERNET RESOURCES
+Project Wiki: https://fedorahosted.org/lnst/
+.br
+Documentation: https://fedorahosted.org/lnst/wiki/Documentation
+.br
+Git Source Tree: http://git.fedorahosted.org/cgit/lnst.git/
+
+Mailing List: <lnst-developers(a)lists.fedorahosted.org>
+.SH AUTHORS
+\fBJiri Pirko\fR <jpirko(a)redhat.com>
+.br
+\fBJiri Zupka\fR <jzupka(a)redhat.com>
+.br
+\fBJan Tluka\fR <jtluka(a)redhat.com>
+.br
+\fBRadek Pazdera\fR <rpazdera(a)redhat.com>
+.br
+\fBOndrej Lichtner\fR <olichtne(a)redhat.com>
+.SH COPYRIGHT
+Copyright (C) 2012 Red Hat, Inc.
+
+LNST is distributed under GNU General Public License version 2. See
+the file "COPYING" in the source distribution for information on terms &
+conditions for accessing and otherwise using LNST.
diff --git a/install/lnst-slave.1.in b/install/lnst-slave.1.in
new file mode 100644
index 0000000..363f216
--- /dev/null
+++ b/install/lnst-slave.1.in
@@ -0,0 +1,99 @@
+.TH LNST-SLAVE "1" "@date@"
+
+.\" To view this file while editing, run it through groff:
+.\" groff -Tascii -man lnst-slave.1 | less -r
+
+.\" This file is a template that contains placeholders for
+.\" certain values. It needs to be processed before it can
+.\" be used as a man-page.
+
+.SH NAME
+lnst-slave \- Linux Network Stack Test slave daemon
+.SH SYNOPSIS
+.BR
+.B lnst-slave
+[\fB-d\fR] [\fB-e\fR] [\fB-h\fR] [\fB-i \fIpidfile\fR]
+[\fB-p \fIport_number\fR]
+.SH DESCRIPTION
+Linux Network Stack Test is a tool that supports development and execution
+of automated and portable network tests. For detailed description of the
+architecture of LNST please refer to project website
+(link listed on
+.B INTERNET RESOURCES
+bellow).
+
+.B lnst-slave
+is a daemon script that runs in the background and waits for incomming
+commands from a controller.
+.SH OPTIONS
+.TP
+.B \-d, \-\-debug
+Toggle emitting debugging messages.
+.TP
+.B \-e, \-\-daemonize
+Detach from parent process and run in background.
+.TP
+.B \-h, \-\-help
+Display usage of this command.
+.TP
+.BI "\-i, \-\-pidfile" =file
+File to write damonized process' PID to.
+.TP
+.BI "\-p, \-\-port" =port_number
+The port number
+.B lnst-slave
+should listen on for incomming commands.
+.SH CONFIGURATION
+.B lnst-slave
+will look for configuration in the following location:
+
+.I @conf_dir(a)lnst-slave.conf
+
+For further description of file format or configuration options available,
+please refer to the configuration file itself, where each option is
+documented.
+.SH FILES
+Apart from configuration, there are few important locations that
+.B lnst-slave
+works with. All bellow mentioned paths can be changed in the
+configuration file.
+.SS Log Path
+Every test exectution and all the commands run by
+.B lnst-slave
+during the test are logged to the following location:
+
+.I @slave_logs_dir@
+.SS Cache Location
+Test modules and tools used by the controllers with this slave are cached
+in resources cache. The cache is by default located at:
+
+.I @slave_cache_dir@
+
+The cache is fully under control of the
+.B lnst-slave
+daemon and is managed automatically. Making any modifications by hand is
+not recommended.
+.SH INTERNET RESOURCES
+Project Wiki: https://fedorahosted.org/lnst/
+.br
+Documentation: https://fedorahosted.org/lnst/wiki/Documentation
+.br
+Git Source Tree: http://git.fedorahosted.org/cgit/lnst.git/
+
+Mailing List: <lnst-developers(a)lists.fedorahosted.org>
+.SH AUTHORS
+\fBJiri Pirko\fR <jpirko(a)redhat.com>
+.br
+\fBJiri Zupka\fR <jzupka(a)redhat.com>
+.br
+\fBJan Tluka\fR <jtluka(a)redhat.com>
+.br
+\fBRadek Pazdera\fR <rpazdera(a)redhat.com>
+.br
+\fBOndrej Lichtner\fR <olichtne(a)redhat.com>
+.SH COPYRIGHT
+Copyright (C) 2012 Red Hat, Inc.
+
+LNST is distributed under GNU General Public License version 2. See
+the file "COPYING" in the source distribution for information on terms &
+conditions for accessing and otherwise using LNST.
--
1.7.7.6
11 years, 5 months
[lnst] NetTestParse: Making machine_id mandatory for commands
by Jiří Pírko
commit bcaae856e5e5ea7889728d4174c0ea22353016d1
Author: Radek Pazdera <rpazdera(a)redhat.com>
Date: Wed Nov 21 13:28:33 2012 +0100
NetTestParse: Making machine_id mandatory for commands
This patch fixes a bug with commands. Execution of commands on the
controller is no longer supported, so it is mandatory to pass a
valid machine_id to each command.
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
lnst/Controller/NetTestParse.py | 9 +++------
1 files changed, 3 insertions(+), 6 deletions(-)
---
diff --git a/lnst/Controller/NetTestParse.py b/lnst/Controller/NetTestParse.py
index bb40ed6..40223f5 100644
--- a/lnst/Controller/NetTestParse.py
+++ b/lnst/Controller/NetTestParse.py
@@ -554,12 +554,9 @@ class CommandParse(RecipeParser):
recipe["sequences"][self._seq_num]["commands"].append(command)
self._cmd_num = len(recipe["sequences"][self._seq_num]["commands"]) - 1
- if self._has_attribute(node, "machine_id"):
- machine_id = self._get_attribute(node, "machine_id")
- if machine_id and not machine_id in recipe["machines"]:
- raise XmlProcessingError("Invalid machine_id", node)
- else:
- machine_id = "0" # controller id
+ machine_id = self._get_attribute(node, "machine_id")
+ if machine_id and not machine_id in recipe["machines"]:
+ raise XmlProcessingError("Invalid machine_id", node)
command["machine_id"] = machine_id
command["type"] = self._get_attribute(node, "type")
11 years, 5 months