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"...
- </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://gi...
-</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://fedoraproje...
- <li>rpm -ivh <a
-
href="http://download.fedoraproject.org/pub/epel/5/i386/epel-release...
- <li><a
-
href="http://download.fedoraproject.org/pub/epel/5/i386/epel-release...
- 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