d2433f986f5d9560a0cb4ce171ab4ca727f916c9
[sliver-openvswitch.git] / xenserver / openvswitch-xen.spec
1 # Spec file for Open vSwitch.
2
3 # Copyright (C) 2009, 2010 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_refresh-network-uuids \
77                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/refresh-network-uuids
78 install -m 755 xenserver/usr_sbin_xen-bugtool \
79              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/xen-bugtool
80 install -m 755 xenserver/usr_sbin_brctl \
81              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/brctl
82 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
83          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
84 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
85 install -m 644 \
86         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
87                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
88
89 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch
90 find datapath/linux-2.6 -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch \;
91
92 # Get rid of stuff we don't want to make RPM happy.
93 rm \
94     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
95     $RPM_BUILD_ROOT/usr/bin/ovs-discover \
96     $RPM_BUILD_ROOT/usr/bin/ovs-kill \
97     $RPM_BUILD_ROOT/usr/bin/ovs-openflowd \
98     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
99     $RPM_BUILD_ROOT/usr/bin/ovs-wdt \
100     $RPM_BUILD_ROOT/usr/sbin/ovs-monitor \
101     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
102     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-discover.8 \
103     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-kill.8 \
104     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
105     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
106
107 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
108
109 %clean
110 rm -rf $RPM_BUILD_ROOT
111
112 %post
113 if [ ! -f /etc/xensource-inventory ]; then
114     printf "XenSource inventory not present in /etc/xensource-inventory"
115     exit 1
116 fi
117 . /etc/xensource-inventory
118
119 if [ "$1" = "1" ]; then
120     if md5sum -c --status <<EOF
121 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
122 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
123 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
124 5654c8c36699fcc8744ca9cd5b855414  /usr/sbin/xen-bugtool
125 EOF
126     then
127         printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
128     elif md5sum -c --status <<EOF
129 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
130 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
131 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
132 f6519085c2fc5f7bc4eccc294ed62000  /usr/sbin/xen-bugtool
133 EOF
134     then
135         printf "\nVerified host scripts from XenServer 5.5.0-24648p (Update 1)\n"
136         printf "or 5.5.0-25727p (Update 2).\n\n"
137     elif md5sum -c --status <<EOF
138 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
139 02cf136237ed85fcbcc1efc15ce0591c  /opt/xensource/libexec/interface-reconfigure
140 3a192ee70ebf2153c90051b3af95f331  /opt/xensource/libexec/InterfaceReconfigureBridge.py
141 f71cadf1464caefa7943de0ab47fdd8a  /opt/xensource/libexec/InterfaceReconfigure.py
142 d70f08f235fb1bfd49a0580e440f15a0  /opt/xensource/libexec/InterfaceReconfigureVswitch.py
143 f5c85ca825b1e6f5a0845530981cd836  /etc/xensource/scripts/vif
144 facb851606f82ca2bcc760a4d91bbe33  /usr/sbin/xen-bugtool
145 EOF
146     then
147         printf "\nVerified host scripts from XenServer 5.5.900-29381p.\n\n"
148     else
149 cat <<EOF
150
151 The original XenServer scripts replaced by this package are not those
152 of any supported version of XenServer.  This could lead to unexpected
153 behavior of your server.  Unless you are sure you know what you are
154 doing, it is highly recommended that you remove this package
155 immediately after the install completes, which will restore the
156 XenServer scripts that you were previously using.
157
158 EOF
159     fi
160 fi
161
162 # On XenServer 5.5.0, we need refresh-network-uuids to run whenever
163 # XAPI starts or restarts.  (On XenServer 5.6.0, XAPI calls the
164 # "update" method of the vswitch-cfg-update plugin whenever it starts
165 # or restarts, so this is no longer necessary.)
166 if test "$PRODUCT_VERSION" = "5.5.0"; then
167     RNU=/usr/share/openvswitch/scripts/refresh-network-uuids
168     XSS=/opt/xensource/libexec/xapi-startup-script
169     if test -e $XSS && (test ! -L $XSS || test "`readlink $XSS`" != $RNU); then
170         echo "$XSS is already in use, refusing to overwrite"
171         exit 1
172     fi
173     rm -f $XSS
174     ln -s $RNU $XSS
175
176     # If /etc/xensource/network.conf doesn't exist (it was added in 5.6.0),
177     # then interface-reconfigure will be unhappy when we run it below.
178     if test ! -e /etc/xensource/network.conf; then
179         echo bridge > /etc/xensource/network.conf
180     fi
181 fi
182
183
184 if test ! -e /var/xapi/network.dbcache; then
185     if test "$1" = 1; then
186         printf "Creating xapi database cache...  "
187     else
188         printf "warning: Open vSwitch is being re-installed or upgraded,\n"
189         printf "         but the xapi database cache is missing.\n"
190         printf "Re-creating xapi database cache...  "
191     fi
192
193     if /usr/share/openvswitch/scripts/interface-reconfigure rewrite; then
194         printf "done.\n"
195     else
196         printf "FAILED\n"
197         printf "Open vSwitch can only be installed on a XenServer that\n"
198         printf "has connectivity to xapi on the pool master.  Please\n"
199         printf "fix connectivity to the pool master, then try again.\n"
200         exit 1
201     fi
202 fi
203
204 # Ensure that modprobe will find our modules.
205 depmod %{xen_version}
206
207 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
208     cat >>/etc/sysctl.conf <<EOF
209 # This works around an issue in xhad, which binds to a particular
210 # Ethernet device, which in turn causes ICMP port unreachable messages
211 # if packets are received are on the wrong interface, which in turn
212 # can happen if we send out ARP replies on every interface (as Linux
213 # does by default) instead of just on the interface that has the IP
214 # address being ARPed for, which this sysctl setting in turn works
215 # around.
216 #
217 # Bug #1378.
218 net.ipv4.conf.all.arp_filter = 1
219 EOF
220 fi
221
222 if test ! -e /etc/openvswitch/conf.db; then
223     install -d -m 755 -o root -g root /etc/openvswitch
224
225     # Create ovs-vswitchd config database
226     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
227             /usr/share/openvswitch/vswitch.ovsschema
228
229     # Create initial table in config database
230     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
231             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
232             > /dev/null
233 fi
234
235 # Create default or update existing /etc/sysconfig/openvswitch.
236 SYSCONFIG=/etc/sysconfig/openvswitch
237 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
238 if [ ! -e $SYSCONFIG ]; then
239     cp $TEMPLATE $SYSCONFIG
240 else
241     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
242     do
243         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
244             echo >> $SYSCONFIG
245             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
246         fi
247     done
248 fi
249
250 # Replace XenServer files by our versions.
251 mkdir -p /usr/lib/openvswitch/xs-original \
252     || printf "Could not create script backup directory.\n"
253 for f in \
254     /opt/xensource/libexec/interface-reconfigure \
255     /opt/xensource/libexec/InterfaceReconfigure.py \
256     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
257     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
258     /etc/xensource/scripts/vif \
259     /usr/sbin/xen-bugtool \
260     /usr/sbin/brctl
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         /usr/sbin/brctl
330     do
331         s=$(basename "$f")
332         if [ ! -f "/usr/lib/openvswitch/xs-original/$s" ]; then
333             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-original\n"
334             printf "Could not restore original XenServer script.\n"
335         else
336             (rm -f "$f" \
337                 && mv "/usr/lib/openvswitch/xs-original/$s" "$f") \
338                 || printf "Could not restore original XenServer $s script.\n"
339         fi
340     done
341
342     # Remove all configuration files
343     rm -f /etc/openvswitch/conf.db
344     rm -f /etc/sysconfig/openvswitch
345     rm -f /etc/openvswitch/vswitchd.cacert
346     rm -f /var/xapi/network.dbcache
347
348     if test "$PRODUCT_VERSION" != "5.5.0"; then
349         # Configure system to use bridge
350         echo bridge > /etc/xensource/network.conf
351     else
352         # Get rid of network.conf entirely, to make the system pristine.
353         rm -f /etc/xensource/network.conf
354     fi
355
356     printf "\nYou MUST reboot the server now to complete the change to\n"
357     printf "standard Xen networking.  Attempts to modify networking on the\n"
358     printf "server or any hosted VM will fail until after the reboot and\n"
359     printf "could leave the server in a state requiring manual recovery.\n\n"
360 fi
361
362
363 %files
364 %defattr(-,root,root)
365 /etc/init.d/openvswitch
366 /etc/init.d/openvswitch-xapi-update
367 /etc/xapi.d/plugins/openvswitch-cfg-update
368 /etc/logrotate.d/openvswitch
369 /etc/profile.d/openvswitch.sh
370 /lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
371 /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko
372 /usr/share/openvswitch/scripts/refresh-network-uuids
373 /usr/share/openvswitch/scripts/interface-reconfigure
374 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
375 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
376 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
377 /usr/share/openvswitch/scripts/vif
378 /usr/share/openvswitch/scripts/xen-bugtool
379 /usr/share/openvswitch/scripts/brctl
380 /usr/share/openvswitch/scripts/sysconfig.template
381 /usr/share/openvswitch/vswitch.ovsschema
382 /usr/sbin/ovs-brcompatd
383 /usr/sbin/ovs-vswitchd
384 /usr/sbin/ovsdb-server
385 /usr/bin/ovs-appctl
386 /usr/bin/ovs-dpctl
387 /usr/bin/ovs-ofctl
388 /usr/bin/ovs-vsctl
389 /usr/bin/ovsdb-client
390 /usr/bin/ovsdb-tool
391 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
392 /usr/share/man/man1/ovsdb-client.1.gz
393 /usr/share/man/man1/ovsdb-server.1.gz
394 /usr/share/man/man1/ovsdb-tool.1.gz
395 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
396 /usr/share/man/man8/ovs-appctl.8.gz
397 /usr/share/man/man8/ovs-brcompatd.8.gz
398 /usr/share/man/man8/ovs-dpctl.8.gz
399 /usr/share/man/man8/ovs-ofctl.8.gz
400 /usr/share/man/man8/ovs-vsctl.8.gz
401 /usr/share/man/man8/ovs-vswitchd.8.gz
402 /var/lib/openvswitch
403 %exclude /usr/lib/xsconsole/plugins-base/*.pyc
404 %exclude /usr/lib/xsconsole/plugins-base/*.pyo
405 %exclude /usr/share/openvswitch/scripts/*.pyc
406 %exclude /usr/share/openvswitch/scripts/*.pyo