blob: ea5b7a4a1f0832b5686d6c57ae6256cf34f05e08 [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
Dan Talayco94696932010-07-09 09:42:24 -070056 You need to have Python setup tools and Scapy installed on your
57 system. See 'Pre-requisites' below.
58
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
Dan Talayco80857c52010-05-05 10:14:05 -070067 # cd oftest/tools/munger
68 # make install
69 # cd ../../tests
Dan Talayco94696932010-07-09 09:42:24 -070070 Make sure the switch you want to test is running --
71 see (4) below for the reference switch example.
Dan Talayco80857c52010-05-05 10:14:05 -070072 # ./oft --list
Dan Talayco78cb7cc2012-03-23 14:25:50 -070073 # sudo ./oft --test-spec=Echo
74 # sudo ./oft --verbose --log-file=""
Dan Talayco80857c52010-05-05 10:14:05 -070075 # sudo ./oft --test-spec=<mod> --platform=remote --host=...
Dan Talayco1ddefbf2010-03-07 21:56:47 -080076
77Longer Start
78++++++++++++
Dan Talaycof7dae842010-02-19 11:50:02 -080079
80 1. Pre-requisites:
Dan Talaycoa85e5662010-04-16 09:35:30 -070081 * An OF switch instance to test (see 4 below)
Dan Talayco80857c52010-05-05 10:14:05 -070082 * Root privilege on host running oft
83 * Switch running OpenFlow 1.0 and attempting to connect
84 to a controller on the machine running oft.
Dan Talayco78cb7cc2012-03-23 14:25:50 -070085 * Python 2.5 or 2.6. You can run platforms using eth interfaces
86 with Python 2.4. Python 2.7 may work.
Dan Talayco80857c52010-05-05 10:14:05 -070087 * Python setup tools (e.g.: sudo apt-get install python-setuptools)
88 * oftest checked out (called <oftest> here)
Dan Talaycof7dae842010-02-19 11:50:02 -080089 * scapy installed: http://www.secdev.org/projects/scapy/
Dan Talayco80857c52010-05-05 10:14:05 -070090 'sudo apt-get install scapy' should work on Debian.
Dan Talaycoa85e5662010-04-16 09:35:30 -070091 * tcpdump installed (optional, but scapy will complain if it's
92 not there)
Dan Talaycof7dae842010-02-19 11:50:02 -080093 * Doxygen and doxypy for document generation (optional)
94 * lint for source checking (optional)
95
96 2. Build the OpenFlow Python message classes
Dan Talaycoc4747962010-02-19 12:29:17 -080097
98 Important: The OF version used by the controller is based on
99 the file in <oftest>/tools/pylibopenflow/include/openflow.h
100 This is currently the 1.0 release file.
101
Dan Talaycoa85e5662010-04-16 09:35:30 -0700102 cd <oftest>/tools/munger
103 make install
Dan Talayco80857c52010-05-05 10:14:05 -0700104
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800105 This places files in <oftest>/src/python/oftest/src and then
106 calls setuptools to install on the local host
Dan Talaycof7dae842010-02-19 11:50:02 -0800107
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800108 3. Edit configuration if necessary
109 Local platforms work with veth interface pairs and default to
110 four ports. You can adjust this a bit with the command line
111 parameters port_count, base_of_port and base_if_index.
Dan Talayco80857c52010-05-05 10:14:05 -0700112
Dan Talayco673e0852010-03-06 23:09:23 -0800113 Starting from remote.py as a simple example, you can add your
114 own <platform>.py file and then have it imported with
Dan Talayco80857c52010-05-05 10:14:05 -0700115 --platform=<platform> on the command line. This is meant to
116 allow you to test remote switches attempting to connect to a
117 controller on a network accessible to the test host.
Dan Talaycof7dae842010-02-19 11:50:02 -0800118
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800119 4. Start the switch to test
Dan Talaycof7dae842010-02-19 11:50:02 -0800120 The switch must be running and actively attempting to
Dan Talayco80857c52010-05-05 10:14:05 -0700121 connect to a controller on the test host at the port number
122 used by oft (6633 by default, or specified as --port=<n> as
123 an argument to oft).
Dan Talaycof7dae842010-02-19 11:50:02 -0800124
Dan Talaycoa85e5662010-04-16 09:35:30 -0700125 If you're new to the test environment and want to check its
126 sanity, you can do the following. This requires that
127 your host kernel supports virtual ethernet interfaces. This
128 is best done in a window separate from where you will run oft.
Dan Talayco80857c52010-05-05 10:14:05 -0700129
Dan Talaycoa85e5662010-04-16 09:35:30 -0700130 4A. Check out openflow (preferably at the same level as oftest):
131 git clone git://openflowswitch.org/openflow.git
132 4B. cd openflow; ./boot.sh; ./configure; make
133 4C. cd ../oftest/tests
134 4D. Run the switch startup script:
135 sudo ./run_switch.py; Now you can run oft (see below).
Dan Talayco80857c52010-05-05 10:14:05 -0700136 4F. Use --help to see command line switches. If you use a port
137 number other than the default, make sure you use the same
138 one for the switch as for oft.
Dan Talaycoa85e5662010-04-16 09:35:30 -0700139 4E. Use control-C to terminate the switch daemons.
140 4F. To clean up the virtual ethernet interfaces, use
141 sudo rmmod veth
142
Dan Talayco78cb7cc2012-03-23 14:25:50 -0700143 New tools allow you to run an OVS instance as well. See
144 oftest/tools/ovs-ctl. You will need to install a version of
145 openvswitch. See http://openvswitch.org/.
146
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800147 5. Run oft
Dan Talayco673e0852010-03-06 23:09:23 -0800148 See Warning above; requires sudo to control the dataplane
Dan Talaycoa85e5662010-04-16 09:35:30 -0700149 cd <oftest>/tests
150 sudo ./oft --help
151
Dan Talayco10275aa2010-07-20 14:12:31 -0700152Helpful Note: Rebuilding
153++++++++++++++++++++++++
154
Dan Talayco10ffe262010-07-20 21:55:53 -0700155 If you ever make a change to the code in src/oftest/python...
156 you must rebuild and reinstall the source code. See Step (2)
157 in the Longer Start above.
Dan Talayco10275aa2010-07-20 14:12:31 -0700158
Dan Talayco10ffe262010-07-20 21:55:53 -0700159 If you see
Dan Talayco10275aa2010-07-20 14:12:31 -0700160
Dan Talayco10ffe262010-07-20 21:55:53 -0700161 WARNING:..:Could not import file ...
Dan Talayco10275aa2010-07-20 14:12:31 -0700162
Dan Talayco10ffe262010-07-20 21:55:53 -0700163 There is likely a Python error in the file. Try invoking the
164 Python cli directly and importing the file to get more
165 information.
Dan Talayco10275aa2010-07-20 14:12:31 -0700166
167Helpful Note: Recovering From Crash
168+++++++++++++++++++++++++++++++++++
169
Dan Talayco10ffe262010-07-20 21:55:53 -0700170 If the test script, oft, becomes unresponsive, you may find that
171 ^C does not break out of the script. In this case you have two
172 options:
Dan Talayco10275aa2010-07-20 14:12:31 -0700173
Dan Talayco10ffe262010-07-20 21:55:53 -0700174 * Use ^Z to interrupt the script and return to the shell prompt.
175 * Start another terminal window to the same machine.
Dan Talayco10275aa2010-07-20 14:12:31 -0700176
Dan Talayco10ffe262010-07-20 21:55:53 -0700177 In either case, you then need to kill the process that is hung.
178 Use the following commands:
Dan Talayco10275aa2010-07-20 14:12:31 -0700179
Dan Talayco10ffe262010-07-20 21:55:53 -0700180 me@host> ps aux | grep oft
181 root 4 0.0 S< Jul07 0:00 [ksoftirqd/0]
182 ...
183 root 14066 3.2 Tl 09:27 0:00 python ./oft ...
184 me 14074 0.0 R+ 09:28 0:00 grep oft
Dan Talayco10275aa2010-07-20 14:12:31 -0700185
Dan Talayco10ffe262010-07-20 21:55:53 -0700186 me@host> sudo kill -9 14066
Dan Talayco10275aa2010-07-20 14:12:31 -0700187
Dan Talayco10ffe262010-07-20 21:55:53 -0700188 where 14066 is the process ID of the hung process. (Replace it
189 with the PID for your process.)
190
191 This is still preliminary work and there are bugs in the framework
192 that need to be ironed out. Please report any issues to
193 dtalayco@stanford.edu.
Dan Talayco10275aa2010-07-20 14:12:31 -0700194
195
Dan Talaycoa85e5662010-04-16 09:35:30 -0700196OFT Command Line Options
197++++++++++++++++++++++++
198
199 Here is a summary of the oft command line options. Use --help to see
200 the long and short command option names.
201
202 platform : String identifying the target platform
203 controller_host : Host on which test controller is running (for sockets)
204 controller_port : Port on which test controller listens for switch cxn
205 port_count : Number of ports in dataplane
206 base_of_port : Base OpenFlow port number in dataplane
207 base_if_index : Base OS network interface for dataplane
208 test_dir : Directory to search for test files (default .)
209 test_spec : Specification of test(s) to run
210 log_file : Filename for test logging
211 list : Boolean: List all tests and exit
212 debug : String giving debug level (info, warning, error...)
213 verbose : Same as debug=verbose
Dan Talaycof7dae842010-02-19 11:50:02 -0800214
215Overview
216++++++++
217
218 The directory structure is currently:
219
220 <oftest>
221 `
222 |-- doc
223 |-- src
224 | `-- python
225 | `-- oftest
226 |-- tests
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800227 | `-- oft and files with test cases
Dan Talaycof7dae842010-02-19 11:50:02 -0800228 `-- tools
229 |-- munger
230 `-- pylibopenflow
231
232 The tools directory is what processes the OpenFlow header
233 files to produce Python classes representing OpenFlow messages.
234 The results are placed in src/python/oftest and currently
235 include:
236
237 message.py: The main API providing OF message classes
238 error.py: Subclasses for error messages
239 action.py: Subclasses for action specification
240 cstruct.py: Direct representation of C structures in Python
241 class_maps.py: Addition info about C structures
242
243 In addition, the following Python files are present in
244 src/python/oftest:
245
Dan Talaycof7dae842010-02-19 11:50:02 -0800246 controller.py: The controller representation
247 dataplane.py: The dataplane representation
248 action_list.py: Action list class
249 netutils.py: e.g., set promisc on sockets
250 ofutils.py: Utilities related to OpenFlow messages
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800251 oft_assert.py: Test framework level assertion
Dan Talaycof7dae842010-02-19 11:50:02 -0800252
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800253 Tests are run from the tests directory. The file oft is the
254 top level entry point for tests. Try ./oft --help for some more.
Dan Talaycof7dae842010-02-19 11:50:02 -0800255
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800256Important Notes
257+++++++++++++++
258
259 1. If you edit any of the files in src/python/oftest or any of the
260 scripts in tools/munger/scripts, you MUST re-run make install. This
261 is easy to forget.
262
263 2. If your running into issues with transactions, and it appears that
264 OpenFlow messages aren't quite right, start by looking at any length
265 fields in the packets. With the local platform, you can use wireshark
266 on the loopback interface as well as the dataplane veth interfaces.
267
268Adding Your Own Test Cases
269++++++++++++++++++++++++++
270
Dan Talayco6213e3c2010-07-21 21:49:00 -0700271 Check the online tutorial:
272 http://openflow.org/wk/index.php/OFTestTutorial
273
Dan Talayco1ddefbf2010-03-07 21:56:47 -0800274 You can:
275
276 * Add cases to an existing file
277 * Add a new file
278
279 If you add cases to an existing file, each case should be its own
280 class. It must inherit from unittest.TestCase or one of its
281 derivatives and define runTest (that's how test cases are discovered).
282
283 If you add a new file, it must implement a top level function called
284 test_set_init which takes a configuration dictionary. See basic.py
285 for an example. The main point of this is to pass the port map
286 object to the test cases. But you can access any configuration
287 parameters this way. Each test case in the new file must derive
288 from unittest.TestCase.
Dan Talaycof7dae842010-02-19 11:50:02 -0800289
Dan Talayco79f36082010-03-11 16:53:53 -0800290 CONVENTIONS:
291
292 The first line of the doc string for a file and for a test class is
293 displayed in the list command. Please keep it clear and under 50
294 characters.
295
Dan Talaycod2ca1032010-03-10 14:40:26 -0800296
297Using CentOS/RHEL
298+++++++++++++++++
299
300 CentOS/RHEL have two challenges: they are very tied to Python 2.4
301 (and Scapy requires Python 2.5 for its latest version) and they
302 require a kernel upgrade to use veth pairs for local platform
303 testing.
304
305 If you only need to control eth interfaces for a remote platform,
Dan Talaycofa16d592010-03-12 10:01:43 -0800306 you can use CentOS/RHEL without major disruption. The key is to
307 download scapy-1.2 from the following link:
Dan Talaycod2ca1032010-03-10 14:40:26 -0800308
309 wget http://hg.secdev.org/scapy/raw-file/v1.2.0.2/scapy.py
310
311 See: http://www.dirk-loss.de/scapy-doc/installation.html#installing-scapy-v1-2
312 for more info.
313
314 Copy scapy.py to /usr/lib/python2.4/site-packages
315
316 If you hit an error related to importing scapy.all, you just need
317 to change the import to refer to scapy (not scapy.all). See
318 examples in parse.py for example.
319
320
Dan Talaycof7dae842010-02-19 11:50:02 -0800321Other Info
322++++++++++
323
324 * Build doc with
325 + cd <oftest>/tools/munger
326 + make doc
327 Places the results in <oftest>/doc/html
Dan Talayco10ffe262010-07-20 21:55:53 -0700328 If you have problems, check the install location doxypy.py and
329 that it is set correctly in <oftest>/doc/Doxyfile
Dan Talaycof7dae842010-02-19 11:50:02 -0800330
331 * Run lint on sources
332 + cd <oftest>/tools/munger
333 + make lint
334 Places results in <oftest>/lint/*.log
335 The file controller.log currently has some errors indicated
336
337
338To Do
339+++++
340
Dan Talayco60a8d7a2010-03-03 15:20:59 -0800341 * Need to have an overview of the components of the test, how they
342 connect and how they are managed by the test framework.
Dan Talaycof7dae842010-02-19 11:50:02 -0800343 * See the Regression Test component on trac:
344 http://www.openflowswitch.org/bugs/openflow
345 http://www.openflowswitch.org/bugs/openflow/query?component=Regression+test+suite
346
Dan Talaycoc4747962010-02-19 12:29:17 -0800347 * Make the framework work with OF versions other than 1.0?
348