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