2 # Copyright (c) 2013 Nicira, Inc.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
25 OVS_SRC = HOME + "/ovs"
27 PATH = "%(ovs)s/utilities:%(ovs)s/ovsdb:%(ovs)s/vswitchd" % {"ovs": OVS_SRC}
29 ENV["CFLAGS"] = "-g -O0 -Wall -Wextra -Wno-deprecated-declarations"
30 ENV["PATH"] = PATH + ":" + ENV["PATH"]
37 def _sh(*args, **kwargs):
38 print "------> " + " ".join(args)
39 shell = len(args) == 1
40 if kwargs.get("capture", False):
41 proc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=shell)
42 return proc.stdout.readlines()
43 elif kwargs.get("check", True):
44 subprocess.check_call(args, shell=shell)
46 subprocess.call(args, shell=shell)
50 return _sh("uname", "-r", capture=True)[0].strip()
55 configure = ["./configure", "--prefix=" + ROOT, "--localstatedir=" + ROOT,
56 "--with-logdir=%s/log" % ROOT, "--with-rundir=%s/run" % ROOT,
57 "--with-linux=/lib/modules/%s/build" % uname(),
58 "--with-dbdir=" + ROOT]
61 configure.append("--enable-Werror")
63 if options.cache_time:
64 configure.append("--enable-cache-time")
67 configure.append("--mandir=" + options.mandir)
75 make = "make -s -j 8 " + args
77 _sh("cgcc", "--version", capture=True)
87 commands.append(check)
91 ctags = ['ctags', '-R', '-f', '.tags']
94 _sh(*(ctags + ['--exclude="datapath/"']))
97 _sh(*ctags) # Some versions of ctags don't have --exclude
102 _sh('cscope', '-R', '-b')
109 for proc in ["ovs-vswitchd", "ovsdb-server"]:
110 if os.path.exists("%s/run/openvswitch/%s.pid" % (ROOT, proc)):
111 _sh("ovs-appctl", "-t", proc, "exit", check=False)
113 _sh("sudo", "killall", "-q", "-2", proc, check=False)
114 commands.append(kill)
119 if os.path.exists(ROOT):
121 for dp in _sh("ovs-dpctl dump-dps", capture=True):
122 _sh("ovs-dpctl", "del-dp", dp.strip())
123 commands.append(reset)
128 for d in ["log", "run"]:
129 d = "%s/%s" % (ROOT, d)
130 shutil.rmtree(d, ignore_errors=True)
133 pki_dir = ROOT + "/pki"
134 if not os.path.exists(pki_dir):
138 _sh("ovs-pki req+sign ovsclient")
141 if not os.path.exists(ROOT + "/conf.db"):
142 _sh("ovsdb-tool", "create", ROOT + "/conf.db",
143 OVS_SRC + "/vswitchd/vswitch.ovsschema")
145 opts = ["--pidfile", "--log-file", "--enable-dummy"]
147 _sh(*(["ovsdb-server",
148 "--remote=punix:%s/run/db.sock" % ROOT,
149 "--remote=db:Open_vSwitch,Open_vSwitch,manager_options",
150 "--private-key=db:Open_vSwitch,SSL,private_key",
151 "--certificate=db:Open_vSwitch,SSL,certificate",
152 "--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert",
153 "--detach", "-vconsole:off"] + opts))
155 _sh("ovs-vsctl --no-wait --bootstrap set-ssl %s/ovsclient-privkey.pem" \
156 " %s/ovsclient-cert.pem %s/vswitchd.cacert"
157 % (pki_dir, pki_dir, pki_dir))
158 version = _sh("ovs-vsctl --no-wait --version", capture=True)
159 version = version[0].strip().split()[3]
160 root_uuid = _sh("ovs-vsctl --no-wait --bare list Open_vSwitch",
161 capture=True)[0].strip()
162 _sh("ovs-vsctl --no-wait set Open_vSwitch %s ovs_version=%s"
163 % (root_uuid, version))
165 cmd = [OVS_SRC + "/vswitchd/ovs-vswitchd"]
167 cmd = ["gdb", "--args"] + cmd
168 elif options.valgrind:
169 cmd = ["valgrind", "--track-origins=yes"] + cmd
172 opts = opts + ["-vconsole:off", "--detach"]
178 if not os.path.exists("/lib/modules"):
179 print "Missing modules directory. Is this a Linux system?"
183 _sh("rmmod", "openvswitch")
184 except subprocess.CalledProcessError, e:
185 pass # Module isn't loaded
188 _sh("rm /lib/modules/%s/extra/openvswitch.ko" % uname())
189 except subprocess.CalledProcessError, e:
190 pass # Module isn't installed
194 make("modules_install")
196 _sh("modprobe", "openvswitch")
197 _sh("dmesg | grep openvswitch | tail -1")
198 commands.append(modinst)
202 print "export PATH=" + ENV["PATH"]
210 This program is designed to help developers build and run Open vSwitch without
211 necessarily needing to know the gory details. Given some basic requirements
212 (described below), it can be used to build and run Open vSwitch, keeping
213 runtime files in the user's home directory.
216 # This section can be run as a script on ubuntu systems.
218 # First install the basic requirements needed to build Open vSwitch.
219 sudo apt-get install git build-essential libtool autoconf pkg-config \\
220 libssl-dev pkg-config gdb linux-headers-`uname -r`
222 # Next clone the Open vSwitch source.
223 git clone git://git.openvswitch.org/openvswitch %(ovs)s
225 # Setup environment variables.
231 # Install the kernel module
232 sudo insmod %(ovs)s/datapath/linux/openvswitch.ko
238 conf - Configure the ovs source.
239 make - Build the source (must have been configured).
240 check - Run the unit tests.
241 tag - Run ctags and cscope over the source.
242 kill - Kill all running instances of ovs.
243 reset - Reset any runtime configuration in %(run)s.
245 modinst - Build ovs and install the kernel module.
246 env - Print the required path environment variable.
247 doc - Print this message.
248 """ % {"ovs": OVS_SRC, "v": sys.argv[0], "run": ROOT}
257 description = "Open vSwitch developer configuration. Try `%prog doc`."
258 cmd_names = [c.__name__ for c in commands]
259 parser = optparse.OptionParser(usage="usage: %prog"
260 + " [options] [%s] ..."
261 % "|".join(cmd_names),
262 description=description)
264 group = optparse.OptionGroup(parser, "conf")
265 group.add_option("--disable-Werror", dest="werror", action="store_false",
266 default=True, help="compile without the Werror flag")
267 group.add_option("--cache-time", dest="cache_time",
268 action="store_true", help="configure with cached timing")
269 group.add_option("--mandir", dest="mandir", metavar="MANDIR",
270 help="configure the man documentation install directory")
271 parser.add_option_group(group)
273 group = optparse.OptionGroup(parser, "run")
274 group.add_option("-g", "--gdb", dest="gdb", action="store_true",
275 help="run ovs-vswitchd under gdb")
276 group.add_option("--valgrind", dest="valgrind", action="store_true",
277 help="run ovs-vswitchd under valgrind")
278 parser.add_option_group(group)
280 options, args = parser.parse_args()
283 if arg not in cmd_names:
284 print "Unknown argument " + arg
290 print "Missing %s." % OVS_SRC
295 if arg == cmd.__name__:
299 if __name__ == '__main__':