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-openflowd \
120 $RPM_BUILD_ROOT/usr/bin/ovs-pki \
121 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
122 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
123 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
125 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
128 rm -rf $RPM_BUILD_ROOT
131 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
132 cat >>/etc/sysctl.conf <<EOF
133 # This works around an issue in xhad, which binds to a particular
134 # Ethernet device, which in turn causes ICMP port unreachable messages
135 # if packets are received are on the wrong interface, which in turn
136 # can happen if we send out ARP replies on every interface (as Linux
137 # does by default) instead of just on the interface that has the IP
138 # address being ARPed for, which this sysctl setting in turn works
142 net.ipv4.conf.all.arp_filter = 1
146 if test ! -e /etc/openvswitch/conf.db; then
147 install -d -m 755 -o root -g root /etc/openvswitch
149 # Create ovs-vswitchd config database
150 ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
151 /usr/share/openvswitch/vswitch.ovsschema
153 # Create initial table in config database
154 ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
155 '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
159 # Create default or update existing /etc/sysconfig/openvswitch.
160 SYSCONFIG=/etc/sysconfig/openvswitch
161 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
162 if [ ! -e $SYSCONFIG ]; then
163 cp $TEMPLATE $SYSCONFIG
165 for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
167 if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
169 sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
174 # Deliberately break %postun in broken OVS builds that revert original
175 # XenServer scripts during rpm -U by moving the directory where it thinks
177 if [ -d /usr/lib/openvswitch/xs-original ]; then
178 mkdir -p /usr/lib/openvswitch/xs-saved
179 mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
180 rmdir /usr/lib/openvswitch/xs-original
183 # Replace XenServer files by our versions.
184 mkdir -p /usr/lib/openvswitch/xs-saved \
185 || printf "Could not create script backup directory.\n"
187 /opt/xensource/libexec/interface-reconfigure \
188 /opt/xensource/libexec/InterfaceReconfigure.py \
189 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
190 /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
191 /etc/xensource/scripts/vif
195 if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
196 mv "$f" /usr/lib/openvswitch/xs-saved/ \
197 || printf "Could not save original XenServer $s script\n"
198 ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
199 || printf "Could not link to Open vSwitch $s script\n"
203 # Clean up dangling symlinks to removed OVS replacement scripts no longer
204 # provided by OVS. Any time a replacement script is removed from OVS,
205 # it should be added here to ensure correct reversion from old versions of
206 # OVS that don't clean up dangling symlinks during the uninstall phase.
209 /usr/sbin/xen-bugtool
211 saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
212 [ -e "$saved" ] && mv -f "$saved" "$orig"
215 # Ensure all required services are set to run
216 for s in openvswitch openvswitch-xapi-update; do
217 if chkconfig --list $s >/dev/null 2>&1; then
218 chkconfig --del $s || printf "Could not remove $s init script."
220 chkconfig --add $s || printf "Could not add $s init script."
221 chkconfig $s on || printf "Could not enable $s init script."
224 if [ "$1" = "1" ]; then # $1 = 2 for upgrade
225 # Configure system to use Open vSwitch
226 echo vswitch > /etc/xensource/network.conf
228 printf "\nYou MUST reboot the server NOW to complete the change to\n"
229 printf "Open vSwitch. Attempts to modify networking on the server\n"
230 printf "or any hosted VM will fail until after the reboot and could\n"
231 printf "leave the server in an state requiring manual recovery.\n\n"
233 printf "\nTo use the new Open vSwitch install, you should reboot the\n"
234 printf "server now. Failure to do so may result in incorrect operation."
238 %post %{module_package}
239 # Ensure that modprobe will find our modules.
240 depmod %{xen_version}
243 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
244 for s in openvswitch openvswitch-xapi-update; do
245 chkconfig --del $s || printf "Could not remove $s init script."
250 # Restore original XenServer scripts if the OVS equivalent no longer exists.
251 # This works both in the upgrade and erase cases.
252 # This lists every file that every version of OVS has ever replaced. Never
253 # remove old files that OVS no longer replaces, or upgrades from old versions
254 # will fail to restore the XS originals, leaving the system in a broken state.
255 # Also be sure to add removed script paths to the %post scriptlet above to
256 # prevent the same problem when upgrading from old versions of OVS that lack
257 # this restore-on-upgrade logic.
259 /etc/xensource/scripts/vif \
261 /usr/sbin/xen-bugtool \
262 /opt/xensource/libexec/interface-reconfigure \
263 /opt/xensource/libexec/InterfaceReconfigure.py \
264 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
265 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
267 # Only revert dangling symlinks.
268 if [ -h "$f" ] && [ ! -e "$f" ]; then
270 if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
271 printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
272 printf "Could not restore original XenServer script.\n" >&2
275 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
276 || printf "Could not restore original XenServer $s script.\n" >&2
281 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
282 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
283 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
285 rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
286 /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
287 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
288 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
289 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
290 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
292 # Remove all configuration files
293 rm -f /etc/openvswitch/conf.db
294 rm -f /etc/sysconfig/openvswitch
295 rm -f /etc/openvswitch/vswitchd.cacert
296 rm -f /var/xapi/network.dbcache
298 # Remove saved XenServer scripts directory, but only if it's empty
299 rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
301 # Configure system to use bridge
302 echo bridge > /etc/xensource/network.conf
304 printf "\nYou MUST reboot the server now to complete the change to\n"
305 printf "standard Xen networking. Attempts to modify networking on the\n"
306 printf "server or any hosted VM will fail until after the reboot and\n"
307 printf "could leave the server in a state requiring manual recovery.\n\n"
311 %defattr(-,root,root)
312 /etc/init.d/openvswitch
313 /etc/init.d/openvswitch-xapi-update
314 /etc/xapi.d/plugins/openvswitch-cfg-update
315 /etc/xensource/bugtool/network-status/openvswitch.xml
316 /etc/logrotate.d/openvswitch
317 /etc/profile.d/openvswitch.sh
318 /usr/share/openvswitch/python/ovs/__init__.py
319 /usr/share/openvswitch/python/ovs/daemon.py
320 /usr/share/openvswitch/python/ovs/db/__init__.py
321 /usr/share/openvswitch/python/ovs/db/data.py
322 /usr/share/openvswitch/python/ovs/db/error.py
323 /usr/share/openvswitch/python/ovs/db/idl.py
324 /usr/share/openvswitch/python/ovs/db/parser.py
325 /usr/share/openvswitch/python/ovs/db/schema.py
326 /usr/share/openvswitch/python/ovs/db/types.py
327 /usr/share/openvswitch/python/ovs/dirs.py
328 /usr/share/openvswitch/python/ovs/fatal_signal.py
329 /usr/share/openvswitch/python/ovs/json.py
330 /usr/share/openvswitch/python/ovs/jsonrpc.py
331 /usr/share/openvswitch/python/ovs/ovsuuid.py
332 /usr/share/openvswitch/python/ovs/poller.py
333 /usr/share/openvswitch/python/ovs/process.py
334 /usr/share/openvswitch/python/ovs/reconnect.py
335 /usr/share/openvswitch/python/ovs/socket_util.py
336 /usr/share/openvswitch/python/ovs/stream.py
337 /usr/share/openvswitch/python/ovs/timeval.py
338 /usr/share/openvswitch/python/ovs/util.py
339 /usr/share/openvswitch/python/uuid.py
340 /usr/share/openvswitch/scripts/ovs-xapi-sync
341 /usr/share/openvswitch/scripts/interface-reconfigure
342 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
343 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
344 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
345 /usr/share/openvswitch/scripts/vif
346 /usr/share/openvswitch/scripts/sysconfig.template
347 /usr/share/openvswitch/scripts/xen-bugtool-tc-class-show
348 /usr/share/openvswitch/scripts/ovs-save
349 /usr/share/openvswitch/vswitch.ovsschema
350 /usr/sbin/ovs-vlan-bug-workaround
351 /usr/sbin/ovs-vswitchd
352 /usr/sbin/ovsdb-server
357 /usr/bin/ovs-tcpundump
358 /usr/bin/ovs-vlan-test
360 /usr/bin/ovsdb-client
362 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
363 /usr/share/man/man1/ovsdb-client.1.gz
364 /usr/share/man/man1/ovsdb-server.1.gz
365 /usr/share/man/man1/ovsdb-tool.1.gz
366 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
367 /usr/share/man/man8/ovs-appctl.8.gz
368 /usr/share/man/man8/ovs-dpctl.8.gz
369 /usr/share/man/man8/ovs-ofctl.8.gz
370 /usr/share/man/man8/ovs-parse-leaks.8.gz
371 /usr/share/man/man1/ovs-pcap.1.gz
372 /usr/share/man/man1/ovs-tcpundump.1.gz
373 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
374 /usr/share/man/man8/ovs-vlan-test.8.gz
375 /usr/share/man/man8/ovs-vsctl.8.gz
376 /usr/share/man/man8/ovs-vswitchd.8.gz
378 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
379 %exclude /usr/sbin/ovs-brcompatd
380 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
381 %exclude /usr/share/openvswitch/scripts/*.py[co]
382 %exclude /usr/share/openvswitch/python/*.py[co]
383 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
384 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
386 %files %{module_package}
387 /lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
388 %exclude /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko