b959b4aa9d007d65b5d488d833ff0595011375cf
[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-linux=/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/usr/share/openvswitch/scripts
86 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
87              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
88 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
89              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
90 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
91              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
92 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
93              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
94 install -m 755 xenserver/etc_xensource_scripts_vif \
95              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
96 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
97                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
98 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
99          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
100 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
101 install -m 644 \
102         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
103                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
104
105 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch
106 find datapath/linux -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch \;
107 install xenserver/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
108
109 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool
110 mv $RPM_BUILD_ROOT/etc/openvswitch/bugtool-plugins $RPM_BUILD_ROOT/etc/xensource/bugtool
111
112 # Get rid of stuff we don't want to make RPM happy.
113 rm \
114     $RPM_BUILD_ROOT/usr/sbin/ovs-bugtool \
115     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
116     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
117     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-bugtool.8 \
118     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
119     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
120
121 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
122
123 %clean
124 rm -rf $RPM_BUILD_ROOT
125
126 %post
127 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
128     cat >>/etc/sysctl.conf <<EOF
129 # This works around an issue in xhad, which binds to a particular
130 # Ethernet device, which in turn causes ICMP port unreachable messages
131 # if packets are received are on the wrong interface, which in turn
132 # can happen if we send out ARP replies on every interface (as Linux
133 # does by default) instead of just on the interface that has the IP
134 # address being ARPed for, which this sysctl setting in turn works
135 # around.
136 #
137 # Bug #1378.
138 net.ipv4.conf.all.arp_filter = 1
139 EOF
140 fi
141
142 if test ! -e /etc/openvswitch/conf.db; then
143     install -d -m 755 -o root -g root /etc/openvswitch
144
145     # Create ovs-vswitchd config database
146     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
147             /usr/share/openvswitch/vswitch.ovsschema
148
149     # Create initial table in config database
150     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
151             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
152             > /dev/null
153 fi
154
155 # Create default or update existing /etc/sysconfig/openvswitch.
156 SYSCONFIG=/etc/sysconfig/openvswitch
157 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
158 if [ ! -e $SYSCONFIG ]; then
159     cp $TEMPLATE $SYSCONFIG
160 else
161     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
162     do
163         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
164             echo >> $SYSCONFIG
165             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
166         fi
167     done
168 fi
169
170 # Deliberately break %postun in broken OVS builds that revert original
171 # XenServer scripts during rpm -U by moving the directory where it thinks
172 # they are saved.
173 if [ -d /usr/lib/openvswitch/xs-original ]; then
174     mkdir -p /usr/lib/openvswitch/xs-saved
175     mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
176         rmdir /usr/lib/openvswitch/xs-original
177 fi
178
179 # Replace XenServer files by our versions.
180 mkdir -p /usr/lib/openvswitch/xs-saved \
181     || printf "Could not create script backup directory.\n"
182 for f in \
183     /opt/xensource/libexec/interface-reconfigure \
184     /opt/xensource/libexec/InterfaceReconfigure.py \
185     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
186     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
187     /etc/xensource/scripts/vif
188 do
189     s=$(basename "$f")
190     t=$(readlink "$f")
191     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
192         mv "$f" /usr/lib/openvswitch/xs-saved/ \
193             || printf "Could not save original XenServer $s script\n"
194         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
195             || printf "Could not link to Open vSwitch $s script\n"
196     fi
197 done
198
199 # Clean up dangling symlinks to removed OVS replacement scripts no longer
200 # provided by OVS. Any time a replacement script is removed from OVS,
201 # it should be added here to ensure correct reversion from old versions of
202 # OVS that don't clean up dangling symlinks during the uninstall phase.
203 for orig in \
204     /usr/sbin/brctl \
205     /usr/sbin/xen-bugtool
206 do
207     saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
208     [ -e "$saved" ] && mv -f "$saved" "$orig"
209 done
210
211 # Ensure all required services are set to run
212 for s in openvswitch openvswitch-xapi-update; do
213     if chkconfig --list $s >/dev/null 2>&1; then
214         chkconfig --del $s || printf "Could not remove $s init script."
215     fi
216     chkconfig --add $s || printf "Could not add $s init script."
217     chkconfig $s on || printf "Could not enable $s init script."
218 done
219
220 if [ "$1" = "1" ]; then    # $1 = 1 for install
221     # Configure system to use Open vSwitch
222     /opt/xensource/bin/xe-switch-network-backend vswitch
223 else    # $1 = 2 for upgrade
224
225     mode=$(cat /etc/xensource/network.conf)
226     if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
227         printf "\nThe server is not configured to run Open vSwitch.  To run in\n"
228         printf "vswitch mode, you must run the following command:\n\n"
229         printf "\txe-switch-network-backend vswitch"
230     else
231         printf "\nTo use the new Open vSwitch install, you should reboot the\n"
232         printf "server now.  Failure to do so may result in incorrect operation."
233     fi
234
235     printf "\n\n"
236 fi
237
238 %posttrans %{module_package}
239 # Ensure that modprobe will find our modules.
240 #
241 # This has to be in %posttrans instead of %post because older versions
242 # installed modules into a different directory and "rpm -U" runs the
243 # new version's %post before removing the old version's files, so if
244 # we use %post then depmod may find the old versions that are about to
245 # be removed.
246 depmod %{xen_version}
247
248 %preun
249 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
250     # Configure system to use bridge
251     /opt/xensource/bin/xe-switch-network-backend bridge
252
253     # The "openvswitch" service should have been removed from
254     # "xe-switch-network-backend bridge".
255     for s in openvswitch openvswitch-xapi-update; do
256         if chkconfig --list $s >/dev/null 2>&1; then
257             chkconfig --del $s || printf "Could not remove $s init script."
258         fi
259     done
260 fi
261
262 %postun
263 # Restore original XenServer scripts if the OVS equivalent no longer exists.
264 # This works both in the upgrade and erase cases.
265 # This lists every file that every version of OVS has ever replaced. Never
266 # remove old files that OVS no longer replaces, or upgrades from old versions
267 # will fail to restore the XS originals, leaving the system in a broken state.
268 # Also be sure to add removed script paths to the %post scriptlet above to
269 # prevent the same problem when upgrading from old versions of OVS that lack
270 # this restore-on-upgrade logic.
271 for f in \
272     /etc/xensource/scripts/vif \
273     /usr/sbin/brctl \
274     /usr/sbin/xen-bugtool \
275     /opt/xensource/libexec/interface-reconfigure \
276     /opt/xensource/libexec/InterfaceReconfigure.py \
277     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
278     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
279 do
280     # Only revert dangling symlinks.
281     if [ -h "$f" ] && [ ! -e "$f" ]; then
282         s=$(basename "$f")
283         if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
284             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
285             printf "Could not restore original XenServer script.\n" >&2
286         else
287             (rm -f "$f" \
288                 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
289                 || printf "Could not restore original XenServer $s script.\n" >&2
290         fi
291     fi
292 done
293
294 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
295     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
296         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
297
298     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
299         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
300         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
301         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
302         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
303         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
304
305     # Remove all configuration files
306     rm -f /etc/openvswitch/conf.db
307     rm -f /etc/sysconfig/openvswitch
308     rm -f /etc/openvswitch/vswitchd.cacert
309
310     # Remove saved XenServer scripts directory, but only if it's empty
311     rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
312 fi
313
314 exit 0
315
316 %files
317 %defattr(-,root,root)
318 /etc/init.d/openvswitch
319 /etc/init.d/openvswitch-xapi-update
320 /etc/xapi.d/plugins/openvswitch-cfg-update
321 /etc/xensource/bugtool/*
322 /etc/logrotate.d/openvswitch
323 /etc/profile.d/openvswitch.sh
324 /usr/share/openvswitch/python/ovs/__init__.py
325 /usr/share/openvswitch/python/ovs/daemon.py
326 /usr/share/openvswitch/python/ovs/db/__init__.py
327 /usr/share/openvswitch/python/ovs/db/data.py
328 /usr/share/openvswitch/python/ovs/db/error.py
329 /usr/share/openvswitch/python/ovs/db/idl.py
330 /usr/share/openvswitch/python/ovs/db/parser.py
331 /usr/share/openvswitch/python/ovs/db/schema.py
332 /usr/share/openvswitch/python/ovs/db/types.py
333 /usr/share/openvswitch/python/ovs/dirs.py
334 /usr/share/openvswitch/python/ovs/fatal_signal.py
335 /usr/share/openvswitch/python/ovs/json.py
336 /usr/share/openvswitch/python/ovs/jsonrpc.py
337 /usr/share/openvswitch/python/ovs/ovsuuid.py
338 /usr/share/openvswitch/python/ovs/poller.py
339 /usr/share/openvswitch/python/ovs/process.py
340 /usr/share/openvswitch/python/ovs/reconnect.py
341 /usr/share/openvswitch/python/ovs/socket_util.py
342 /usr/share/openvswitch/python/ovs/stream.py
343 /usr/share/openvswitch/python/ovs/timeval.py
344 /usr/share/openvswitch/python/ovs/util.py
345 /usr/share/openvswitch/python/uuid.py
346 /usr/share/openvswitch/scripts/ovs-xapi-sync
347 /usr/share/openvswitch/scripts/interface-reconfigure
348 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
349 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
350 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
351 /usr/share/openvswitch/scripts/vif
352 /usr/share/openvswitch/scripts/sysconfig.template
353 /usr/share/openvswitch/scripts/ovs-bugtool-*
354 /usr/share/openvswitch/scripts/ovs-save
355 /usr/share/openvswitch/scripts/ovs-ctl
356 /usr/share/openvswitch/scripts/ovs-lib.sh
357 /usr/share/openvswitch/vswitch.ovsschema
358 /usr/sbin/ovs-vlan-bug-workaround
359 /usr/sbin/ovs-vswitchd
360 /usr/sbin/ovsdb-server
361 /usr/bin/ovs-appctl
362 /usr/bin/ovs-dpctl
363 /usr/bin/ovs-ofctl
364 /usr/bin/ovs-pcap
365 /usr/bin/ovs-tcpundump
366 /usr/bin/ovs-vlan-test
367 /usr/bin/ovs-vsctl
368 /usr/bin/ovsdb-client
369 /usr/bin/ovsdb-tool
370 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
371 /usr/share/man/man1/ovsdb-client.1.gz
372 /usr/share/man/man1/ovsdb-server.1.gz
373 /usr/share/man/man1/ovsdb-tool.1.gz
374 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
375 /usr/share/man/man8/ovs-appctl.8.gz
376 /usr/share/man/man8/ovs-ctl.8.gz
377 /usr/share/man/man8/ovs-dpctl.8.gz
378 /usr/share/man/man8/ovs-ofctl.8.gz
379 /usr/share/man/man8/ovs-parse-leaks.8.gz
380 /usr/share/man/man1/ovs-pcap.1.gz
381 /usr/share/man/man1/ovs-tcpundump.1.gz
382 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
383 /usr/share/man/man8/ovs-vlan-test.8.gz
384 /usr/share/man/man8/ovs-vsctl.8.gz
385 /usr/share/man/man8/ovs-vswitchd.8.gz
386 /var/lib/openvswitch
387 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
388 %exclude /usr/sbin/ovs-brcompatd
389 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
390 %exclude /usr/share/openvswitch/scripts/*.py[co]
391 %exclude /usr/share/openvswitch/python/*.py[co]
392 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
393 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
394
395 %files %{module_package}
396 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch_mod.ko
397 %exclude /lib/modules/%{xen_version}/extra/openvswitch/brcompat_mod.ko