Ok, I implemented your suggestions. I originally put a couple of methods in
client/bin/net/net_utils.py, but this didn't really work well for server
jobs. So, the attached patch now adds two methods to
client/common_lib/hosts/base_classes.py, and it stores the current state so
when you enable IPFiltering it will restore to it's previous state.

patch is attached.

I tested this running netperf2 server side test.

kdl


On Mon, Mar 1, 2010 at 12:21 PM, Martin Bligh <[email protected]> wrote:

> iptables:
>
> is probably worth checking iptables is running on the system (binaries
> there and kernel has support) before trying to configure it ... and it
> should probably get reset back somehow after use?
>
> maybe also move this to an abstraction in net_utils, since two callers
> use it (eg disable_firewall(), then have the cleanup() test method call
> reenable_firewall() or something).
>
> On Fri, Feb 26, 2010 at 4:40 PM, K.D. Lucas <[email protected]> wrote:
> > So I've split the netpipe and netperf control files into separate control
> > files and a .py file for each one, so that it will be easier to add
> > additional tests that use the logic of the python scripts without
> > duplicating code.
> > I'm also taking advantage of the new added function to get the
> > platform_label, as in my testbed I have assigned a net_server platform
> label
> > for the machines I want to use as the network side of these tests.
> > Let me know your thoughts on this, as some of you might think the stress
> > version of these tests belongs in a site_tests directory. But definitely
> > splitting the code out with the reusable code in a separate python
> scripts
> > seems like a good idea.
> > Regards,
> > Kelly
> > --
> > K.D. Lucas
> > [email protected]
> >
> > _______________________________________________
> > Autotest mailing list
> > [email protected]
> > http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
> >
> >
>



-- 
K.D. Lucas
[email protected]
Index: server/tests/netpipe/control.srv
===================================================================
--- server/tests/netpipe/control.srv	(revision 4275)
+++ server/tests/netpipe/control.srv	(working copy)
@@ -1,6 +1,6 @@
-AUTHOR = "[email protected] (Bryce Boe)"
+AUTHOR = "[email protected] (Kelly Lucas)"
 TIME = "SHORT"
-NAME = "Netpipe Multi-machine"
+NAME = "Netpipe Basic"
 TEST_CATEGORY = "Stress"
 TEST_CLASS = 'Hardware'
 TEST_TYPE = "Server"
@@ -10,16 +10,13 @@
 incrementing buffer sizes.
 
 Arguments to run_test:
-server_ip     - the ip of the server (automatically filled in)
-client_ip     - the ip of the client (automatically filled in)
-role          - specifies either client or server (automatically filled in)
 bidirectional - indicates whether the test should run simultaneously in both
                 directions
 buffer_size   - Sets the send and receive TCP buffer sizes (from man NPtcp)
 upper_bound   - Specify the upper boundary to the size of message being tested.
                 By default, NetPIPE will stop when the time to transmit a block
                 exceeds one second. (from man NPtcp)
-perturbation_size -  NetPIPE chooses the message sizes at regular intervals,
+variance      -  NetPIPE chooses the message sizes at regular intervals,
                 increasing them exponentially from the lower boundary to the
                 upper boundary. At each point, it also tests perturbations of 3
                 bytes above and 3 bytes below (default) each test point to find
@@ -30,31 +27,14 @@
 
 from autotest_lib.server import utils
 
+buffer_size = 1048576
+upper_bound = 1048576
+variance = 17
 
 def run(pair):
-    print "running on %s and %s\n" % (pair[0], pair[1])
-    server = hosts.create_host(pair[0])
-    client = hosts.create_host(pair[1])
+    job.run_test('netpipe', pair=pair, buffer=buffer_size,
+                 upper_bound=upper_bound, variance=variance)
 
-    server_at = autotest.Autotest(server)
-    client_at = autotest.Autotest(client)
-
-    template = ''.join(["job.run_test('netpipe', server_ip='%s', client_ip=",
-                        "'%s', role='%s', bidirectional=True,",
-                        "buffer_size=1048576, upper_bound=1048576,"
-                        "perturbation_size=17)"])
-
-    server_control_file = template % (server.ip, client.ip, 'server')
-    client_control_file = template % (server.ip, client.ip, 'client')
-
-    server_command = subcommand(server_at.run,
-                                [server_control_file, server.hostname])
-    client_command = subcommand(client_at.run,
-                                [client_control_file, client.hostname])
-
-    parallel([server_command, client_command])
-
-
 # grab the pairs (and failures)
 (pairs, failures) = utils.form_ntuples_from_machines(machines, 2)
 
