0eafc0147d65ac2554c7eb0f6630f1dac5825208
[sliver-openvswitch.git] / xenserver / openvswitch-xen.spec
1 # Spec file for Open vSwitch.
2
3 # Copyright (C) 2009, 2010, 2011 Nicira Networks, 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, kernel_flavor,
12 # and build_number 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 #      -D "build_number --with-build-number=123"
20 #      -bb /usr/src/redhat/SPECS/openvswitch-xen.spec
21
22 %define xen_version %{kernel_version}%{kernel_flavor}
23
24 # bump this when breaking compatibility with userspace
25 %define module_abi_version 0
26
27 # build-supplemental-pack.sh requires this naming for kernel module packages
28 %define module_package modules-%{kernel_flavor}-%{kernel_version}
29
30 Name: openvswitch
31 Summary: Open vSwitch daemon/database/utilities
32 Group: System Environment/Daemons
33 URL: http://www.openvswitch.org/
34 Vendor: Nicira Networks, Inc.
35 Version: %{openvswitch_version}
36
37 License: ASL 2.0
38 Release: 1
39 Source: openvswitch-%{openvswitch_version}.tar.gz
40 Buildroot: /tmp/openvswitch-xen-rpm
41 Requires: openvswitch_mod.ko.%{module_abi_version}
42
43 %description
44 Open vSwitch provides standard network bridging functions augmented with
45 support for the OpenFlow protocol for remote per-flow control of
46 traffic.
47
48 %package %{module_package}
49 Summary: Open vSwitch kernel module
50 Group: System Environment/Kernel
51 License: GPLv2
52 Provides: %{name}-modules-%{kernel_flavor} = %{kernel_version}, openvswitch_mod.ko.%{module_abi_version}
53 Requires: kernel-%{kernel_name} = %{kernel_version}
54
55 %description %{module_package}
56 Open vSwitch Linux kernel module compiled against kernel version
57 %{xen_version}.
58
59 %prep
60 %setup -q -n openvswitch-%{openvswitch_version}
61
62 %build
63 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
64 make %{_smp_mflags}
65
66 %install
67 rm -rf $RPM_BUILD_ROOT
68 make install DESTDIR=$RPM_BUILD_ROOT
69 install -d -m 755 $RPM_BUILD_ROOT/etc
70 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
71 install -m 755 xenserver/etc_init.d_openvswitch \
72          $RPM_BUILD_ROOT/etc/init.d/openvswitch
73 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
74          $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
75 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
76 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
77 install -m 755 xenserver/etc_logrotate.d_openvswitch \
78          $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
79 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
80 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
81          $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
82 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
83 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
84          $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
85 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool/network-status
86 install -m 644 xenserver/etc_xensource_bugtool_network-status_openvswitch.xml \
87          $RPM_BUILD_ROOT/etc/xensource/bugtool/network-status/openvswitch.xml
88 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool/kernel-info
89 install -m 644 xenserver/etc_xensource_bugtool_kernel-info_openvswitch.xml \
90          $RPM_BUILD_ROOT/etc/xensource/bugtool/kernel-info/openvswitch.xml
91 install -m 644 xenserver/etc_xensource_bugtool_system-configuration.xml \
92          $RPM_BUILD_ROOT/etc/xensource/bugtool/system-configuration.xml
93 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool/system-configuration
94 install -m 644 xenserver/etc_xensource_bugtool_system-configuration_openvswitch.xml \
95          $RPM_BUILD_ROOT/etc/xensource/bugtool/system-configuration/openvswitch.xml
96 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
97 install -m 644 vswitchd/vswitch.ovsschema \
98          $RPM_BUILD_ROOT/usr/share/openvswitch/vswitch.ovsschema
99 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
100              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
101 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
102              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
103 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
104              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
105 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
106              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
107 install -m 755 xenserver/etc_xensource_scripts_vif \
108              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
109 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
110                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
111 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
112          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
113 install -m 755 xenserver/usr_share_openvswitch_scripts_xen-bugtool-tc-class-show \
114          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/xen-bugtool-tc-class-show
115 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
116 install -m 644 \
117         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
118                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
119
120 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch
121 find datapath/linux-2.6 -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch \;
122 install xenserver/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
123
124 # Get rid of stuff we don't want to make RPM happy.
125 rm \
126     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
127     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
128     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
129     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
130
131 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
132
133 %clean
134 rm -rf $RPM_BUILD_ROOT
135
136 %post
137 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
138     cat >>/etc/sysctl.conf <<EOF
139 # This works around an issue in xhad, which binds to a particular
140 # Ethernet device, which in turn causes ICMP port unreachable messages
141 # if packets are received are on the wrong interface, which in turn
142 # can happen if we send out ARP replies on every interface (as Linux
143 # does by default) instead of just on the interface that has the IP
144 # address being ARPed for, which this sysctl setting in turn works
145 # around.
146 #
147 # Bug #1378.
148 net.ipv4.conf.all.arp_filter = 1
149 EOF
150 fi
151
152 if test ! -e /etc/openvswitch/conf.db; then
153     install -d -m 755 -o root -g root /etc/openvswitch
154
155     # Create ovs-vswitchd config database
156     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
157             /usr/share/openvswitch/vswitch.ovsschema
158
159     # Create initial table in config database
160     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
161             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
162             > /dev/null
163 fi
164
165 # Create default or update existing /etc/sysconfig/openvswitch.
166 SYSCONFIG=/etc/sysconfig/openvswitch
167 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
168 if [ ! -e $SYSCONFIG ]; then
169     cp $TEMPLATE $SYSCONFIG
170 else
171     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
172     do
173         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
174             echo >> $SYSCONFIG
175             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
176         fi
177     done
178 fi
179
180 # Deliberately break %postun in broken OVS builds that revert original
181 # XenServer scripts during rpm -U by moving the directory where it thinks
182 # they are saved.
183 if [ -d /usr/lib/openvswitch/xs-original ]; then
184     mkdir -p /usr/lib/openvswitch/xs-saved
185     mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
186         rmdir /usr/lib/openvswitch/xs-original
187 fi
188
189 # Replace XenServer files by our versions.
190 mkdir -p /usr/lib/openvswitch/xs-saved \
191     || printf "Could not create script backup directory.\n"
192 for f in \
193     /opt/xensource/libexec/interface-reconfigure \
194     /opt/xensource/libexec/InterfaceReconfigure.py \
195     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
196     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
197     /etc/xensource/scripts/vif
198 do
199     s=$(basename "$f")
200     t=$(readlink "$f")
201     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
202         mv "$f" /usr/lib/openvswitch/xs-saved/ \
203             || printf "Could not save original XenServer $s script\n"
204         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
205             || printf "Could not link to Open vSwitch $s script\n"
206     fi
207 done
208
209 # Clean up dangling symlinks to removed OVS replacement scripts no longer
210 # provided by OVS. Any time a replacement script is removed from OVS,
211 # it should be added here to ensure correct reversion from old versions of
212 # OVS that don't clean up dangling symlinks during the uninstall phase.
213 for orig in \
214     /usr/sbin/brctl \
215     /usr/sbin/xen-bugtool
216 do
217     saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
218     [ -e "$saved" ] && mv -f "$saved" "$orig"
219 done
220
221 # Ensure all required services are set to run
222 for s in openvswitch openvswitch-xapi-update; do
223     if chkconfig --list $s >/dev/null 2>&1; then
224         chkconfig --del $s || printf "Could not remove $s init script."
225     fi
226     chkconfig --add $s || printf "Could not add $s init script."
227     chkconfig $s on || printf "Could not enable $s init script."
228 done
229
230 if [ "$1" = "1" ]; then    # $1 = 1 for install
231     # Configure system to use Open vSwitch
232     /opt/xensource/bin/xe-switch-network-backend vswitch
233 else    # $1 = 2 for upgrade
234
235     mode=$(cat /etc/xensource/network.conf)
236     if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
237         printf "\nThe server is not configured to run Open vSwitch.  To run in\n"
238         printf "vswitch mode, you must run the following command:\n\n"
239         printf "\txe-switch-network-backend vswitch"
240     else
241         printf "\nTo use the new Open vSwitch install, you should reboot the\n"
242         printf "server now.  Failure to do so may result in incorrect operation."
243     fi
244
245     printf "\n\n"
246 fi
247
248 %posttrans %{module_package}
249 # Ensure that modprobe will find our modules.
250 #
251 # This has to be in %posttrans instead of %post because older versions
252 # installed modules into a different directory and "rpm -U" runs the
253 # new version's %post before removing the old version's files, so if
254 # we use %post then depmod may find the old versions that are about to
255 # be removed.
256 depmod %{xen_version}
257
258 %preun
259 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
260     # Configure system to use bridge
261     /opt/xensource/bin/xe-switch-network-backend bridge
262
263     # The "openvswitch" service should have been removed from
264     # "xe-switch-network-backend bridge".
265     for s in openvswitch openvswitch-xapi-update; do
266         if chkconfig --list $s >/dev/null 2>&1; then
267             chkconfig --del $s || printf "Could not remove $s init script."
268         fi
269     done
270 fi
271
272 %postun
273 # Restore original XenServer scripts if the OVS equivalent no longer exists.
274 # This works both in the upgrade and erase cases.
275 # This lists every file that every version of OVS has ever replaced. Never
276 # remove old files that OVS no longer replaces, or upgrades from old versions
277 # will fail to restore the XS originals, leaving the system in a broken state.
278 # Also be sure to add removed script paths to the %post scriptlet above to
279 # prevent the same problem when upgrading from old versions of OVS that lack
280 # this restore-on-upgrade logic.
281 for f in \
282     /etc/xensource/scripts/vif \
283     /usr/sbin/brctl \
284     /usr/sbin/xen-bugtool \
285     /opt/xensource/libexec/interface-reconfigure \
286     /opt/xensource/libexec/InterfaceReconfigure.py \
287     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
288     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
289 do
290     # Only revert dangling symlinks.
291     if [ -h "$f" ] && [ ! -e "$f" ]; then
292         s=$(basename "$f")
293         if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
294             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
295             printf "Could not restore original XenServer script.\n" >&2
296         else
297             (rm -f "$f" \
298                 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
299                 || printf "Could not restore original XenServer $s script.\n" >&2
300         fi
301     fi
302 done
303
304 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
305     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
306         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
307
308     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
309         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
310         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
311         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
312         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
313         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
314
315     # Remove all configuration files
316     rm -f /etc/openvswitch/conf.db
317     rm -f /etc/sysconfig/openvswitch
318     rm -f /etc/openvswitch/vswitchd.cacert
319
320     # Remove saved XenServer scripts directory, but only if it's empty
321     rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
322 fi
323
324 exit 0
325
326 %files
327 %defattr(-,root,root)
328 /etc/init.d/openvswitch
329 /etc/init.d/openvswitch-xapi-update
330 /etc/xapi.d/plugins/openvswitch-cfg-update
331 /etc/xensource/bugtool/network-status/openvswitch.xml
332 /etc/xensource/bugtool/kernel-info/openvswitch.xml
333 /etc/xensource/bugtool/system-configuration.xml
334 /etc/xensource/bugtool/system-configuration/openvswitch.xml
335 /etc/logrotate.d/openvswitch
336 /etc/profile.d/openvswitch.sh
337 /usr/share/openvswitch/python/ovs/__init__.py
338 /usr/share/openvswitch/python/ovs/daemon.py
339 /usr/share/openvswitch/python/ovs/db/__init__.py
340 /usr/share/openvswitch/python/ovs/db/data.py
341 /usr/share/openvswitch/python/ovs/db/error.py
342 /usr/share/openvswitch/python/ovs/db/idl.py
343 /usr/share/openvswitch/python/ovs/db/parser.py
344 /usr/share/openvswitch/python/ovs/db/schema.py
345 /usr/share/openvswitch/python/ovs/db/types.py
346 /usr/share/openvswitch/python/ovs/dirs.py
347 /usr/share/openvswitch/python/ovs/fatal_signal.py
348 /usr/share/openvswitch/python/ovs/json.py
349 /usr/share/openvswitch/python/ovs/jsonrpc.py
350 /usr/share/openvswitch/python/ovs/ovsuuid.py
351 /usr/share/openvswitch/python/ovs/poller.py
352 /usr/share/openvswitch/python/ovs/process.py
353 /usr/share/openvswitch/python/ovs/reconnect.py
354 /usr/share/openvswitch/python/ovs/socket_util.py
355 /usr/share/openvswitch/python/ovs/stream.py
356 /usr/share/openvswitch/python/ovs/timeval.py
357 /usr/share/openvswitch/python/ovs/util.py
358 /usr/share/openvswitch/python/uuid.py
359 /usr/share/openvswitch/scripts/ovs-xapi-sync
360 /usr/share/openvswitch/scripts/interface-reconfigure
361 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
362 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
363 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
364 /usr/share/openvswitch/scripts/vif
365 /usr/share/openvswitch/scripts/sysconfig.template
366 /usr/share/openvswitch/scripts/xen-bugtool-tc-class-show
367 /usr/share/openvswitch/scripts/ovs-save
368 /usr/share/openvswitch/scripts/ovs-ctl
369 /usr/share/openvswitch/scripts/ovs-lib.sh
370 /usr/share/openvswitch/vswitch.ovsschema
371 /usr/sbin/ovs-vlan-bug-workaround
372 /usr/sbin/ovs-vswitchd
373 /usr/sbin/ovsdb-server
374 /usr/bin/ovs-appctl
375 /usr/bin/ovs-dpctl
376 /usr/bin/ovs-ofctl
377 /usr/bin/ovs-pcap
378 /usr/bin/ovs-tcpundump
379 /usr/bin/ovs-vlan-test
380 /usr/bin/ovs-vsctl
381 /usr/bin/ovsdb-client
382 /usr/bin/ovsdb-tool
383 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
384 /usr/share/man/man1/ovsdb-client.1.gz
385 /usr/share/man/man1/ovsdb-server.1.gz
386 /usr/share/man/man1/ovsdb-tool.1.gz
387 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
388 /usr/share/man/man8/ovs-appctl.8.gz
389 /usr/share/man/man8/ovs-ctl.8.gz
390 /usr/share/man/man8/ovs-dpctl.8.gz
391 /usr/share/man/man8/ovs-ofctl.8.gz
392 /usr/share/man/man8/ovs-parse-leaks.8.gz
393 /usr/share/man/man1/ovs-pcap.1.gz
394 /usr/share/man/man1/ovs-tcpundump.1.gz
395 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
396 /usr/share/man/man8/ovs-vlan-test.8.gz
397 /usr/share/man/man8/ovs-vsctl.8.gz
398 /usr/share/man/man8/ovs-vswitchd.8.gz
399 /var/lib/openvswitch
400 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
401 %exclude /usr/sbin/ovs-brcompatd
402 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
403 %exclude /usr/share/openvswitch/scripts/*.py[co]
404 %exclude /usr/share/openvswitch/python/*.py[co]
405 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
406 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
407
408 %files %{module_package}
409 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch_mod.ko
410 %exclude /lib/modules/%{xen_version}/extra/openvswitch/brcompat_mod.ko