ovs-thread: Add support for convenient once-only initializers.
[sliver-openvswitch.git] / xenserver / openvswitch-xen.spec.in
1 # Spec file for Open vSwitch.
2
3 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
4 #
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.
9
10 # When building, the rpmbuild command line should define
11 # openvswitch_version, kernel_name, kernel_version, and kernel_flavor
12 # using -D arguments.
13 # for example:
14 #
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
20
21 %if %{?openvswitch_version:0}%{!?openvswitch_version:1}
22 %define openvswitch_version @VERSION@
23 %endif
24
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
30 %endif
31
32 %define xen_version %{kernel_version}%{kernel_flavor}
33
34 # bump this when breaking compatibility with userspace
35 %define module_abi_version 0
36
37 # build-supplemental-pack.sh requires this naming for kernel module packages
38 %define module_package modules-%{kernel_flavor}-%{kernel_version}
39
40 Name: openvswitch
41 Summary: Open vSwitch daemon/database/utilities
42 Group: System Environment/Daemons
43 URL: http://www.openvswitch.org/
44 Vendor: Nicira, Inc.
45 Version: %{openvswitch_version}
46
47 License: ASL 2.0
48 Release: 1
49 Source: openvswitch-%{openvswitch_version}.tar.gz
50 Buildroot: /tmp/openvswitch-xen-rpm
51 Requires: openvswitch.ko.%{module_abi_version}
52
53 %description
54 Open vSwitch provides standard network bridging functions augmented with
55 support for the OpenFlow protocol for remote per-flow control of
56 traffic.
57
58 %package %{module_package}
59 Summary: Open vSwitch kernel module
60 Group: System Environment/Kernel
61 License: GPLv2
62 Provides: %{name}-modules-%{kernel_flavor} = %{kernel_version}, openvswitch.ko.%{module_abi_version}
63 Requires: kernel-%{kernel_name} = %{kernel_version}
64
65 %description %{module_package}
66 Open vSwitch Linux kernel module compiled against kernel version
67 %{xen_version}.
68
69 %prep
70 %setup -q -n openvswitch-%{openvswitch_version}
71
72 %build
73 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-linux=/lib/modules/%{xen_version}/build --enable-ssl
74 make %{_smp_mflags}
75
76 %install
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
111 install -m 644 \
112         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
113                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
114
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
119
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
122
123 # Get rid of stuff we don't want to make RPM happy.
124 rm \
125     $RPM_BUILD_ROOT/usr/bin/ovs-benchmark \
126     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
127     $RPM_BUILD_ROOT/usr/bin/ovs-l3ping \
128     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
129     $RPM_BUILD_ROOT/usr/bin/ovs-test \
130     $RPM_BUILD_ROOT/usr/share/man/man1/ovs-benchmark.1 \
131     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
132     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-l3ping.8 \
133     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8 \
134     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-test.8
135
136 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
137
138 %clean
139 rm -rf $RPM_BUILD_ROOT
140
141 %post
142 # A list of Citrix XenServer scripts that we might need to replace
143 # with our own versions.
144 scripts="
145     /etc/xensource/scripts/vif
146     /opt/xensource/libexec/InterfaceReconfigure.py
147     /opt/xensource/libexec/InterfaceReconfigureBridge.py
148     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
149     /opt/xensource/libexec/interface-reconfigure"
150
151 # Calculate into $md5sums a comma-separated set of md5sums of the
152 # Citrix XenServer scripts that we might need to replace.  We might be
153 # upgrading an older version of the package that moved the files out
154 # of the way, so we need to look for the files in those out-of-the-way
155 # locations first.
156 md5sums=
157 for script in $scripts; do
158     b=$(basename "$script")
159     if test -e /usr/lib/openvswitch/xs-saved/"$b"; then
160         f=/usr/lib/openvswitch/xs-saved/"$b"
161     elif test -e /usr/lib/openvswitch/xs-original/"$b"; then
162         f=/usr/lib/openvswitch/xs-original/"$b"
163     elif test -e "$script" && test ! -h "$script"; then
164         f=$script
165     else
166         printf "\n$script: not found\n"
167         f=/dev/null
168     fi
169     md5sums="$md5sums,$(md5sum $f | awk '{print $1}')"
170 done
171 md5sums=${md5sums#,}
172
173 # Now check the md5sums against the known sets of md5sums:
174 #
175 #   - If they are known to be a version of XenServer scripts that we should
176 #     replace, we replace them (by putting $scripts into $replace_files).
177 #
178 #   - Otherwise, we guess that it's better not to replace them, because the
179 #     improvements that our versions of the scripts provide are minimal, so
180 #     it's better to avoid possibly breaking any changes made upstream by
181 #     Citrix.
182 case $md5sums in
183     cf09a68d9f8b434e79a4c83b01a3bb4b,395866df1b0b20c12c4dd2f7de0ecdb4,9d493545ae81463239d3162cbc798852,862d0939b441de9264a900628e950fe9,21f85db25599d7f026cd489385d58aa6)
184         keep_files=
185         replace_files=$scripts
186         printf "\nVerified host scripts from XenServer 6.0.0.\n"
187         ;;
188
189     c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,f3feff30aa3b3f8b514664a96a8dc0ab)
190         keep_files=
191         replace_files=$scripts
192         printf "\nVerified host scripts from XenServer 5.6-SP2.\n"
193         ;;
194         
195     c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,24bae6906d182ba47668174f8e480cc6)
196         keep_files=
197         replace_files=$scripts
198         printf "\nVerified host scripts from XenServer 5.6-FP1.\n"
199         ;;
200
201     *)
202         keep_files=$scripts
203         replace_files=
204         cat <<EOF
205
206 The host scripts on this machine are not those of any supported
207 version of XenServer.  On XenServer earlier than 5.6-FP1, your Open
208 vSwitch installation will not work.  On XenServer 5.6-FP1 or later,
209 Open vSwitch is not verified to work, which could lead to unexpected
210 behavior.
211
212 EOF
213         ;;
214 esac
215
216 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
217     cat >>/etc/sysctl.conf <<EOF
218 # This works around an issue in xhad, which binds to a particular
219 # Ethernet device, which in turn causes ICMP port unreachable messages
220 # if packets are received are on the wrong interface, which in turn
221 # can happen if we send out ARP replies on every interface (as Linux
222 # does by default) instead of just on the interface that has the IP
223 # address being ARPed for, which this sysctl setting in turn works
224 # around.
225 #
226 # Bug #1378.
227 net.ipv4.conf.all.arp_filter = 1
228 EOF
229 fi
230
231 if test ! -e /etc/openvswitch/conf.db; then
232     install -d -m 755 -o root -g root /etc/openvswitch
233
234     # Create ovs-vswitchd config database
235     ovsdb-tool -vconsole:off create /etc/openvswitch/conf.db \
236             /usr/share/openvswitch/vswitch.ovsschema
237
238     # Create initial table in config database
239     ovsdb-tool -vconsole:off transact /etc/openvswitch/conf.db \
240             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
241             > /dev/null
242 fi
243
244 # Create default or update existing /etc/sysconfig/openvswitch.
245 SYSCONFIG=/etc/sysconfig/openvswitch
246 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
247 if [ ! -e $SYSCONFIG ]; then
248     cp $TEMPLATE $SYSCONFIG
249 else
250     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
251     do
252         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
253             echo >> $SYSCONFIG
254             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
255         fi
256     done
257 fi
258
259 # Deliberately break %postun in broken OVS builds that revert original
260 # XenServer scripts during rpm -U by moving the directory where it thinks
261 # they are saved.
262 if [ -d /usr/lib/openvswitch/xs-original ]; then
263     mkdir -p /usr/lib/openvswitch/xs-saved
264     mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
265         rmdir /usr/lib/openvswitch/xs-original
266 fi
267
268 # Replace XenServer files by our versions.
269 mkdir -p /usr/lib/openvswitch/xs-saved \
270     || printf "Could not create script backup directory.\n"
271 for f in $replace_files; do
272     s=$(basename "$f")
273     t=$(readlink "$f")
274     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
275         mv "$f" /usr/lib/openvswitch/xs-saved/ \
276             || printf "Could not save original XenServer $s script\n"
277         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
278             || printf "Could not link to Open vSwitch $s script\n"
279     fi
280 done
281
282 # Clean up dangling symlinks to removed OVS replacement scripts no longer
283 # provided by OVS. Any time a replacement script is removed from OVS,
284 # it should be added here to ensure correct reversion from old versions of
285 # OVS that don't clean up dangling symlinks during the uninstall phase.
286 for orig in /usr/sbin/xen-bugtool $keep_files; do
287     saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
288     [ -e "$saved" ] && mv -f "$saved" "$orig"
289 done
290
291 # Ensure all required services are set to run
292 for s in openvswitch openvswitch-xapi-update; do
293     if chkconfig --list $s >/dev/null 2>&1; then
294         chkconfig --del $s || printf "Could not remove $s init script.\n"
295     fi
296     chkconfig --add $s || printf "Could not add $s init script.\n"
297     chkconfig $s on || printf "Could not enable $s init script.\n"
298 done
299
300 if [ "$1" = "1" ]; then    # $1 = 1 for install
301     # Configure system to use Open vSwitch
302     /opt/xensource/bin/xe-switch-network-backend vswitch
303 else    # $1 = 2 for upgrade
304
305     mode=$(cat /etc/xensource/network.conf)
306     if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
307         printf "\nThe server is not configured to run Open vSwitch.  To run in\n"
308         printf "vswitch mode, you must run the following command:\n\n"
309         printf "\txe-switch-network-backend vswitch"
310         printf "\n\n"
311     fi
312 fi
313
314 %posttrans %{module_package}
315 # Ensure that modprobe will find our modules.
316 #
317 # This has to be in %posttrans instead of %post because older versions
318 # installed modules into a different directory and "rpm -U" runs the
319 # new version's %post before removing the old version's files, so if
320 # we use %post then depmod may find the old versions that are about to
321 # be removed.
322 depmod %{xen_version}
323
324 mode=$(cat /etc/xensource/network.conf)
325 if [ "$mode" = "vswitch" ] || [ "$mode" = "openvswitch" ]; then
326     printf "\nTo use the newly installed Open vSwitch kernel module, you\n"
327     printf "will either have to reboot the hypervisor or follow any\n"
328     printf "workarounds provided by your administration guide. Failure to do\n"
329     printf "so may result in incorrect operation."
330     printf "\n\n"
331 fi
332
333 %preun
334 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
335     # Configure system to use bridge
336     /opt/xensource/bin/xe-switch-network-backend bridge
337
338     # The "openvswitch" service should have been removed from
339     # "xe-switch-network-backend bridge".
340     for s in openvswitch openvswitch-xapi-update; do
341         if chkconfig --list $s >/dev/null 2>&1; then
342             chkconfig --del $s || printf "Could not remove $s init script."
343         fi
344     done
345 fi
346
347 %postun
348 # Restore original XenServer scripts if the OVS equivalent no longer exists.
349 # This works both in the upgrade and erase cases.
350 # This lists every file that every version of OVS has ever replaced. Never
351 # remove old files that OVS no longer replaces, or upgrades from old versions
352 # will fail to restore the XS originals, leaving the system in a broken state.
353 # Also be sure to add removed script paths to the %post scriptlet above to
354 # prevent the same problem when upgrading from old versions of OVS that lack
355 # this restore-on-upgrade logic.
356 for f in \
357     /etc/xensource/scripts/vif \
358     /usr/sbin/xen-bugtool \
359     /opt/xensource/libexec/interface-reconfigure \
360     /opt/xensource/libexec/InterfaceReconfigure.py \
361     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
362     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
363 do
364     # Only revert dangling symlinks.
365     if [ -h "$f" ] && [ ! -e "$f" ]; then
366         s=$(basename "$f")
367         if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
368             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
369             printf "Could not restore original XenServer script.\n" >&2
370         else
371             (rm -f "$f" \
372                 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
373                 || printf "Could not restore original XenServer $s script.\n" >&2
374         fi
375     fi
376 done
377
378 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
379     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
380         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
381
382     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
383         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
384         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
385         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
386         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
387         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
388
389     # Remove all configuration files
390     rm -f /etc/openvswitch/conf.db
391     rm -f /etc/sysconfig/openvswitch
392     rm -f /etc/openvswitch/vswitchd.cacert
393
394     # Remove saved XenServer scripts directory, but only if it's empty
395     rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
396 fi
397
398 exit 0
399
400 %files
401 %defattr(-,root,root)
402 /etc/init.d/openvswitch
403 /etc/init.d/openvswitch-xapi-update
404 /etc/xapi.d/plugins/openvswitch-cfg-update
405 /etc/xensource/bugtool/*
406 /etc/logrotate.d/openvswitch
407 /etc/profile.d/openvswitch.sh
408 /usr/share/openvswitch/python/
409 /usr/share/openvswitch/bugtool-plugins/*
410 /usr/share/openvswitch/scripts/ovs-check-dead-ifs
411 /usr/share/openvswitch/scripts/ovs-xapi-sync
412 /usr/share/openvswitch/scripts/interface-reconfigure
413 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
414 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
415 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
416 /usr/share/openvswitch/scripts/vif
417 /usr/share/openvswitch/scripts/sysconfig.template
418 /usr/share/openvswitch/scripts/ovs-bugtool-*
419 /usr/share/openvswitch/scripts/ovs-save
420 /usr/share/openvswitch/scripts/ovs-ctl
421 /usr/share/openvswitch/scripts/ovs-lib
422 /usr/share/openvswitch/vswitch.ovsschema
423 /usr/sbin/ovs-bugtool
424 /usr/sbin/ovs-vlan-bug-workaround
425 /usr/sbin/ovs-vswitchd
426 /usr/sbin/ovsdb-server
427 /usr/bin/ovs-appctl
428 /usr/bin/ovs-dpctl
429 /usr/bin/ovs-ofctl
430 /usr/bin/ovs-parse-backtrace
431 /usr/bin/ovs-pcap
432 /usr/bin/ovs-tcpundump
433 /usr/bin/ovs-vlan-test
434 /usr/bin/ovs-vsctl
435 /usr/bin/ovsdb-client
436 /usr/bin/ovsdb-tool
437 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
438 /usr/share/man/man1/ovsdb-client.1.gz
439 /usr/share/man/man1/ovsdb-server.1.gz
440 /usr/share/man/man1/ovsdb-tool.1.gz
441 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
442 /usr/share/man/man8/ovs-appctl.8.gz
443 /usr/share/man/man8/ovs-bugtool.8.gz
444 /usr/share/man/man8/ovs-ctl.8.gz
445 /usr/share/man/man8/ovs-dpctl.8.gz
446 /usr/share/man/man8/ovs-ofctl.8.gz
447 /usr/share/man/man8/ovs-parse-backtrace.8.gz
448 /usr/share/man/man1/ovs-pcap.1.gz
449 /usr/share/man/man1/ovs-tcpundump.1.gz
450 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
451 /usr/share/man/man8/ovs-vlan-test.8.gz
452 /usr/share/man/man8/ovs-vsctl.8.gz
453 /usr/share/man/man8/ovs-vswitchd.8.gz
454 /var/lib/openvswitch
455 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
456 %exclude /usr/share/openvswitch/scripts/*.py[co]
457 %exclude /usr/share/openvswitch/python/*.py[co]
458 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
459 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
460
461 %files %{module_package}
462 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch.ko