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