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