1 # Spec file for Open vSwitch.
3 # Copyright (C) 2009, 2010, 2011 Nicira Networks, Inc.
5 # Copying and distribution of this file, with or without modification,
6 # are permitted in any medium without royalty provided the copyright
7 # notice and this notice are preserved. This file is offered as-is,
8 # without warranty of any kind.
10 # When building, the rpmbuild command line should define
11 # openvswitch_version, xen_version, and build_number using -D arguments.
14 # rpmbuild -D "openvswitch_version 0.8.9~1+build123" -D "xen_version 2.6.18-128.1.1.el5.xs5.1.0.483.1000xen" -D "build_number --with-build-number=123" -bb /usr/src/redhat/SPECS/openvswitch-xen.spec
16 %define version %{openvswitch_version}-%{xen_version}
18 # bump this when breaking compatibility with userspace
19 %define module_abi_version 0
21 # extract kernel type (xen or kdump)
22 %define binsuffix -%(echo '%{xen_version}' | sed -r 's/^.*[0-9]+//')
23 # kernel version string w/o kernel type
24 %define kernel_version %(echo '%{xen_version}' | sed -r 's/[a-z]+$//')
25 # build-supplemental-pack.sh requires this naming for kernel module packages
26 %define module_package modules%{binsuffix}-%{kernel_version}
29 Summary: Open vSwitch daemon/database/utilities
30 Group: System Environment/Daemons
31 URL: http://www.openvswitch.org/
32 Vendor: Nicira Networks, Inc.
33 Version: %{openvswitch_version}
37 Source: openvswitch-%{openvswitch_version}.tar.gz
38 Buildroot: /tmp/openvswitch-xen-rpm
39 Requires: openvswitch_mod.ko.%{module_abi_version}
42 Open vSwitch provides standard network bridging functions augmented with
43 support for the OpenFlow protocol for remote per-flow control of
46 %package %{module_package}
47 Summary: Open vSwitch kernel module
48 Group: System Environment/Kernel
50 Provides: %{name}-modules = %{kernel_version}, openvswitch_mod.ko.%{module_abi_version}
51 Requires: kernel%{binsuffix} = %{kernel_version}
53 %description %{module_package}
54 Open vSwitch Linux kernel module compiled against kernel version
58 %setup -q -n openvswitch-%{openvswitch_version}
61 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
65 rm -rf $RPM_BUILD_ROOT
66 make install DESTDIR=$RPM_BUILD_ROOT
67 install -d -m 755 $RPM_BUILD_ROOT/etc
68 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
69 install -m 755 xenserver/etc_init.d_openvswitch \
70 $RPM_BUILD_ROOT/etc/init.d/openvswitch
71 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
72 $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
73 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
74 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
75 install -m 755 xenserver/etc_logrotate.d_openvswitch \
76 $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
77 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
78 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
79 $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
80 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
81 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
82 $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
83 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool/network-status
84 install -m 644 xenserver/etc_xensource_bugtool_network-status_openvswitch.xml \
85 $RPM_BUILD_ROOT/etc/xensource/bugtool/network-status/openvswitch.xml
86 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
87 install -m 644 vswitchd/vswitch.ovsschema \
88 $RPM_BUILD_ROOT/usr/share/openvswitch/vswitch.ovsschema
89 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
90 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
91 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
92 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
93 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
94 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
95 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
96 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
97 install -m 755 xenserver/etc_xensource_scripts_vif \
98 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
99 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
100 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
101 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
102 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
103 install -m 755 xenserver/usr_share_openvswitch_scripts_xen-bugtool-tc-class-show \
104 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/xen-bugtool-tc-class-show
105 install -m 755 utilities/ovs-save \
106 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-save
107 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
109 xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
110 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
112 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch
113 find datapath/linux-2.6 -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch \;
114 install xenserver/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
116 # Get rid of stuff we don't want to make RPM happy.
118 $RPM_BUILD_ROOT/usr/bin/ovs-controller \
119 $RPM_BUILD_ROOT/usr/bin/ovs-discover \
120 $RPM_BUILD_ROOT/usr/bin/ovs-openflowd \
121 $RPM_BUILD_ROOT/usr/bin/ovs-pki \
122 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
123 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-discover.8 \
124 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
125 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
127 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
130 rm -rf $RPM_BUILD_ROOT
133 # Do not run the first block if we are in the XenServer installer
134 if runlevel >/dev/null 2>&1; then
135 if test ! -e /var/xapi/network.dbcache; then
136 if test "$1" = 1; then
137 printf "Creating xapi database cache... "
139 printf "warning: Open vSwitch is being re-installed or upgraded,\n"
140 printf " but the xapi database cache is missing.\n"
141 printf "Re-creating xapi database cache... "
144 if /usr/share/openvswitch/scripts/interface-reconfigure rewrite; then
148 printf "Open vSwitch can only be installed on a XenServer that\n"
149 printf "has connectivity to xapi on the pool master. Please\n"
150 printf "fix connectivity to the pool master, then try again.\n"
156 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
157 cat >>/etc/sysctl.conf <<EOF
158 # This works around an issue in xhad, which binds to a particular
159 # Ethernet device, which in turn causes ICMP port unreachable messages
160 # if packets are received are on the wrong interface, which in turn
161 # can happen if we send out ARP replies on every interface (as Linux
162 # does by default) instead of just on the interface that has the IP
163 # address being ARPed for, which this sysctl setting in turn works
167 net.ipv4.conf.all.arp_filter = 1
171 if test ! -e /etc/openvswitch/conf.db; then
172 install -d -m 755 -o root -g root /etc/openvswitch
174 # Create ovs-vswitchd config database
175 ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
176 /usr/share/openvswitch/vswitch.ovsschema
178 # Create initial table in config database
179 ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
180 '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
184 # Create default or update existing /etc/sysconfig/openvswitch.
185 SYSCONFIG=/etc/sysconfig/openvswitch
186 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
187 if [ ! -e $SYSCONFIG ]; then
188 cp $TEMPLATE $SYSCONFIG
190 for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
192 if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
194 sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
199 # Deliberately break %postun in broken OVS builds that revert original
200 # XenServer scripts during rpm -U by moving the directory where it thinks
202 if [ -d /usr/lib/openvswitch/xs-original ]; then
203 mkdir -p /usr/lib/openvswitch/xs-saved
204 mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
205 rmdir /usr/lib/openvswitch/xs-original
208 # Replace XenServer files by our versions.
209 mkdir -p /usr/lib/openvswitch/xs-saved \
210 || printf "Could not create script backup directory.\n"
212 /opt/xensource/libexec/interface-reconfigure \
213 /opt/xensource/libexec/InterfaceReconfigure.py \
214 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
215 /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
216 /etc/xensource/scripts/vif
220 if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
221 mv "$f" /usr/lib/openvswitch/xs-saved/ \
222 || printf "Could not save original XenServer $s script\n"
223 ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
224 || printf "Could not link to Open vSwitch $s script\n"
228 # Clean up dangling symlinks to removed OVS replacement scripts no longer
229 # provided by OVS. Any time a replacement script is removed from OVS,
230 # it should be added here to ensure correct reversion from old versions of
231 # OVS that don't clean up dangling symlinks during the uninstall phase.
234 /usr/sbin/xen-bugtool
236 saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
237 [ -e "$saved" ] && mv -f "$saved" "$orig"
240 # Ensure all required services are set to run
241 for s in openvswitch openvswitch-xapi-update; do
242 if chkconfig --list $s >/dev/null 2>&1; then
243 chkconfig --del $s || printf "Could not remove $s init script."
245 chkconfig --add $s || printf "Could not add $s init script."
246 chkconfig $s on || printf "Could not enable $s init script."
249 # Configure system to use Open vSwitch
250 echo vswitch > /etc/xensource/network.conf
252 if [ "$1" = "1" ]; then # $1 = 2 for upgrade
253 printf "\nYou MUST reboot the server NOW to complete the change to\n"
254 printf "Open vSwitch. Attempts to modify networking on the server\n"
255 printf "or any hosted VM will fail until after the reboot and could\n"
256 printf "leave the server in an state requiring manual recovery.\n\n"
258 printf "\nTo use the new Open vSwitch install, you should reboot the\n"
259 printf "server now. Failure to do so may result in incorrect operation."
263 %post %{module_package}
264 # Ensure that modprobe will find our modules.
265 depmod %{xen_version}
268 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
269 for s in openvswitch openvswitch-xapi-update; do
270 chkconfig --del $s || printf "Could not remove $s init script."
275 # Restore original XenServer scripts if the OVS equivalent no longer exists.
276 # This works both in the upgrade and erase cases.
277 # This lists every file that every version of OVS has ever replaced. Never
278 # remove old files that OVS no longer replaces, or upgrades from old versions
279 # will fail to restore the XS originals, leaving the system in a broken state.
280 # Also be sure to add removed script paths to the %post scriptlet above to
281 # prevent the same problem when upgrading from old versions of OVS that lack
282 # this restore-on-upgrade logic.
284 /etc/xensource/scripts/vif \
286 /usr/sbin/xen-bugtool \
287 /opt/xensource/libexec/interface-reconfigure \
288 /opt/xensource/libexec/InterfaceReconfigure.py \
289 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
290 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
292 # Only revert dangling symlinks.
293 if [ -h "$f" ] && [ ! -e "$f" ]; then
295 if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
296 printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
297 printf "Could not restore original XenServer script.\n" >&2
300 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
301 || printf "Could not restore original XenServer $s script.\n" >&2
306 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
307 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
308 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
310 rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
311 /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
312 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
313 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
314 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
315 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
317 # Remove all configuration files
318 rm -f /etc/openvswitch/conf.db
319 rm -f /etc/sysconfig/openvswitch
320 rm -f /etc/openvswitch/vswitchd.cacert
321 rm -f /var/xapi/network.dbcache
323 # Remove saved XenServer scripts directory, but only if it's empty
324 rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
326 # Configure system to use bridge
327 echo bridge > /etc/xensource/network.conf
329 printf "\nYou MUST reboot the server now to complete the change to\n"
330 printf "standard Xen networking. Attempts to modify networking on the\n"
331 printf "server or any hosted VM will fail until after the reboot and\n"
332 printf "could leave the server in a state requiring manual recovery.\n\n"
336 %defattr(-,root,root)
337 /etc/init.d/openvswitch
338 /etc/init.d/openvswitch-xapi-update
339 /etc/xapi.d/plugins/openvswitch-cfg-update
340 /etc/xensource/bugtool/network-status/openvswitch.xml
341 /etc/logrotate.d/openvswitch
342 /etc/profile.d/openvswitch.sh
343 /usr/share/openvswitch/python/ovs/__init__.py
344 /usr/share/openvswitch/python/ovs/daemon.py
345 /usr/share/openvswitch/python/ovs/db/__init__.py
346 /usr/share/openvswitch/python/ovs/db/data.py
347 /usr/share/openvswitch/python/ovs/db/error.py
348 /usr/share/openvswitch/python/ovs/db/idl.py
349 /usr/share/openvswitch/python/ovs/db/parser.py
350 /usr/share/openvswitch/python/ovs/db/schema.py
351 /usr/share/openvswitch/python/ovs/db/types.py
352 /usr/share/openvswitch/python/ovs/dirs.py
353 /usr/share/openvswitch/python/ovs/fatal_signal.py
354 /usr/share/openvswitch/python/ovs/json.py
355 /usr/share/openvswitch/python/ovs/jsonrpc.py
356 /usr/share/openvswitch/python/ovs/ovsuuid.py
357 /usr/share/openvswitch/python/ovs/poller.py
358 /usr/share/openvswitch/python/ovs/process.py
359 /usr/share/openvswitch/python/ovs/reconnect.py
360 /usr/share/openvswitch/python/ovs/socket_util.py
361 /usr/share/openvswitch/python/ovs/stream.py
362 /usr/share/openvswitch/python/ovs/timeval.py
363 /usr/share/openvswitch/python/ovs/util.py
364 /usr/share/openvswitch/python/uuid.py
365 /usr/share/openvswitch/scripts/ovs-xapi-sync
366 /usr/share/openvswitch/scripts/interface-reconfigure
367 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
368 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
369 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
370 /usr/share/openvswitch/scripts/vif
371 /usr/share/openvswitch/scripts/sysconfig.template
372 /usr/share/openvswitch/scripts/xen-bugtool-tc-class-show
373 /usr/share/openvswitch/scripts/ovs-save
374 /usr/share/openvswitch/vswitch.ovsschema
375 /usr/sbin/ovs-vswitchd
376 /usr/sbin/ovsdb-server
381 /usr/bin/ovs-tcpundump
382 /usr/bin/ovs-vlan-test
384 /usr/bin/ovsdb-client
386 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
387 /usr/share/man/man1/ovsdb-client.1.gz
388 /usr/share/man/man1/ovsdb-server.1.gz
389 /usr/share/man/man1/ovsdb-tool.1.gz
390 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
391 /usr/share/man/man8/ovs-appctl.8.gz
392 /usr/share/man/man8/ovs-dpctl.8.gz
393 /usr/share/man/man8/ovs-ofctl.8.gz
394 /usr/share/man/man8/ovs-parse-leaks.8.gz
395 /usr/share/man/man1/ovs-pcap.1.gz
396 /usr/share/man/man1/ovs-tcpundump.1.gz
397 /usr/share/man/man8/ovs-vlan-test.8.gz
398 /usr/share/man/man8/ovs-vsctl.8.gz
399 /usr/share/man/man8/ovs-vswitchd.8.gz
401 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
402 %exclude /usr/sbin/ovs-brcompatd
403 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
404 %exclude /usr/share/openvswitch/scripts/*.py[co]
405 %exclude /usr/share/openvswitch/python/*.py[co]
406 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
407 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
409 %files %{module_package}
410 /lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
411 %exclude /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko