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