1 # Spec file for Open vSwitch.
3 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 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 tests have to be skipped while building, specify the '--without check'
22 # option. For example:
23 # rpmbuild -bb --without check xenserver/openvswitch-xen.spec
25 %if %{?openvswitch_version:0}%{!?openvswitch_version:1}
26 %define openvswitch_version @VERSION@
29 %if %{?kernel_name:0}%{!?kernel_name:1}
30 %define kernel %(rpm -qa 'kernel*xen-devel' | head -1)
31 %define kernel_name %(rpm -q --queryformat "%%{Name}" %{kernel} | sed 's/-devel//' | sed 's/kernel-//')
32 %define kernel_version %(rpm -q --queryformat "%%{Version}-%%{Release}" %{kernel})
33 %define kernel_flavor xen
36 %define xen_version %{kernel_version}%{kernel_flavor}
38 # bump this when breaking compatibility with userspace
39 %define module_abi_version 0
41 # build-supplemental-pack.sh requires this naming for kernel module packages
42 %define module_package modules-%{kernel_flavor}-%{kernel_version}
47 Summary: Open vSwitch daemon/database/utilities
48 Group: System Environment/Daemons
49 URL: http://www.openvswitch.org/
51 Version: %{openvswitch_version}
55 Source: openvswitch-%{openvswitch_version}.tar.gz
56 Buildroot: /tmp/openvswitch-xen-rpm
57 Requires: openvswitch.ko.%{module_abi_version}
60 Open vSwitch provides standard network bridging functions augmented with
61 support for the OpenFlow protocol for remote per-flow control of
64 %package %{module_package}
65 Summary: Open vSwitch kernel module
66 Group: System Environment/Kernel
68 Provides: %{name}-modules-%{kernel_flavor} = %{kernel_version}, openvswitch.ko.%{module_abi_version}
69 Requires: kernel-%{kernel_name} = %{kernel_version}
71 %description %{module_package}
72 Open vSwitch Linux kernel module compiled against kernel version
76 %setup -q -n openvswitch-%{openvswitch_version}
79 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-linux=/lib/modules/%{xen_version}/build --enable-ssl CFLAGS='-g -O2 -msse -msse2'
83 rm -rf $RPM_BUILD_ROOT
84 make install DESTDIR=$RPM_BUILD_ROOT
85 install -d -m 755 $RPM_BUILD_ROOT/etc
86 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
87 install -m 755 xenserver/etc_init.d_openvswitch \
88 $RPM_BUILD_ROOT/etc/init.d/openvswitch
89 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
90 $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
91 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
92 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
93 install -m 755 xenserver/etc_logrotate.d_openvswitch \
94 $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
95 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
96 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
97 $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
98 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
99 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
100 $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
101 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
102 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
103 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
104 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
105 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
106 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
107 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
108 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
109 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
110 install -m 755 xenserver/etc_xensource_scripts_vif \
111 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
112 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
113 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
114 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
115 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
116 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
118 xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
119 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
121 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch
122 find datapath/linux -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch \;
123 install python/compat/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
124 install python/compat/argparse.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
126 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool
127 cp -rf $RPM_BUILD_ROOT/usr/share/openvswitch/bugtool-plugins/* $RPM_BUILD_ROOT/etc/xensource/bugtool
129 # Get rid of stuff we don't want to make RPM happy.
131 $RPM_BUILD_ROOT/usr/bin/ovs-benchmark \
132 $RPM_BUILD_ROOT/usr/bin/ovs-testcontroller \
133 $RPM_BUILD_ROOT/usr/bin/ovs-l3ping \
134 $RPM_BUILD_ROOT/usr/bin/ovs-pki \
135 $RPM_BUILD_ROOT/usr/bin/ovs-test \
136 $RPM_BUILD_ROOT/usr/share/man/man1/ovs-benchmark.1 \
137 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-testcontroller.8 \
138 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-l3ping.8 \
139 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8 \
140 $RPM_BUILD_ROOT/usr/share/man/man8/ovs-test.8
141 (cd "$RPM_BUILD_ROOT" && rm -f usr/lib/lib*)
143 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
147 if make check TESTSUITEFLAGS='%{_smp_mflags}' ||
148 make check TESTSUITEFLAGS='--recheck'; then :;
150 cat tests/testsuite.log
156 rm -rf $RPM_BUILD_ROOT
159 # A list of Citrix XenServer scripts that we might need to replace
160 # with our own versions.
162 /etc/xensource/scripts/vif
163 /opt/xensource/libexec/InterfaceReconfigure.py
164 /opt/xensource/libexec/InterfaceReconfigureBridge.py
165 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
166 /opt/xensource/libexec/interface-reconfigure"
168 # Calculate into $md5sums a comma-separated set of md5sums of the
169 # Citrix XenServer scripts that we might need to replace. We might be
170 # upgrading an older version of the package that moved the files out
171 # of the way, so we need to look for the files in those out-of-the-way
174 for script in $scripts; do
175 b=$(basename "$script")
176 if test -e /usr/lib/openvswitch/xs-saved/"$b"; then
177 f=/usr/lib/openvswitch/xs-saved/"$b"
178 elif test -e /usr/lib/openvswitch/xs-original/"$b"; then
179 f=/usr/lib/openvswitch/xs-original/"$b"
180 elif test -e "$script" && test ! -h "$script"; then
183 printf "\n$script: not found\n"
186 md5sums="$md5sums,$(md5sum $f | awk '{print $1}')"
190 # Now check the md5sums against the known sets of md5sums:
192 # - If they are known to be a version of XenServer scripts that we should
193 # replace, we replace them (by putting $scripts into $replace_files).
195 # - Otherwise, we guess that it's better not to replace them, because the
196 # improvements that our versions of the scripts provide are minimal, so
197 # it's better to avoid possibly breaking any changes made upstream by
200 cf09a68d9f8b434e79a4c83b01a3bb4b,395866df1b0b20c12c4dd2f7de0ecdb4,9d493545ae81463239d3162cbc798852,862d0939b441de9264a900628e950fe9,21f85db25599d7f026cd489385d58aa6)
202 replace_files=$scripts
203 printf "\nVerified host scripts from XenServer 6.0.0.\n"
206 c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,f3feff30aa3b3f8b514664a96a8dc0ab)
208 replace_files=$scripts
209 printf "\nVerified host scripts from XenServer 5.6-SP2.\n"
212 c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,24bae6906d182ba47668174f8e480cc6)
214 replace_files=$scripts
215 printf "\nVerified host scripts from XenServer 5.6-FP1.\n"
223 The host scripts on this machine are not those of any supported
224 version of XenServer. On XenServer earlier than 5.6-FP1, your Open
225 vSwitch installation will not work. On XenServer 5.6-FP1 or later,
226 Open vSwitch is not verified to work, which could lead to unexpected
233 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
234 cat >>/etc/sysctl.conf <<EOF
235 # This works around an issue in xhad, which binds to a particular
236 # Ethernet device, which in turn causes ICMP port unreachable messages
237 # if packets are received are on the wrong interface, which in turn
238 # can happen if we send out ARP replies on every interface (as Linux
239 # does by default) instead of just on the interface that has the IP
240 # address being ARPed for, which this sysctl setting in turn works
244 net.ipv4.conf.all.arp_filter = 1
248 if test ! -e /etc/openvswitch/conf.db; then
249 install -d -m 755 -o root -g root /etc/openvswitch
251 # Create ovs-vswitchd config database
252 ovsdb-tool -vconsole:off create /etc/openvswitch/conf.db \
253 /usr/share/openvswitch/vswitch.ovsschema
255 # Create initial table in config database
256 ovsdb-tool -vconsole:off transact /etc/openvswitch/conf.db \
257 '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
261 # Create default or update existing /etc/sysconfig/openvswitch.
262 SYSCONFIG=/etc/sysconfig/openvswitch
263 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
264 if [ ! -e $SYSCONFIG ]; then
265 cp $TEMPLATE $SYSCONFIG
267 for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
269 if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
271 sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
276 # Deliberately break %postun in broken OVS builds that revert original
277 # XenServer scripts during rpm -U by moving the directory where it thinks
279 if [ -d /usr/lib/openvswitch/xs-original ]; then
280 mkdir -p /usr/lib/openvswitch/xs-saved
281 mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
282 rmdir /usr/lib/openvswitch/xs-original
285 # Replace XenServer files by our versions.
286 mkdir -p /usr/lib/openvswitch/xs-saved \
287 || printf "Could not create script backup directory.\n"
288 for f in $replace_files; do
291 if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
292 mv "$f" /usr/lib/openvswitch/xs-saved/ \
293 || printf "Could not save original XenServer $s script\n"
294 ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
295 || printf "Could not link to Open vSwitch $s script\n"
299 # Clean up dangling symlinks to removed OVS replacement scripts no longer
300 # provided by OVS. Any time a replacement script is removed from OVS,
301 # it should be added here to ensure correct reversion from old versions of
302 # OVS that don't clean up dangling symlinks during the uninstall phase.
303 for orig in /usr/sbin/xen-bugtool $keep_files; do
304 saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
305 [ -e "$saved" ] && mv -f "$saved" "$orig"
308 # Ensure all required services are set to run
309 for s in openvswitch openvswitch-xapi-update; do
310 if chkconfig --list $s >/dev/null 2>&1; then
311 chkconfig --del $s || printf "Could not remove $s init script.\n"
313 chkconfig --add $s || printf "Could not add $s init script.\n"
314 chkconfig $s on || printf "Could not enable $s init script.\n"
317 if [ "$1" = "1" ]; then # $1 = 1 for install
318 # Configure system to use Open vSwitch
319 /opt/xensource/bin/xe-switch-network-backend vswitch
320 else # $1 = 2 for upgrade
322 mode=$(cat /etc/xensource/network.conf)
323 if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
324 printf "\nThe server is not configured to run Open vSwitch. To run in\n"
325 printf "vswitch mode, you must run the following command:\n\n"
326 printf "\txe-switch-network-backend vswitch"
331 %posttrans %{module_package}
332 # Ensure that modprobe will find our modules.
334 # This has to be in %posttrans instead of %post because older versions
335 # installed modules into a different directory and "rpm -U" runs the
336 # new version's %post before removing the old version's files, so if
337 # we use %post then depmod may find the old versions that are about to
339 depmod %{xen_version}
341 mode=$(cat /etc/xensource/network.conf)
342 if [ "$mode" = "vswitch" ] || [ "$mode" = "openvswitch" ]; then
343 printf "\nTo use the newly installed Open vSwitch kernel module, you\n"
344 printf "will either have to reboot the hypervisor or follow any\n"
345 printf "workarounds provided by your administration guide. Failure to do\n"
346 printf "so may result in incorrect operation."
351 if [ "$1" = "0" ]; then # $1 = 0 for uninstall
352 # Configure system to use bridge
353 /opt/xensource/bin/xe-switch-network-backend bridge
355 # The "openvswitch" service should have been removed from
356 # "xe-switch-network-backend bridge".
357 for s in openvswitch openvswitch-xapi-update; do
358 if chkconfig --list $s >/dev/null 2>&1; then
359 chkconfig --del $s || printf "Could not remove $s init script."
365 # Restore original XenServer scripts if the OVS equivalent no longer exists.
366 # This works both in the upgrade and erase cases.
367 # This lists every file that every version of OVS has ever replaced. Never
368 # remove old files that OVS no longer replaces, or upgrades from old versions
369 # will fail to restore the XS originals, leaving the system in a broken state.
370 # Also be sure to add removed script paths to the %post scriptlet above to
371 # prevent the same problem when upgrading from old versions of OVS that lack
372 # this restore-on-upgrade logic.
374 /etc/xensource/scripts/vif \
375 /usr/sbin/xen-bugtool \
376 /opt/xensource/libexec/interface-reconfigure \
377 /opt/xensource/libexec/InterfaceReconfigure.py \
378 /opt/xensource/libexec/InterfaceReconfigureBridge.py \
379 /opt/xensource/libexec/InterfaceReconfigureVswitch.py
381 # Only revert dangling symlinks.
382 if [ -h "$f" ] && [ ! -e "$f" ]; then
384 if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
385 printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
386 printf "Could not restore original XenServer script.\n" >&2
389 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
390 || printf "Could not restore original XenServer $s script.\n" >&2
395 if [ "$1" = "0" ]; then # $1 = 0 for uninstall
396 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
397 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
399 rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
400 /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
401 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
402 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
403 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
404 /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
406 # Remove all configuration files
407 rm -f /etc/openvswitch/conf.db
408 rm -f /etc/sysconfig/openvswitch
409 rm -f /etc/openvswitch/vswitchd.cacert
411 # Remove saved XenServer scripts directory, but only if it's empty
412 rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
418 %defattr(-,root,root)
419 /etc/init.d/openvswitch
420 /etc/init.d/openvswitch-xapi-update
421 /etc/xapi.d/plugins/openvswitch-cfg-update
422 /etc/xensource/bugtool/*
423 /etc/logrotate.d/openvswitch
424 /etc/profile.d/openvswitch.sh
425 /usr/share/openvswitch/python/
426 /usr/share/openvswitch/bugtool-plugins/*
427 /usr/share/openvswitch/scripts/ovs-check-dead-ifs
428 /usr/share/openvswitch/scripts/ovs-xapi-sync
429 /usr/share/openvswitch/scripts/interface-reconfigure
430 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
431 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
432 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
433 /usr/share/openvswitch/scripts/vif
434 /usr/share/openvswitch/scripts/sysconfig.template
435 /usr/share/openvswitch/scripts/ovs-bugtool-*
436 /usr/share/openvswitch/scripts/ovs-save
437 /usr/share/openvswitch/scripts/ovs-ctl
438 /usr/share/openvswitch/scripts/ovs-lib
439 /usr/share/openvswitch/scripts/ovs-vtep
440 /usr/share/openvswitch/vswitch.ovsschema
441 /usr/share/openvswitch/vtep.ovsschema
442 /usr/sbin/ovs-bugtool
443 /usr/sbin/ovs-vlan-bug-workaround
444 /usr/sbin/ovs-vswitchd
445 /usr/sbin/ovsdb-server
448 /usr/bin/ovs-dpctl-top
451 /usr/bin/ovs-parse-backtrace
453 /usr/bin/ovs-tcpundump
454 /usr/bin/ovs-vlan-test
456 /usr/bin/ovsdb-client
459 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
460 /usr/share/man/man1/ovsdb-client.1.gz
461 /usr/share/man/man1/ovsdb-server.1.gz
462 /usr/share/man/man1/ovsdb-tool.1.gz
463 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
464 /usr/share/man/man5/vtep.5.gz
465 /usr/share/man/man8/ovs-appctl.8.gz
466 /usr/share/man/man8/ovs-bugtool.8.gz
467 /usr/share/man/man8/ovs-ctl.8.gz
468 /usr/share/man/man8/ovs-dpctl.8.gz
469 /usr/share/man/man8/ovs-dpctl-top.8.gz
470 /usr/share/man/man8/ovs-ofctl.8.gz
471 /usr/share/man/man8/ovs-parse-backtrace.8.gz
472 /usr/share/man/man1/ovs-pcap.1.gz
473 /usr/share/man/man1/ovs-tcpundump.1.gz
474 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
475 /usr/share/man/man8/ovs-vlan-test.8.gz
476 /usr/share/man/man8/ovs-vsctl.8.gz
477 /usr/share/man/man8/ovs-vswitchd.8.gz
478 /usr/share/man/man8/vtep-ctl.8.gz
481 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
482 %exclude /usr/share/openvswitch/scripts/*.py[co]
483 %exclude /usr/share/openvswitch/python/*.py[co]
484 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
485 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
487 %files %{module_package}
488 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch.ko