bd9d27a4b617969c1074ddbd28133b1a4aa43b9d
[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/ovs-xenserverd $RPM_BUILD_ROOT/usr/sbin/
83 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
84          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
85 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
86 install -m 644 \
87         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
88                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
89
90 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch
91 find datapath/linux-2.6 -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/extra/openvswitch \;
92
93 # Get rid of stuff we don't want to make RPM happy.
94 rm \
95     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
96     $RPM_BUILD_ROOT/usr/bin/ovs-discover \
97     $RPM_BUILD_ROOT/usr/bin/ovs-kill \
98     $RPM_BUILD_ROOT/usr/bin/ovs-openflowd \
99     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
100     $RPM_BUILD_ROOT/usr/bin/ovs-wdt \
101     $RPM_BUILD_ROOT/usr/sbin/ovs-monitor \
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
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 if test ! -e /var/xapi/network.dbcache; then
163     if test "$1" = 1; then
164         printf "Creating xapi database cache...  "
165     else
166         printf "warning: Open vSwitch is being re-installed or upgraded,\n"
167         printf "         but the xapi database cache is missing.\n"
168         printf "Re-creating xapi database cache...  "
169     fi
170
171     if /usr/share/openvswitch/scripts/interface-reconfigure rewrite; then
172         printf "done.\n"
173     else
174         printf "FAILED\n"
175         printf "Open vSwitch can only be installed on a XenServer that\n"
176         printf "has connectivity to xapi on the pool master.  Please\n"
177         printf "fix connectivity to the pool master, then try again.\n"
178         exit 1
179     fi
180 fi
181
182 # Ensure that modprobe will find our modules.
183 depmod %{xen_version}
184
185 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
186     cat >>/etc/sysctl.conf <<EOF
187 # This works around an issue in xhad, which binds to a particular
188 # Ethernet device, which in turn causes ICMP port unreachable messages
189 # if packets are received are on the wrong interface, which in turn
190 # can happen if we send out ARP replies on every interface (as Linux
191 # does by default) instead of just on the interface that has the IP
192 # address being ARPed for, which this sysctl setting in turn works
193 # around.
194 #
195 # Bug #1378.
196 net.ipv4.conf.all.arp_filter = 1
197 EOF
198 fi
199
200 if test ! -e /etc/openvswitch/conf.db; then
201     install -d -m 755 -o root -g root /etc/openvswitch
202
203     # Create ovs-vswitchd config database
204     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
205             /usr/share/openvswitch/vswitch.ovsschema
206
207     # Create initial table in config database
208     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
209             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
210             > /dev/null
211 fi
212
213 # Create default or update existing /etc/sysconfig/openvswitch.
214 SYSCONFIG=/etc/sysconfig/openvswitch
215 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
216 if [ ! -e $SYSCONFIG ]; then
217     cp $TEMPLATE $SYSCONFIG
218 else
219     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
220     do
221         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
222             echo >> $SYSCONFIG
223             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
224         fi
225     done
226 fi
227
228 # Replace XenServer files by our versions.
229 mkdir -p /usr/lib/openvswitch/xs-original \
230     || printf "Could not create script backup directory.\n"
231 for f in \
232     /opt/xensource/libexec/interface-reconfigure \
233     /opt/xensource/libexec/InterfaceReconfigure.py \
234     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
235     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
236     /etc/xensource/scripts/vif \
237     /usr/sbin/xen-bugtool \
238     /usr/sbin/brctl
239 do
240     s=$(basename "$f")
241     t=$(readlink "$f")
242     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
243         mv "$f" /usr/lib/openvswitch/xs-original/ \
244             || printf "Could not save original XenServer $s script\n"
245         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
246             || printf "Could not link to Open vSwitch $s script\n"
247     fi
248 done
249
250 # Ensure all required services are set to run
251 for s in openvswitch openvswitch-xapi-update; do
252     if chkconfig --list $s >/dev/null 2>&1; then
253         chkconfig --del $s || printf "Could not remove $s init script."
254     fi
255     chkconfig --add $s || printf "Could not add $s init script."
256     chkconfig $s on || printf "Could not enable $s init script."
257 done
258
259 # Configure system to use Open vSwitch
260 echo vswitch > /etc/xensource/network.conf
261
262 if [ "$1" = "1" ]; then    # $1 = 2 for upgrade
263     printf "\nYou MUST reboot the server NOW to complete the change to\n"
264     printf "Open vSwitch.  Attempts to modify networking on the server\n"
265     printf "or any hosted VM will fail until after the reboot and could\n"
266     printf "leave the server in an state requiring manual recovery.\n\n"
267 else
268     printf "\nTo use the new Open vSwitch install, you should reboot the\n" 
269     printf "server now.  Failure to do so may result in incorrect operation."
270     printf "\n\n"
271 fi
272
273 %preun
274 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
275     for s in openvswitch openvswitch-xapi-update; do
276         chkconfig --del $s || printf "Could not remove $s init script."
277     done
278 fi
279
280
281 %postun
282 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
283
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     # Restore original XenServer scripts
295     for f in \
296         /opt/xensource/libexec/interface-reconfigure \
297         /opt/xensource/libexec/InterfaceReconfigure.py \
298         /opt/xensource/libexec/InterfaceReconfigureBridge.py \
299         /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
300         /etc/xensource/scripts/vif \
301         /usr/sbin/xen-bugtool \
302         /usr/sbin/brctl
303     do
304         s=$(basename "$f")
305         if [ ! -f "/usr/lib/openvswitch/xs-original/$s" ]; then
306             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-original\n"
307             printf "Could not restore original XenServer script.\n"
308         else
309             (rm -f "$f" \
310                 && mv "/usr/lib/openvswitch/xs-original/$s" "$f") \
311                 || printf "Could not restore original XenServer $s script.\n"
312         fi
313     done
314
315     # Remove all configuration files
316     rm -f /etc/openvswitch/conf.db
317     rm -f /etc/sysconfig/openvswitch
318     rm -f /etc/openvswitch/vswitchd.cacert
319     rm -f /var/xapi/network.dbcache
320
321     # Configure system to use bridge
322     echo bridge > /etc/xensource/network.conf
323
324     printf "\nYou MUST reboot the server now to complete the change to\n"
325     printf "standard Xen networking.  Attempts to modify networking on the\n"
326     printf "server or any hosted VM will fail until after the reboot and\n"
327     printf "could leave the server in a state requiring manual recovery.\n\n"
328 fi
329
330
331 %files
332 %defattr(-,root,root)
333 /etc/init.d/openvswitch
334 /etc/init.d/openvswitch-xapi-update
335 /etc/xapi.d/plugins/openvswitch-cfg-update
336 /etc/logrotate.d/openvswitch
337 /etc/profile.d/openvswitch.sh
338 /lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
339 /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko
340 %if %(echo '%{xen_version}'|awk -F"[.-]" '{if ($3==18) print 1; else print 0;}')
341 /lib/modules/%{xen_version}/kernel/extra/openvswitch/veth_mod.ko
342 %endif
343 /usr/share/openvswitch/scripts/refresh-network-uuids
344 /usr/share/openvswitch/scripts/interface-reconfigure
345 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
346 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
347 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
348 /usr/share/openvswitch/scripts/vif
349 /usr/share/openvswitch/scripts/xen-bugtool
350 /usr/share/openvswitch/scripts/brctl
351 /usr/share/openvswitch/scripts/sysconfig.template
352 /usr/share/openvswitch/vswitch.ovsschema
353 /usr/sbin/ovs-brcompatd
354 /usr/sbin/ovs-vswitchd
355 /usr/sbin/ovs-xenserverd
356 /usr/sbin/ovsdb-server
357 /usr/bin/ovs-appctl
358 /usr/bin/ovs-dpctl
359 /usr/bin/ovs-ofctl
360 /usr/bin/ovs-vsctl
361 /usr/bin/ovsdb-client
362 /usr/bin/ovsdb-tool
363 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
364 /usr/share/man/man1/ovsdb-client.1.gz
365 /usr/share/man/man1/ovsdb-server.1.gz
366 /usr/share/man/man1/ovsdb-tool.1.gz
367 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
368 /usr/share/man/man8/ovs-appctl.8.gz
369 /usr/share/man/man8/ovs-brcompatd.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-vsctl.8.gz
373 /usr/share/man/man8/ovs-vswitchd.8.gz
374 /usr/share/man/man8/ovs-xenserverd.8.gz
375 /var/lib/openvswitch
376 %exclude /usr/lib/xsconsole/plugins-base/*.pyc
377 %exclude /usr/lib/xsconsole/plugins-base/*.pyo
378 %exclude /usr/share/openvswitch/scripts/*.pyc
379 %exclude /usr/share/openvswitch/scripts/*.pyo