Index: server/tests/netpipe/control.stress.srv
===================================================================
--- server/tests/netpipe/control.stress.srv	(revision 0)
+++ server/tests/netpipe/control.stress.srv	(revision 0)
@@ -0,0 +1,63 @@
+AUTHOR = "[email protected] (Kelly Lucas)"
+TIME = "MEDIUM"
+NAME = "Netpipe Stress"
+TEST_CATEGORY = "Stress"
+TEST_CLASS = 'Network'
+TEST_TYPE = "Server"
+SYNC_COUNT = 2
+DOC = """
+netpipe_stress is a test which produces bandwidth and latency values for
+incrementing buffer sizes. This stress test will run for approximately 1 hour.
+If you need to adjust the run time, change the value of cycles in the run
+function.
+
+Arguments to run_test:
+bidirectional - indicates whether the test should run simultaneously in both
+                directions
+buffer_size   - Sets the send and receive TCP buffer sizes (from man NPtcp)
+upper_bound   - Specify the upper boundary to the size of message being tested.
+                By default, NetPIPE will stop when the time to transmit a block
+                exceeds one second. (from man NPtcp)
+variance      - NetPIPE chooses the message sizes at regular intervals,
+                increasing them exponentially from the lower boundary to the
+                upper boundary. At each point, it also tests perturbations of 3
+                bytes above and 3 bytes below (default) each test point to find
+                idiosyncrasies in the system. This perturbation  value  can be
+                changed using using this option or turned off by setting
+                perturbation_size to 0. (from man NPtcp)
+cycles        - Number of times to repeat each test. Each cycle takes about 6
+                minutes to complete.
+"""
+
+from autotest_lib.server import utils
+
+# Buffer sizes should not be less than 131072, as this will cause netpipe
+# to hang. 
+buffer_sizes = {131072: 'small',
+                262144: 'medium',
+                524288: 'large',
+                1048576: 'huge',
+               }
+cycles = 10
+upper_bound = 1048576
+variance = 17
+
+def run(pair):
+    for x in xrange(cycles):
+        for b in buffer_sizes:
+            tag = 'netpipe' + buffer_sizes[b] + str(x)
+            job.run_test('netpipe', tag=tag, pair=pair, buffer=b,
+                         upper_bound=upper_bound, variance=variance)
+
+
+# grab the pairs (and failures)
+print "Machines = %s" % machines
+(pairs, failures) = utils.form_ntuples_from_machines(machines, 2)
+print "pairs = %s" % pairs
+
+# log the failures
+for failure in failures:
+    job.record("FAIL", failure[0], "netpipe", failure[1])
+
+# now run through each pair and run
+job.parallel_simple(run, pairs, log=False)
Index: server/tests/netpipe/netpipe.py
===================================================================
--- server/tests/netpipe/netpipe.py	(revision 0)
+++ server/tests/netpipe/netpipe.py	(revision 0)
@@ -0,0 +1,50 @@
+from autotest_lib.server import autotest, hosts, subcommand, test
+from autotest_lib.server import utils
+
+class netpipe(test.test):
+    version = 2
+
+    def run_once(self, pair, buffer, upper_bound, variance):
+        print "running on %s and %s\n" % (pair[0], pair[1])
+
+        # Designate a platform label for the server side of tests.
+        server_label = 'net_server'
+
+        server = hosts.create_host(pair[0])
+        client = hosts.create_host(pair[1])
+
+        # If client has the server_label, then swap server and client.
+        platform_label = client.get_platform_label()
+        if platform_label == server_label:
+            (server, client) = (client, server)
+
+        # Disable IP Filters if they are enabled.
+        for m in [client, server]:
+            status = m.run('iptables -L')
+            if not status.exit_status:
+                m.disable_ipfilters()
+
+        server_at = autotest.Autotest(server)
+        client_at = autotest.Autotest(client)
+
+        template = ''.join(["job.run_test('netpipe', server_ip='%s', ",
+                            "client_ip='%s', role='%s', bidirectional=True, ",
+                            "buffer_size=%d, upper_bound=%d,"
+                            "perturbation_size=%d)"])
+
+        server_control_file = template % (server.ip, client.ip, 'server',
+                                          buffer, upper_bound, variance)
+        client_control_file = template % (server.ip, client.ip, 'client',
+                                          buffer, upper_bound, variance)
+
+        server_command = subcommand.subcommand(server_at.run,
+                                    [server_control_file, server.hostname])
+        client_command = subcommand.subcommand(client_at.run,
+                                    [client_control_file, client.hostname])
+
+        subcommand.parallel([server_command, client_command])
+
+        for m in [client, server]:
+            status = m.run('iptables -L')
+            if not status.exit_status:
+                m.enable_ipfilters()
Index: server/tests/netperf2/control.srv
===================================================================
--- server/tests/netperf2/control.srv	(revision 4275)
+++ server/tests/netperf2/control.srv	(working copy)
@@ -1,19 +1,16 @@
-AUTHOR = "[email protected] (Martin Bligh) and [email protected] (Bryce Boe)"
+AUTHOR = "[email protected] (K.D. Lucas)"
 TIME = "SHORT"
