xenserver: Remove brctl wrapper script.
[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 Name: openvswitch
19 Summary: Virtual switch
20 Group: System Environment/Daemons
21 URL: http://www.openvswitch.org/
22 Vendor: Nicira Networks, Inc.
23 Version: %{openvswitch_version}
24
25 # The entire source code is ASL 2.0 except datapath/ which is GPLv2
26 License: ASL 2.0 and GPLv2
27 Release: 1
28 Source: openvswitch-%{openvswitch_version}.tar.gz
29 Buildroot: /tmp/openvswitch-xen-rpm
30 Requires: kernel-xen = %(echo '%{xen_version}' | sed 's/xen$//')
31
32 %description
33 Open vSwitch provides standard network bridging functions augmented with
34 support for the OpenFlow protocol for remote per-flow control of
35 traffic.
36
37 %prep
38 %setup -q -n openvswitch-%{openvswitch_version}
39
40 %build
41 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
42 make %{_smp_mflags}
43
44 %install
45 rm -rf $RPM_BUILD_ROOT
46 make install DESTDIR=$RPM_BUILD_ROOT
47 install -d -m 755 $RPM_BUILD_ROOT/etc
48 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
49 install -m 755 xenserver/etc_init.d_openvswitch \
50          $RPM_BUILD_ROOT/etc/init.d/openvswitch
51 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
52          $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
53 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
54 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
55 install -m 755 xenserver/etc_logrotate.d_openvswitch \
56          $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
57 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
58 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
59          $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
60 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
61 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
62          $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
63 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
64 install -m 644 vswitchd/vswitch.ovsschema \
65          $RPM_BUILD_ROOT/usr/share/openvswitch/vswitch.ovsschema
66 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
67              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
68 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
69              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
70 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
71              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
72 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
73              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
74 install -m 755 xenserver/etc_xensource_scripts_vif \
75              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
76 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-external-ids \
77                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-external-ids
78 install -m 755 xenserver/usr_share_openvswitch_scripts_refresh-xs-network-uuids \
79                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/refresh-xs-network-uuids
80 install -m 755 xenserver/usr_sbin_xen-bugtool \
81              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/xen-bugtool
82 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
83          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
84 install -m 755 utilities/ovs-save \
85          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-save
86 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
87 install -m 644 \
88         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
89                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
90
91 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch
92 find datapath/linux-2.6 -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch \;
93 install xenserver/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
94
95 # Get rid of stuff we don't want to make RPM happy.
96 rm \
97     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
98     $RPM_BUILD_ROOT/usr/bin/ovs-discover \
99     $RPM_BUILD_ROOT/usr/bin/ovs-kill \
100     $RPM_BUILD_ROOT/usr/bin/ovs-openflowd \
101     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
102     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
103     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-discover.8 \
104     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-kill.8 \
105     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
106     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
107
108 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
109
110 %clean
111 rm -rf $RPM_BUILD_ROOT
112
113 %post
114 if [ ! -f /etc/xensource-inventory ]; then
115     printf "XenSource inventory not present in /etc/xensource-inventory"
116     exit 1
117 fi
118 . /etc/xensource-inventory
119
120 if [ "$1" = "1" ]; then
121     if md5sum -c --status <<EOF
122 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
123 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
124 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
125 5654c8c36699fcc8744ca9cd5b855414  /usr/sbin/xen-bugtool
126 EOF
127     then
128         printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
129     elif md5sum -c --status <<EOF
130 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
131 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
132 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
133 f6519085c2fc5f7bc4eccc294ed62000  /usr/sbin/xen-bugtool
134 EOF
135     then
136         printf "\nVerified host scripts from XenServer 5.5.0-24648p (Update 1)\n"
137         printf "or 5.5.0-25727p (Update 2).\n\n"
138     elif md5sum -c --status <<EOF
139 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
140 02cf136237ed85fcbcc1efc15ce0591c  /opt/xensource/libexec/interface-reconfigure
141 3a192ee70ebf2153c90051b3af95f331  /opt/xensource/libexec/InterfaceReconfigureBridge.py
142 f71cadf1464caefa7943de0ab47fdd8a  /opt/xensource/libexec/InterfaceReconfigure.py
143 d70f08f235fb1bfd49a0580e440f15a0  /opt/xensource/libexec/InterfaceReconfigureVswitch.py
144 f5c85ca825b1e6f5a0845530981cd836  /etc/xensource/scripts/vif
145 facb851606f82ca2bcc760a4d91bbe33  /usr/sbin/xen-bugtool
146 EOF
147     then
148         printf "\nVerified host scripts from XenServer 5.5.900-29381p.\n\n"
149     else
150 cat <<EOF
151
152 The original XenServer scripts replaced by this package are not those
153 of any supported version of XenServer.  This could lead to unexpected
154 behavior of your server.  Unless you are sure you know what you are
155 doing, it is highly recommended that you remove this package
156 immediately after the install completes, which will restore the
157 XenServer scripts that you were previously using.
158
159 EOF
160     fi
161 fi
162
163 # On XenServer 5.5.0, we need refresh-xs-network-uuids to run whenever
164 # XAPI starts or restarts.  (On XenServer 5.6.0, XAPI calls the
165 # "update" method of the vswitch-cfg-update plugin whenever it starts
166 # or restarts, so this is no longer necessary.)
167 if test "$PRODUCT_VERSION" = "5.5.0"; then
168     RNU=/usr/share/openvswitch/scripts/refresh-xs-network-uuids
169     XSS=/opt/xensource/libexec/xapi-startup-script
170     if test -e $XSS && (test ! -L $XSS || test "`readlink $XSS`" != $RNU); then
171         echo "$XSS is already in use, refusing to overwrite"
172         exit 1
173     fi
174     rm -f $XSS
175     ln -s $RNU $XSS
176
177     # If /etc/xensource/network.conf doesn't exist (it was added in 5.6.0),
178     # then interface-reconfigure will be unhappy when we run it below.
179     if test ! -e /etc/xensource/network.conf; then
180         echo bridge > /etc/xensource/network.conf
181     fi
182 fi
183
184
185 if test ! -e /var/xapi/network.dbcache; then
186     if test "$1" = 1; then
187         printf "Creating xapi database cache...  "
188     else
189         printf "warning: Open vSwitch is being re-installed or upgraded,\n"
190         printf "         but the xapi database cache is missing.\n"
191         printf "Re-creating xapi database cache...  "
192     fi
193
194     if /usr/share/openvswitch/scripts/interface-reconfigure rewrite; then
195         printf "done.\n"
196     else
197         printf "FAILED\n"
198         printf "Open vSwitch can only be installed on a XenServer that\n"
199         printf "has connectivity to xapi on the pool master.  Please\n"
200         printf "fix connectivity to the pool master, then try again.\n"
201         exit 1
202     fi
203 fi
204
205 # Ensure that modprobe will find our modules.
206 depmod %{xen_version}
207
208 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
209     cat >>/etc/sysctl.conf <<EOF
210 # This works around an issue in xhad, which binds to a particular
211 # Ethernet device, which in turn causes ICMP port unreachable messages
212 # if packets are received are on the wrong interface, which in turn
213 # can happen if we send out ARP replies on every interface (as Linux
214 # does by default) instead of just on the interface that has the IP
215 # address being ARPed for, which this sysctl setting in turn works
216 # around.
217 #
218 # Bug #1378.
219 net.ipv4.conf.all.arp_filter = 1
220 EOF
221 fi
222
223 if test ! -e /etc/openvswitch/conf.db; then
224     install -d -m 755 -o root -g root /etc/openvswitch
225
226     # Create ovs-vswitchd config database
227     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
228             /usr/share/openvswitch/vswitch.ovsschema
229
230     # Create initial table in config database
231     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
232             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
233             > /dev/null
234 fi
235
236 # Create default or update existing /etc/sysconfig/openvswitch.
237 SYSCONFIG=/etc/sysconfig/openvswitch
238 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
239 if [ ! -e $SYSCONFIG ]; then
240     cp $TEMPLATE $SYSCONFIG
241 else
242     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
243     do
244         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
245             echo >> $SYSCONFIG
246             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
247         fi
248     done
249 fi
250
251 # Replace XenServer files by our versions.
252 mkdir -p /usr/lib/openvswitch/xs-original \
253     || printf "Could not create script backup directory.\n"
254 for f in \
255     /opt/xensource/libexec/interface-reconfigure \
256     /opt/xensource/libexec/InterfaceReconfigure.py \
257     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
258     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
259     /etc/xensource/scripts/vif \
260     /usr/sbin/xen-bugtool
261 do
262     s=$(basename "$f")
263     t=$(readlink "$f")
264     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
265         mv "$f" /usr/lib/openvswitch/xs-original/ \
266             || printf "Could not save original XenServer $s script\n"
267         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
268             || printf "Could not link to Open vSwitch $s script\n"
269     fi
270 done
271
272 # Ensure all required services are set to run
273 for s in openvswitch openvswitch-xapi-update; do
274     if chkconfig --list $s >/dev/null 2>&1; then
275         chkconfig --del $s || printf "Could not remove $s init script."
276     fi
277     chkconfig --add $s || printf "Could not add $s init script."
278     chkconfig $s on || printf "Could not enable $s init script."
279 done
280
281 # Configure system to use Open vSwitch
282 echo vswitch > /etc/xensource/network.conf
283
284 if [ "$1" = "1" ]; then    # $1 = 2 for upgrade
285     printf "\nYou MUST reboot the server NOW to complete the change to\n"
286     printf "Open vSwitch.  Attempts to modify networking on the server\n"
287     printf "or any hosted VM will fail until after the reboot and could\n"
288     printf "leave the server in an state requiring manual recovery.\n\n"
289 else
290     printf "\nTo use the new Open vSwitch install, you should reboot the\n" 
291     printf "server now.  Failure to do so may result in incorrect operation."
292     printf "\n\n"
293 fi
294
295 %preun
296 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
297     for s in openvswitch openvswitch-xapi-update; do
298         chkconfig --del $s || printf "Could not remove $s init script."
299     done
300 fi
301
302
303 %postun
304 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
305     . /etc/xensource-inventory
306     if test "$PRODUCT_VERSION" = "5.5.0"; then
307         XSS=/opt/xensource/libexec/xapi-startup-script
308         rm -f $XSS
309     fi
310
311     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
312         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
313
314     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
315         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
316         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
317         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
318         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
319         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo 
320
321     # Restore original XenServer scripts
322     for f in \
323         /opt/xensource/libexec/interface-reconfigure \
324         /opt/xensource/libexec/InterfaceReconfigure.py \
325         /opt/xensource/libexec/InterfaceReconfigureBridge.py \
326         /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
327         /etc/xensource/scripts/vif \
328         /usr/sbin/xen-bugtool
329     do
330         s=$(basename "$f")
331         if [ ! -f "/usr/lib/openvswitch/xs-original/$s" ]; then
332             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-original\n"
333             printf "Could not restore original XenServer script.\n"
334         else
335             (rm -f "$f" \
336                 && mv "/usr/lib/openvswitch/xs-original/$s" "$f") \
337                 || printf "Could not restore original XenServer $s script.\n"
338         fi
339     done
340
341     # Remove all configuration files
342     rm -f /etc/openvswitch/conf.db
343     rm -f /etc/sysconfig/openvswitch
344     rm -f /etc/openvswitch/vswitchd.cacert
345     rm -f /var/xapi/network.dbcache
346
347     if test "$PRODUCT_VERSION" != "5.5.0"; then
348         # Configure system to use bridge
349         echo bridge > /etc/xensource/network.conf
350     else
351         # Get rid of network.conf entirely, to make the system pristine.
352         rm -f /etc/xensource/network.conf
353     fi
354
355     printf "\nYou MUST reboot the server now to complete the change to\n"
356     printf "standard Xen networking.  Attempts to modify networking on the\n"
357     printf "server or any hosted VM will fail until after the reboot and\n"
358     printf "could leave the server in a state requiring manual recovery.\n\n"
359 fi
360
361
362 %files
363 %defattr(-,root,root)
364 /etc/init.d/openvswitch
365 /etc/init.d/openvswitch-xapi-update
366 /etc/xapi.d/plugins/openvswitch-cfg-update
367 /etc/logrotate.d/openvswitch
368 /etc/profile.d/openvswitch.sh
369 /lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
370 /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko
371 /usr/share/openvswitch/python/ovs/__init__.py
372 /usr/share/openvswitch/python/ovs/daemon.py
373 /usr/share/openvswitch/python/ovs/db/__init__.py
374 /usr/share/openvswitch/python/ovs/db/data.py
375 /usr/share/openvswitch/python/ovs/db/error.py
376 /usr/share/openvswitch/python/ovs/db/idl.py
377 /usr/share/openvswitch/python/ovs/db/parser.py
378 /usr/share/openvswitch/python/ovs/db/schema.py
379 /usr/share/openvswitch/python/ovs/db/types.py
380 /usr/share/openvswitch/python/ovs/dirs.py
381 /usr/share/openvswitch/python/ovs/fatal_signal.py
382 /usr/share/openvswitch/python/ovs/json.py
383 /usr/share/openvswitch/python/ovs/jsonrpc.py
384 /usr/share/openvswitch/python/ovs/ovsuuid.py
385 /usr/share/openvswitch/python/ovs/poller.py
386 /usr/share/openvswitch/python/ovs/process.py
387 /usr/share/openvswitch/python/ovs/reconnect.py
388 /usr/share/openvswitch/python/ovs/socket_util.py
389 /usr/share/openvswitch/python/ovs/stream.py
390 /usr/share/openvswitch/python/ovs/timeval.py
391 /usr/share/openvswitch/python/ovs/util.py
392 /usr/share/openvswitch/python/uuid.py
393 /usr/share/openvswitch/scripts/ovs-external-ids
394 /usr/share/openvswitch/scripts/refresh-xs-network-uuids
395 /usr/share/openvswitch/scripts/interface-reconfigure
396 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
397 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
398 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
399 /usr/share/openvswitch/scripts/vif
400 /usr/share/openvswitch/scripts/xen-bugtool
401 /usr/share/openvswitch/scripts/sysconfig.template
402 /usr/share/openvswitch/scripts/ovs-save
403 /usr/share/openvswitch/vswitch.ovsschema
404 /usr/sbin/ovs-brcompatd
405 /usr/sbin/ovs-vswitchd
406 /usr/sbin/ovsdb-server
407 /usr/bin/ovs-appctl
408 /usr/bin/ovs-dpctl
409 /usr/bin/ovs-ofctl
410 /usr/bin/ovs-pcap
411 /usr/bin/ovs-tcpundump
412 /usr/bin/ovs-vlan-test
413 /usr/bin/ovs-vsctl
414 /usr/bin/ovsdb-client
415 /usr/bin/ovsdb-tool
416 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
417 /usr/share/man/man1/ovsdb-client.1.gz
418 /usr/share/man/man1/ovsdb-server.1.gz
419 /usr/share/man/man1/ovsdb-tool.1.gz
420 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
421 /usr/share/man/man8/ovs-appctl.8.gz
422 /usr/share/man/man8/ovs-brcompatd.8.gz
423 /usr/share/man/man8/ovs-dpctl.8.gz
424 /usr/share/man/man8/ovs-ofctl.8.gz
425 /usr/share/man/man8/ovs-parse-leaks.8.gz
426 /usr/share/man/man1/ovs-pcap.1.gz
427 /usr/share/man/man1/ovs-tcpundump.1.gz
428 /usr/share/man/man8/ovs-vlan-test.8.gz
429 /usr/share/man/man8/ovs-vsctl.8.gz
430 /usr/share/man/man8/ovs-vswitchd.8.gz
431 /var/lib/openvswitch
432 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
433 %exclude /usr/share/openvswitch/scripts/*.py[co]
434 %exclude /usr/share/openvswitch/python/*.py[co]
435 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
436 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]