blob: a8552bf5cd49f9f43092fce2d8041b7e57c32697 [file] [log] [blame]
Dan Talaycof7dae842010-02-19 11:50:02 -08001OpenFlow Testing Framework
Dan Talayco10ffe262010-07-20 21:55:53 -07002July, 2010
Dan Talayco78cb7cc2012-03-23 14:25:50 -07003Last updated March 2012
Dan Talaycof7dae842010-02-19 11:50:02 -08004
Dan Talaycof3171872010-05-07 09:29:57 -07005Copyright (c) 2010 The Board of Trustees of The Leland Stanford
6Junior University
7
Dan Talaycof7dae842010-02-19 11:50:02 -08008Warning
9+++++++
10
Dan Talayco10ffe262010-07-20 21:55:53 -070011 This is still experimental and it requires root privilege to
12 control the dataplane ports. As a consequence, there may be
13 risks to the machine on which this is running. Use caution.
Dan Talayco94696932010-07-09 09:42:24 -070014
Dan Talayco10ffe262010-07-20 21:55:53 -070015 Please see Helpful Notes below.
Dan Talayco551befa2010-07-15 17:05:32 -070016
Dan Talayco10275aa2010-07-20 14:12:31 -070017License
18+++++++
Dan Talayco551befa2010-07-15 17:05:32 -070019
Dan Talayco10ffe262010-07-20 21:55:53 -070020 The software included with this distribution is subject to the
21 OpenFlow Switching License as given in the included file LICENSE.
22 Details are also available at:
Dan Talayco551befa2010-07-15 17:05:32 -070023
Dan Talayco10275aa2010-07-20 14:12:31 -070024 http://www.openflow.org/wp/legal
Dan Talayco551befa2010-07-15 17:05:32 -070025
Dan Talayco10ffe262010-07-20 21:55:53 -070026 Other software referenced in this distribution is subject to its
27 respective license.
28
29Getting OFTest
30++++++++++++++
31
32 You can check out OFTest with git with the following command:
33
Dan Talayco78cb7cc2012-03-23 14:25:50 -070034 git clone git://github.com/floodlight/oftest
Dan Talayco551befa2010-07-15 17:05:32 -070035
Dan Talayco80857c52010-05-05 10:14:05 -070036Introduction
37++++++++++++
38
39 This test framework is meant to exercise a candidate OpenFlow
40 switch (the device/switch under test, DUT or SUT). It provides a
41 connection like a controller to which the switch connects and it
42 controls data plane ports, sending and receiving packets, which
43 should be connected to the switch.
44
45 There are two parts to running the test framework:
46
47 * Building the python libraries that support the OF protocol
48 * Running oft, the main entry point of the test framework
49
50 Normally log output from oft is sent to the file oft.log, but
51 can be redirected to the console by specifying --log-file="".
52
Dan Talaycof7dae842010-02-19 11:50:02 -080053Quick Start
54+++++++++++
Dan Talaycoa85e5662010-04-16 09:35:30 -070055
Rich Lane2a3bbb42012-10-04 15:45:32 -070056 You need to have Python and Scapy installed on your system.
57 See 'Pre-requisites' below.
Dan Talayco94696932010-07-09 09:42:24 -070058
Dan Talaycoa85e5662010-04-16 09:35:30 -070059 Make sure your switch is running and trying to connect to a
60 controller on the machine where you're running oft (normally port
Dan Talayco80857c52010-05-05 10:14:05 -070061 6633). See below regarding run_switch.py for a script that starts
62 up a software switch on the test host.
Dan Talaycoa85e5662010-04-16 09:35:30 -070063
64 Currently, switches must be running version 1.0 of OpenFlow.
65
Dan Talayco78cb7cc2012-03-23 14:25:50 -070066 # git clone git://github.com/floodlight/oftest
Rich Laneac2da802012-10-03 10:12:10 -070067 # cd oftest
Rich Lane2a3bbb42012-10-04 15:45:32 -070068 # make -C tools/munger
Dan Talayco94696932010-07-09 09:42:24 -070069 Make sure the switch you want to test is running --
70 see (4) below for the reference switch example.
Dan Talayco80857c52010-05-05 10:14:05 -070071 # ./oft --list
Dan Talayco78cb7cc2012-03-23 14:25:50 -070072 # sudo ./oft --test-spec=Echo
73 # sudo ./oft --verbose --log-file=""
Dan Talayco80857c52010-05-05 10:14:05 -070074 # sudo ./oft --test-spec=<mod> --platform=remote --host=...
Dan Talayco1ddefbf2010-03-07 21:56:47 -080075
76Longer Start
77++++++++++++
Dan Talaycof7dae842010-02-19 11:50:02 -080078
79 1. Pre-requisites:
Dan Talaycoa85e5662010-04-16 09:35:30 -070080 * An OF switch instance to test (see 4 below)
Dan Talayco80857c52010-05-05 10:14:05 -070081 * Root privilege on host running oft
82 * Switch running OpenFlow 1.0 and attempting to connect
83 to a controller on the machine running oft.
Dan Talayco78cb7cc2012-03-23 14:25:50 -070084 * Python 2.5 or 2.6. You can run platforms using eth interfaces
85 with Python 2.4. Python 2.7 may work.
Dan Talayco80857c52010-05-05 10:14:05 -070086 * oftest checked out (called <oftest> here)
Dan Talaycof7dae842010-02-19 11:50:02 -080087 * scapy installed: http://www.secdev.org/projects/scapy/
Dan Talayco80857c52010-05-05 10:14:05 -070088 'sudo apt-get install scapy' should work on Debian.
Rich Laneb42a31c2012-10-05 17:54:17 -070089 * pypcap installed: http://code.google.com/p/pypcap/ (optional)
90 'sudo apt-get install python-pypcap' should work on Debian.
91 Tests using VLAN tags may fail without pypcap.
Dan Talaycoa85e5662010-04-16 09:35:30 -070092 * tcpdump installed (optional, but scapy will complain if it's
93 not there)
Dan Talaycof7dae842010-02-19 11:50:02 -080094 * Doxygen and doxypy for document generation (optional)
95 * lint for source checking (optional)
96
97 2. Build the OpenFlow Python message classes
Dan Talaycoc4747962010-02-19 12:29:17 -080098
99 Important: The OF version used by the controller is based on
100 the file in <oftest>/tools/pylibopenflow/include/openflow.h
101 This is currently the 1.0 release file.
102
Rich Lane2a3bbb42012-10-04 15:45:32 -0700103 make -C <oftest>/tools/munger
Dan Talayco80857c52010-05-05 10:14:05 -0700104
Rich Lane2a3bbb42012-10-04 15:45:32 -0700105 This places files in <oftest>/src/python/oftest/src.
Dan Talaycof7dae842010-02-19 11:50:02 -0800106
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800107 3. Edit configuration if necessary
108 Local platforms work with veth interface pairs and default to
109 four ports. You can adjust this a bit with the command line
110 parameters port_count, base_of_port and base_if_index.
Dan Talayco80857c52010-05-05 10:14:05 -0700111
Dan Talayco673e0852010-03-06 23:09:23 -0800112 Starting from remote.py as a simple example, you can add your
113 own <platform>.py file and then have it imported with
Dan Talayco80857c52010-05-05 10:14:05 -0700114 --platform=<platform> on the command line. This is meant to
115 allow you to test remote switches attempting to connect to a
116 controller on a network accessible to the test host.
Dan Talaycof7dae842010-02-19 11:50:02 -0800117
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800118 4. Start the switch to test
Dan Talaycof7dae842010-02-19 11:50:02 -0800119 The switch must be running and actively attempting to
Dan Talayco80857c52010-05-05 10:14:05 -0700120 connect to a controller on the test host at the port number
121 used by oft (6633 by default, or specified as --port=<n> as
122 an argument to oft).
Dan Talaycof7dae842010-02-19 11:50:02 -0800123
Dan Talaycoa85e5662010-04-16 09:35:30 -0700124 If you're new to the test environment and want to check its
125 sanity, you can do the following. This requires that
126 your host kernel supports virtual ethernet interfaces. This
127 is best done in a window separate from where you will run oft.
Dan Talayco80857c52010-05-05 10:14:05 -0700128
Dan Talaycoa85e5662010-04-16 09:35:30 -0700129 4A. Check out openflow (preferably at the same level as oftest):
130 git clone git://openflowswitch.org/openflow.git
131 4B. cd openflow; ./boot.sh; ./configure; make
Rich Lane7bfaeb42012-10-04 18:18:44 -0700132 4C. cd ../oftest
Dan Talaycoa85e5662010-04-16 09:35:30 -0700133 4D. Run the switch startup script:
134 sudo ./run_switch.py; Now you can run oft (see below).
Dan Talayco80857c52010-05-05 10:14:05 -0700135 4F. Use --help to see command line switches. If you use a port
136 number other than the default, make sure you use the same
137 one for the switch as for oft.
Dan Talaycoa85e5662010-04-16 09:35:30 -0700138 4E. Use control-C to terminate the switch daemons.
139 4F. To clean up the virtual ethernet interfaces, use
140 sudo rmmod veth
141
Dan Talayco78cb7cc2012-03-23 14:25:50 -0700142 New tools allow you to run an OVS instance as well. See
143 oftest/tools/ovs-ctl. You will need to install a version of
144 openvswitch. See http://openvswitch.org/.
145
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800146 5. Run oft
Dan Talayco673e0852010-03-06 23:09:23 -0800147 See Warning above; requires sudo to control the dataplane
Rich Laneac2da802012-10-03 10:12:10 -0700148 cd <oftest>
Dan Talaycoa85e5662010-04-16 09:35:30 -0700149 sudo ./oft --help
150
Dan Talayco10275aa2010-07-20 14:12:31 -0700151Helpful Note: Recovering From Crash
152+++++++++++++++++++++++++++++++++++
153
Dan Talayco10ffe262010-07-20 21:55:53 -0700154 If the test script, oft, becomes unresponsive, you may find that
155 ^C does not break out of the script. In this case you have two
156 options:
Dan Talayco10275aa2010-07-20 14:12:31 -0700157
Dan Talayco10ffe262010-07-20 21:55:53 -0700158 * Use ^Z to interrupt the script and return to the shell prompt.
159 * Start another terminal window to the same machine.
Dan Talayco10275aa2010-07-20 14:12:31 -0700160
Dan Talayco10ffe262010-07-20 21:55:53 -0700161 In either case, you then need to kill the process that is hung.
162 Use the following commands:
Dan Talayco10275aa2010-07-20 14:12:31 -0700163
Dan Talayco10ffe262010-07-20 21:55:53 -0700164 me@host> ps aux | grep oft
165 root 4 0.0 S< Jul07 0:00 [ksoftirqd/0]
166 ...
167 root 14066 3.2 Tl 09:27 0:00 python ./oft ...
168 me 14074 0.0 R+ 09:28 0:00 grep oft
Dan Talayco10275aa2010-07-20 14:12:31 -0700169
Dan Talayco10ffe262010-07-20 21:55:53 -0700170 me@host> sudo kill -9 14066
Dan Talayco10275aa2010-07-20 14:12:31 -0700171
Dan Talayco10ffe262010-07-20 21:55:53 -0700172 where 14066 is the process ID of the hung process. (Replace it
173 with the PID for your process.)
174
175 This is still preliminary work and there are bugs in the framework
176 that need to be ironed out. Please report any issues to
177 dtalayco@stanford.edu.
Dan Talayco10275aa2010-07-20 14:12:31 -0700178
179
Dan Talaycoa85e5662010-04-16 09:35:30 -0700180OFT Command Line Options
181++++++++++++++++++++++++
182
183 Here is a summary of the oft command line options. Use --help to see
184 the long and short command option names.
185
186 platform : String identifying the target platform
187 controller_host : Host on which test controller is running (for sockets)
188 controller_port : Port on which test controller listens for switch cxn
189 port_count : Number of ports in dataplane
190 base_of_port : Base OpenFlow port number in dataplane
191 base_if_index : Base OS network interface for dataplane
192 test_dir : Directory to search for test files (default .)
193 test_spec : Specification of test(s) to run
194 log_file : Filename for test logging
195 list : Boolean: List all tests and exit
196 debug : String giving debug level (info, warning, error...)
197 verbose : Same as debug=verbose
Dan Talaycof7dae842010-02-19 11:50:02 -0800198
199Overview
200++++++++
201
202 The directory structure is currently:
203
204 <oftest>
205 `
Rich Laneac2da802012-10-03 10:12:10 -0700206 |-- oft
Dan Talaycof7dae842010-02-19 11:50:02 -0800207 |-- doc
208 |-- src
209 | `-- python
210 | `-- oftest
211 |-- tests
Rich Laneac2da802012-10-03 10:12:10 -0700212 | `-- test cases
Dan Talaycof7dae842010-02-19 11:50:02 -0800213 `-- tools
214 |-- munger
215 `-- pylibopenflow
216
217 The tools directory is what processes the OpenFlow header
218 files to produce Python classes representing OpenFlow messages.
219 The results are placed in src/python/oftest and currently
220 include:
221
222 message.py: The main API providing OF message classes
223 error.py: Subclasses for error messages
224 action.py: Subclasses for action specification
225 cstruct.py: Direct representation of C structures in Python
226 class_maps.py: Addition info about C structures
227
228 In addition, the following Python files are present in
229 src/python/oftest:
230
Dan Talaycof7dae842010-02-19 11:50:02 -0800231 controller.py: The controller representation
232 dataplane.py: The dataplane representation
233 action_list.py: Action list class
234 netutils.py: e.g., set promisc on sockets
235 ofutils.py: Utilities related to OpenFlow messages
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800236 oft_assert.py: Test framework level assertion
Rich Laneac2da802012-10-03 10:12:10 -0700237 testutils.py: Test utilities
Dan Talaycof7dae842010-02-19 11:50:02 -0800238
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800239 Tests are run from the tests directory. The file oft is the
240 top level entry point for tests. Try ./oft --help for some more.
Dan Talaycof7dae842010-02-19 11:50:02 -0800241
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800242Important Notes
243+++++++++++++++
244
Rich Lane2a3bbb42012-10-04 15:45:32 -0700245 1. If you change any of the code generation scripts in
246 tools/munger/scripts you must re-run make -C tools/munger to
247 regenerate the OpenFlow message classes.
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800248
249 2. If your running into issues with transactions, and it appears that
250 OpenFlow messages aren't quite right, start by looking at any length
251 fields in the packets. With the local platform, you can use wireshark
252 on the loopback interface as well as the dataplane veth interfaces.
253
Rich Laneb42a31c2012-10-05 17:54:17 -0700254 3. If tests dealing with VLANs fail unexpectedly then try installing
255 pypcap (see Longer Start above).
256
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800257Adding Your Own Test Cases
258++++++++++++++++++++++++++
259
Dan Talayco6213e3c2010-07-21 21:49:00 -0700260 Check the online tutorial:
261 http://openflow.org/wk/index.php/OFTestTutorial
262
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800263 You can:
264
265 * Add cases to an existing file
266 * Add a new file
267
268 If you add cases to an existing file, each case should be its own
269 class. It must inherit from unittest.TestCase or one of its
270 derivatives and define runTest (that's how test cases are discovered).
271
272 If you add a new file, it must implement a top level function called
273 test_set_init which takes a configuration dictionary. See basic.py
274 for an example. The main point of this is to pass the port map
275 object to the test cases. But you can access any configuration
276 parameters this way. Each test case in the new file must derive
277 from unittest.TestCase.
Dan Talaycof7dae842010-02-19 11:50:02 -0800278
Dan Talayco79f36082010-03-11 16:53:53 -0800279 CONVENTIONS:
280
281 The first line of the doc string for a file and for a test class is
282 displayed in the list command. Please keep it clear and under 50
283 characters.
284
Dan Talaycod2ca1032010-03-10 14:40:26 -0800285
286Using CentOS/RHEL
287+++++++++++++++++
288
289 CentOS/RHEL have two challenges: they are very tied to Python 2.4
290 (and Scapy requires Python 2.5 for its latest version) and they
291 require a kernel upgrade to use veth pairs for local platform
292 testing.
293
294 If you only need to control eth interfaces for a remote platform,
Dan Talaycofa16d592010-03-12 10:01:43 -0800295 you can use CentOS/RHEL without major disruption. The key is to
296 download scapy-1.2 from the following link:
Dan Talaycod2ca1032010-03-10 14:40:26 -0800297
298 wget http://hg.secdev.org/scapy/raw-file/v1.2.0.2/scapy.py
299
300 See: http://www.dirk-loss.de/scapy-doc/installation.html#installing-scapy-v1-2
301 for more info.
302
303 Copy scapy.py to /usr/lib/python2.4/site-packages
304
305 If you hit an error related to importing scapy.all, you just need
306 to change the import to refer to scapy (not scapy.all). See
307 examples in parse.py for example.
308
309
Dan Talaycof7dae842010-02-19 11:50:02 -0800310Other Info
311++++++++++
312
313 * Build doc with
314 + cd <oftest>/tools/munger
315 + make doc
316 Places the results in <oftest>/doc/html
Dan Talayco10ffe262010-07-20 21:55:53 -0700317 If you have problems, check the install location doxypy.py and
318 that it is set correctly in <oftest>/doc/Doxyfile
Dan Talaycof7dae842010-02-19 11:50:02 -0800319
320 * Run lint on sources
321 + cd <oftest>/tools/munger
322 + make lint
323 Places results in <oftest>/lint/*.log
324 The file controller.log currently has some errors indicated
325
326
327To Do
328+++++
329
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800330 * Need to have an overview of the components of the test, how they
331 connect and how they are managed by the test framework.
Dan Talaycof7dae842010-02-19 11:50:02 -0800332 * See the Regression Test component on trac:
333 http://www.openflowswitch.org/bugs/openflow
334 http://www.openflowswitch.org/bugs/openflow/query?component=Regression+test+suite
335
Dan Talaycoc4747962010-02-19 12:29:17 -0800336 * Make the framework work with OF versions other than 1.0?
337