-NAME = "Netperf Multi-machine"
-TEST_CATEGORY = "Stress"
-TEST_CLASS = 'Hardware'
+NAME = "Netperf Basic"
+TEST_CATEGORY = "Benchmark"
+TEST_CLASS = 'Network'
 TEST_TYPE = "Server"
 SYNC_COUNT = 2
 DOC = """
-netperf_test is a 2 machine test (server/client) that measures the performance
+netperf2 is a 2 machine test (server/client) that measures the performance
 of various network attributes.
 
 Arguments to run_test:
 
-server_ip     - the ip of the server (automatically filled in)
-client_ip     - the ip of the client (automatically filled in)
-role          - specifies either client or server (automatically filled in)
 test          - the list of valid netperf tests that can be run
                 This currently is:
                   TCP_STREAM, TCP_SENDFILE, TCP_RR, TCP_CRR, UDP_STREAM, UDP_RR
@@ -22,34 +19,16 @@
                 the list is [1,10,100] then the test will run 3 times. If
                 bidirectional is set then there will be the specified number of
                 bidirectional streams.
+cycles        - The number of times to run each test.
 """
 
 from autotest_lib.server import utils
 
 
 def run(pair):
-    print "running on %s and %s\n" % (pair[0], pair[1])
-    server = hosts.create_host(pair[0])
-    client = hosts.create_host(pair[1])
+    job.run_test('netperf2', pair=pair, test='TCP_STREAM', time=10,
+                 stream_list=[1], cycles=1)
 
-    server_at = autotest.Autotest(server)
-    client_at = autotest.Autotest(client)
-
-    template = ''.join(["job.run_test('netperf2', server_ip='%s', client_ip=",
-                        "'%s', role='%s', test='TCP_STREAM', test_time=10,",
-                        "stream_list=[1,10])"])
-
-    server_control_file = template % (server.ip, client.ip, 'server')
-    client_control_file = template % (server.ip, client.ip, 'client')
-
-    server_command = subcommand(server_at.run,
-                                [server_control_file, server.hostname])
-    client_command = subcommand(client_at.run,
-                                [client_control_file, client.hostname])
-
-    parallel([server_command, client_command])
-
-
 # grab the pairs (and failures)
 (pairs, failures) = utils.form_ntuples_from_machines(machines, 2)
 
