1 # Spec file for Open vSwitch.
3 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicira, 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, kernel_name, kernel_version, and kernel_flavor
15 # rpmbuild -D "openvswitch_version 1.1.0+build123"
16 # -D "kernel_name NAME-xen"
17 # -D "kernel_version 2.6.32.12-0.7.1.xs5.6.100.323.170596"
18 # -D "kernel_flavor xen"
19 # -bb /usr/src/redhat/SPECS/openvswitch-xen.spec
21 %if %{?openvswitch_version:0}%{!?openvswitch_version:1}
22 %define openvswitch_version @VERSION@
25 %if %{?kernel_name:0}%{!?kernel_name:1}
26 %define kernel %(rpm -qa 'kernel*xen-devel' | head -1)
27 %define kernel_name %(rpm -q --queryformat "%%{Name}" %{kernel} | sed 's/-devel//' | sed 's/kernel-//')
28 %define kernel_version %(rpm -q --queryformat "%%{Version}-%%{Release}" %{kernel})
29 %define kernel_flavor xen
32 %define xen_version %{kernel_version}%{kernel_flavor}
34 # bump this when breaking compatibility with userspace
35 %define module_abi_version 0
37 # build-supplemental-pack.sh requires this naming for kernel module packages
38 %define module_package modules-%{kernel_flavor}-%{kernel_version}
41 Summary: Open vSwitch daemon/database/utilities
42 Group: System Environment/Daemons
43 URL: http://www.openvswitch.org/
45 Version: %{openvswitch_version}
49 Source: openvswitch-%{openvswitch_version}.tar.gz
50 Buildroot: /tmp/openvswitch-xen-rpm
51 Requires: openvswitch.ko.%{module_abi_version}
54 Open vSwitch provides standard network bridging functions augmented with
55 support for the OpenFlow protocol for remote per-flow control of
58 %package %{module_package}
59 Summary: Open vSwitch kernel module
60 Group: System Environment/Kernel
62 Provides: %{name}-modules-%{kernel_flavor} = %{kernel_version}, openvswitch.ko.%{module_abi_version}
63 Requires: kernel-%{kernel_name} = %{kernel_version}
65 %description %{module_package}
66 Open vSwitch Linux kernel module compiled against kernel version
70 %setup -q -n openvswitch-%{openvswitch_version}
73 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-linux=/lib/modules/%{xen_version}/build --enable-ssl
77 rm -rf $RPM_BUILD_ROOT
78 make install DESTDIR=$RPM_BUILD_ROOT
79 install -d -m 755 $RPM_BUILD_ROOT/etc
80 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
81 install -m 755 xenserver/etc_init.d_openvswitch \
82 $RPM_BUILD_ROOT/etc/init.d/openvswitch
83 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
84 $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
85 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
86 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
87 install -m 755 xenserver/etc_logrotate.d_openvswitch \
88 $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
89 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
90 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
91 $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
92 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
93 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
94 $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
95 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
96 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
97 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
98 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
99 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
100 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
101 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
102 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
103 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
104 install -m 755 xenserver/etc_xensource_scripts_vif \
105 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
106 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
107 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
108 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
109 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
110 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
112 xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
113 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
115 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch
116 find datapath/linux -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch \;
117 install python/compat/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
118 install python/compat/argparse.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
120 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool
121 cp -rf $RPM_BUILD_ROOT/usr/share/openvswitch/bugtool-plugins/* $RPM_BUILD_ROOT/etc/xensource/bugtool
123 # Get rid of stuff we don't want to make RPM happy.
125 $RPM_BUILD_ROOT/usr/bin/ovs-benchmark \
126 $RPM_BUILD_ROOT/usr/bin/ovs-l3ping \
127 $RPM_BUILD_ROOT/usr/bin/ovs-pki \
128 $RPM_BUILD_ROOT/usr/bin/ovs-test \
129 $RPM_BUILD_ROOT/usr/share/man/man1/ovs-benchmark.1 \
130 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-l3ping.8 \
131 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8 \
132 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-test.8
134 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
137 rm -rf $RPM_BUILD_ROOT
140 # A list of Citrix XenServer scripts that we might need to replace
141 # with our own versions.
143 /etc/xensource/scripts/vif
144 /opt/xensource/libexec/InterfaceReconfigure.py
145 /opt/xensource/libexec/InterfaceReconfigureBridge.py
146 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
147 /opt/xensource/libexec/interface-reconfigure"
149 # Calculate into $md5sums a comma-separated set of md5sums of the
150 # Citrix XenServer scripts that we might need to replace. We might be
151 # upgrading an older version of the package that moved the files out
152 # of the way, so we need to look for the files in those out-of-the-way
155 for script in $scripts; do
156 b=$(basename "$script")
157 if test -e /usr/lib/openvswitch/xs-saved/"$b"; then
158 f=/usr/lib/openvswitch/xs-saved/"$b"
159 elif test -e /usr/lib/openvswitch/xs-original/"$b"; then
160 f=/usr/lib/openvswitch/xs-original/"$b"
161 elif test -e "$script" && test ! -h "$script"; then
164 printf "\n$script: not found\n"
167 md5sums="$md5sums,$(md5sum $f | awk '{print $1}')"
171 # Now check the md5sums against the known sets of md5sums:
173 # - If they are known to be a version of XenServer scripts that we should
174 # replace, we replace them (by putting $scripts into $replace_files).
176 # - Otherwise, we guess that it's better not to replace them, because the
177 # improvements that our versions of the scripts provide are minimal, so
178 # it's better to avoid possibly breaking any changes made upstream by
181 cf09a68d9f8b434e79a4c83b01a3bb4b,395866df1b0b20c12c4dd2f7de0ecdb4,9d493545ae81463239d3162cbc798852,862d0939b441de9264a900628e950fe9,21f85db25599d7f026cd489385d58aa6)
183 replace_files=$scripts
184 printf "\nVerified host scripts from XenServer 6.0.0.\n"
187 c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,f3feff30aa3b3f8b514664a96a8dc0ab)
189 replace_files=$scripts
190 printf "\nVerified host scripts from XenServer 5.6-SP2.\n"
193 c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,24bae6906d182ba47668174f8e480cc6)
195 replace_files=$scripts
196 printf "\nVerified host scripts from XenServer 5.6-FP1.\n"
204 The host scripts on this machine are not those of any supported
205 version of XenServer. On XenServer earlier than 5.6-FP1, your Open
206 vSwitch installation will not work. On XenServer 5.6-FP1 or later,
207 Open vSwitch is not verified to work, which could lead to unexpected
214 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
215 cat >>/etc/sysctl.conf <<EOF
216 # This works around an issue in xhad, which binds to a particular
217 # Ethernet device, which in turn causes ICMP port unreachable messages
218 # if packets are received are on the wrong interface, which in turn
219 # can happen if we send out ARP replies on every interface (as Linux
220 # does by default) instead of just on the interface that has the IP
221 # address being ARPed for, which this sysctl setting in turn works
225 net.ipv4.conf.all.arp_filter = 1
229 if test ! -e /etc/openvswitch/conf.db; then
230 install -d -m 755 -o root -g root /etc/openvswitch
232 # Create ovs-vswitchd config database
233 ovsdb-tool -vconsole:off create /etc/openvswitch/conf.db \
234 /usr/share/openvswitch/vswitch.ovsschema
236 # Create initial table in config database
237 ovsdb-tool -vconsole:off transact /etc/openvswitch/conf.db \
238 '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
242 # Create default or update existing /etc/sysconfig/openvswitch.
243 SYSCONFIG=/etc/sysconfig/openvswitch
244 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
245 if [ ! -e $SYSCONFIG ]; then
246 cp $TEMPLATE $SYSCONFIG
248 for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
250 if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
252 sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
257 # Deliberately break %postun in broken OVS builds that revert original
258 # XenServer scripts during rpm -U by moving the directory where it thinks
260 if [ -d /usr/lib/openvswitch/xs-original ]; then
261 mkdir -p /usr/lib/openvswitch/xs-saved
262 mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
263 rmdir /usr/lib/openvswitch/xs-original
266 # Replace XenServer files by our versions.
267 mkdir -p /usr/lib/openvswitch/xs-saved \
268 || printf "Could not create script backup directory.\n"
269 for f in $replace_files; do
272 if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
273 mv "$f" /usr/lib/openvswitch/xs-saved/ \
274 || printf "Could not save original XenServer $s script\n"
275 ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
276 || printf "Could not link to Open vSwitch $s script\n"
280 # Clean up dangling symlinks to removed OVS replacement scripts no longer
281 # provided by OVS. Any time a replacement script is removed from OVS,
282 # it should be added here to ensure correct reversion from old versions of
283 # OVS that don't clean up dangling symlinks during the uninstall phase.
284 for orig in /usr/sbin/xen-bugtool $keep_files; do
285 saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
286 [ -e "$saved" ] && mv -f "$saved" "$orig"
289 # Ensure all required services are set to run
290 for s in openvswitch openvswitch-xapi-update; do
291 if chkconfig --list $s >/dev/null 2>&1; then
292 chkconfig --del $s || printf "Could not remove $s init script.\n"
294 chkconfig --add $s || printf "Could not add $s init script.\n"
295 chkconfig $s on || printf "Could not enable $s init script.\n"
298 if [ "$1" = "1" ]; then # $1 = 1 for install
299 # Configure system to use Open vSwitch
300 /opt/xensource/bin/xe-switch-network-backend vswitch
301 else # $1 = 2 for upgrade
303 mode=$(cat /etc/xensource/network.conf)
304 if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
305 printf "\nThe server is not configured to run Open vSwitch. To run in\n"
306 printf "vswitch mode, you must run the following command:\n\n"
307 printf "\txe-switch-network-backend vswitch"
312 %posttrans %{module_package}
313 # Ensure that modprobe will find our modules.
315 # This has to be in %posttrans instead of %post because older versions
316 # installed modules into a different directory and "rpm -U" runs the
317 # new version's %post before removing the old version's files, so if
318 # we use %post then depmod may find the old versions that are about to
320 depmod %{xen_version}
322 mode=$(cat /etc/xensource/network.conf)
323 if [ "$mode" = "vswitch" ] || [ "$mode" = "openvswitch" ]; then
324 printf "\nTo use the newly installed Open vSwitch kernel module, you\n"
325 printf "will either have to reboot the hypervisor or follow any\n"
326 printf "workarounds provided by your administration guide. Failure to do\n"
327 printf "so may result in incorrect operation."
332 if [ "$1" = "0" ]; then # $1 = 0 for uninstall
333 # Configure system to use bridge
334 /opt/xensource/bin/xe-switch-network-backend bridge
336 # The "openvswitch" service should have been removed from
337 # "xe-switch-network-backend bridge".
338 for s in openvswitch openvswitch-xapi-update; do
339 if chkconfig --list $s >/dev/null 2>&1; then
340 chkconfig --del $s || printf "Could not remove $s init script."
346 # Restore original XenServer scripts if the OVS equivalent no longer exists.
347 # This works both in the upgrade and erase cases.
348 # This lists every file that every version of OVS has ever replaced. Never
349 # remove old files that OVS no longer replaces, or upgrades from old versions
350 # will fail to restore the XS originals, leaving the system in a broken state.
351 # Also be sure to add removed script paths to the %post scriptlet above to
352 # prevent the same problem when upgrading from old versions of OVS that lack
353 # this restore-on-upgrade logic.
355 /etc/xensource/scripts/vif \
356 /usr/sbin/xen-bugtool \
357 /opt/xensource/libexec/interface-reconfigure \
358 /opt/xensource/libexec/InterfaceReconfigure.py \
359 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
360 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
362 # Only revert dangling symlinks.
363 if [ -h "$f" ] && [ ! -e "$f" ]; then
365 if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
366 printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
367 printf "Could not restore original XenServer script.\n" >&2
370 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
371 || printf "Could not restore original XenServer $s script.\n" >&2
376 if [ "$1" = "0" ]; then # $1 = 0 for uninstall
377 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
378 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
380 rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
381 /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
382 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
383 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
384 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
385 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
387 # Remove all configuration files
388 rm -f /etc/openvswitch/conf.db
389 rm -f /etc/sysconfig/openvswitch
390 rm -f /etc/openvswitch/vswitchd.cacert
392 # Remove saved XenServer scripts directory, but only if it's empty
393 rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
399 %defattr(-,root,root)
400 /etc/init.d/openvswitch
401 /etc/init.d/openvswitch-xapi-update
402 /etc/xapi.d/plugins/openvswitch-cfg-update
403 /etc/xensource/bugtool/*
404 /etc/logrotate.d/openvswitch
405 /etc/profile.d/openvswitch.sh
406 /usr/share/openvswitch/python/
407 /usr/share/openvswitch/bugtool-plugins/*
408 /usr/share/openvswitch/scripts/ovs-check-dead-ifs
409 /usr/share/openvswitch/scripts/ovs-xapi-sync
410 /usr/share/openvswitch/scripts/interface-reconfigure
411 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
412 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
413 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
414 /usr/share/openvswitch/scripts/vif
415 /usr/share/openvswitch/scripts/sysconfig.template
416 /usr/share/openvswitch/scripts/ovs-bugtool-*
417 /usr/share/openvswitch/scripts/ovs-save
418 /usr/share/openvswitch/scripts/ovs-ctl
419 /usr/share/openvswitch/scripts/ovs-lib
420 /usr/share/openvswitch/scripts/ovs-vtep
421 /usr/share/openvswitch/vswitch.ovsschema
422 /usr/share/openvswitch/vtep.ovsschema
423 /usr/sbin/ovs-bugtool
424 /usr/sbin/ovs-vlan-bug-workaround
425 /usr/sbin/ovs-vswitchd
426 /usr/sbin/ovsdb-server
429 /usr/bin/ovs-dpctl-top
431 /usr/bin/ovs-parse-backtrace
433 /usr/bin/ovs-tcpundump
434 /usr/bin/ovs-vlan-test
436 /usr/bin/ovsdb-client
439 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
440 /usr/share/man/man1/ovsdb-client.1.gz
441 /usr/share/man/man1/ovsdb-server.1.gz
442 /usr/share/man/man1/ovsdb-tool.1.gz
443 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
444 /usr/share/man/man5/vtep.5.gz
445 /usr/share/man/man8/ovs-appctl.8.gz
446 /usr/share/man/man8/ovs-bugtool.8.gz
447 /usr/share/man/man8/ovs-ctl.8.gz
448 /usr/share/man/man8/ovs-dpctl.8.gz
449 /usr/share/man/man8/ovs-dpctl-top.8.gz
450 /usr/share/man/man8/ovs-ofctl.8.gz
451 /usr/share/man/man8/ovs-parse-backtrace.8.gz
452 /usr/share/man/man1/ovs-pcap.1.gz
453 /usr/share/man/man1/ovs-tcpundump.1.gz
454 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
455 /usr/share/man/man8/ovs-vlan-test.8.gz
456 /usr/share/man/man8/ovs-vsctl.8.gz
457 /usr/share/man/man8/ovs-vswitchd.8.gz
458 /usr/share/man/man8/vtep-ctl.8.gz
461 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
462 %exclude /usr/share/openvswitch/scripts/*.py[co]
463 %exclude /usr/share/openvswitch/python/*.py[co]
464 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
465 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
467 %files %{module_package}
468 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch.ko