Index: server/tests/netperf2/control.stress.srv
===================================================================
--- server/tests/netperf2/control.stress.srv	(revision 0)
+++ server/tests/netperf2/control.stress.srv	(revision 0)
@@ -0,0 +1,49 @@
+AUTHOR = "[email protected] (Kelly Lucas)"
+TIME = "MEDIUM"
+NAME = "Netperf Stress"
+TEST_CATEGORY = "Stress"
+TEST_CLASS = 'Network'
+TEST_TYPE = "Server"
+SYNC_COUNT = 2
+DOC = """
+netperf_stress is a 2 machine test (server/client) that measures the performance
+of various network attributes. This test will cycle through the various types
+of supported tests and streams, and will take about 1 hour to run. 
+You can adjust the streams by changing the values of the streams list in the
+run function.
+
+Arguments to run_test:
+
+test          - the list of valid netperf tests that can be run
+                This currently is:
+                  TCP_STREAM, TCP_SENDFILE, TCP_RR, TCP_CRR, UDP_STREAM, UDP_RR
+test_time     - Specifies how long each iteration of the test should run for.
+stream_list   - A list containing the number of streams to run the test for. If
+                the list is [1,10,100] then the test will run 3 times. If
+                bidirectional is set then there will be the specified number of
+                bidirectional streams.
+"""
+
+from autotest_lib.server import utils
+
+
+def run(pair):
+    """
+    Run netperf with various parameter settings.
+    """
+    streams = [1, 10, 20, 40, 60, 80, 100, 200]
+    for t in ['TCP_STREAM', 'TCP_MAERTS', 'TCP_RR', 'TCP_CRR', 'UDP_RR']:
+        tag = 'netprerf2' + t
+        job.run_test('netperf2', tag=tag, pair=pair, test=t, time=60,
+                     stream_list=streams, cycles=1)
+
+
+# grab the pairs (and failures)
+(pairs, failures) = utils.form_ntuples_from_machines(machines, 2)
+
+# log the failures
+for failure in failures:
+    job.record("FAIL", failure[0], "netperf2", failure[1])
+
+# now run through each pair and run
+job.parallel_simple(run, pairs, log=False)
Index: server/tests/netperf2/netperf2.py
===================================================================
--- server/tests/netperf2/netperf2.py	(revision 0)
+++ server/tests/netperf2/netperf2.py	(revision 0)
@@ -0,0 +1,51 @@
+from autotest_lib.server import autotest, hosts, subcommand, test
+from autotest_lib.server import utils
+
+class netperf2(test.test):
+    version = 2
+
+    def run_once(self, pair, test, time, stream_list, cycles):
+        print "running on %s and %s\n" % (pair[0], pair[1])
+
+        # Designate a label for the server side tests.
+        server_label = 'net_server'
+
+        server = hosts.create_host(pair[0])
+        client = hosts.create_host(pair[1])
+
+        # If client has the server_label, then swap server and client.
+        platform_label = client.get_platform_label()
+        if platform_label == server_label:
+            (server, client) = (client, server)
+
+
+        # Disable IPFilters if they are enabled.
+        for m in [client, server]:
+            status = m.run('/sbin/iptables -L')
+            if not status.exit_status:
+                m.disable_ipfilters()
+
+        server_at = autotest.Autotest(server)
+        client_at = autotest.Autotest(client)
+
+        template = ''.join(["job.run_test('netperf2', server_ip='%s', ",
+                            "client_ip='%s', role='%s', test='%s', ",
+                            "test_time=%d, stream_list=%s, tag='%s', ",
+                            "iterations=%d)"])
+
+        server_control_file = template % (server.ip, client.ip, 'server', test, 
+                                          time, stream_list, test, cycles)
+        client_control_file = template % (server.ip, client.ip, 'client', test,
+                                          time, stream_list, test, cycles)
+
+        server_command = subcommand.subcommand(server_at.run,
+                                    [server_control_file, server.hostname])
+        client_command = subcommand.subcommand(client_at.run,
+                                    [client_control_file, client.hostname])
+
+        subcommand.parallel([server_command, client_command])
+
+        for m in [client, server]:
+            status = m.run('/sbin/iptables -L')
+            if not status.exit_status:
+                m.enable_ipfilters()
Index: client/common_lib/hosts/base_classes.py
===================================================================
--- client/common_lib/hosts/base_classes.py	(revision 4275)
+++ client/common_lib/hosts/base_classes.py	(working copy)
@@ -420,6 +420,20 @@
                                       % protection_level)
 
 
+    def disable_ipfilters(self):
+        """Allow all network packets in and out of the host."""
+        self.run('iptables-save > /tmp/iptable-rules')
+        self.run('iptables -P INPUT ACCEPT')
+        self.run('iptables -P FORWARD ACCEPT')
+        self.run('iptables -P OUTPUT ACCEPT')
+
+
+    def enable_ipfilters(self):
+        """Re-enable the IP filters disabled from disable_ipfilters()"""
+        if os.path.isfile('/tmp/iptable-rules'):
+            self.run('iptables-restore < /tmp/iptable-rules')
+
+
     def cleanup(self):
         pass
 
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to