Implement initial Python bindings for Open vSwitch database.
[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 install xenserver/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
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/share/man/man8/ovs-controller.8 \
101     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-discover.8 \
102     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-kill.8 \
103     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
104     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
105
106 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
107
108 %clean
109 rm -rf $RPM_BUILD_ROOT
110
111 %post
112 if [ ! -f /etc/xensource-inventory ]; then
113     printf "XenSource inventory not present in /etc/xensource-inventory"
114     exit 1
115 fi
116 . /etc/xensource-inventory
117
118 if [ "$1" = "1" ]; then
119     if md5sum -c --status <<EOF
120 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
121 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
122 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
123 5654c8c36699fcc8744ca9cd5b855414  /usr/sbin/xen-bugtool
124 EOF
125     then
126         printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
127     elif md5sum -c --status <<EOF
128 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
129 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
130 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
131 f6519085c2fc5f7bc4eccc294ed62000  /usr/sbin/xen-bugtool
132 EOF
133     then
134         printf "\nVerified host scripts from XenServer 5.5.0-24648p (Update 1)\n"
135         printf "or 5.5.0-25727p (Update 2).\n\n"
136     elif md5sum -c --status <<EOF
137 ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
138 02cf136237ed85fcbcc1efc15ce0591c  /opt/xensource/libexec/interface-reconfigure
139 3a192ee70ebf2153c90051b3af95f331  /opt/xensource/libexec/InterfaceReconfigureBridge.py
140 f71cadf1464caefa7943de0ab47fdd8a  /opt/xensource/libexec/InterfaceReconfigure.py
141 d70f08f235fb1bfd49a0580e440f15a0  /opt/xensource/libexec/InterfaceReconfigureVswitch.py
142 f5c85ca825b1e6f5a0845530981cd836  /etc/xensource/scripts/vif
143 facb851606f82ca2bcc760a4d91bbe33  /usr/sbin/xen-bugtool
144 EOF
145     then
146         printf "\nVerified host scripts from XenServer 5.5.900-29381p.\n\n"
147     else
148 cat <<EOF
149
150 The original XenServer scripts replaced by this package are not those
151 of any supported version of XenServer.  This could lead to unexpected
152 behavior of your server.  Unless you are sure you know what you are
153 doing, it is highly recommended that you remove this package
154 immediately after the install completes, which will restore the
155 XenServer scripts that you were previously using.
156
157 EOF
158     fi
159 fi
160
161 # On XenServer 5.5.0, we need refresh-network-uuids to run whenever
162 # XAPI starts or restarts.  (On XenServer 5.6.0, XAPI calls the
163 # "update" method of the vswitch-cfg-update plugin whenever it starts
164 # or restarts, so this is no longer necessary.)
165 if test "$PRODUCT_VERSION" = "5.5.0"; then
166     RNU=/usr/share/openvswitch/scripts/refresh-network-uuids
167     XSS=/opt/xensource/libexec/xapi-startup-script
168     if test -e $XSS && (test ! -L $XSS || test "`readlink $XSS`" != $RNU); then
169         echo "$XSS is already in use, refusing to overwrite"
170         exit 1
171     fi
172     rm -f $XSS
173     ln -s $RNU $XSS
174
175     # If /etc/xensource/network.conf doesn't exist (it was added in 5.6.0),
176     # then interface-reconfigure will be unhappy when we run it below.
177     if test ! -e /etc/xensource/network.conf; then
178         echo bridge > /etc/xensource/network.conf
179     fi
180 fi
181
182
183 if test ! -e /var/xapi/network.dbcache; then
184     if test "$1" = 1; then
185         printf "Creating xapi database cache...  "
186     else
187         printf "warning: Open vSwitch is being re-installed or upgraded,\n"
188         printf "         but the xapi database cache is missing.\n"
189         printf "Re-creating xapi database cache...  "
190     fi
191
192     if /usr/share/openvswitch/scripts/interface-reconfigure rewrite; then
193         printf "done.\n"
194     else
195         printf "FAILED\n"
196         printf "Open vSwitch can only be installed on a XenServer that\n"
197         printf "has connectivity to xapi on the pool master.  Please\n"
198         printf "fix connectivity to the pool master, then try again.\n"
199         exit 1
200     fi
201 fi
202
203 # Ensure that modprobe will find our modules.
204 depmod %{xen_version}
205
206 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
207     cat >>/etc/sysctl.conf <<EOF
208 # This works around an issue in xhad, which binds to a particular
209 # Ethernet device, which in turn causes ICMP port unreachable messages
210 # if packets are received are on the wrong interface, which in turn
211 # can happen if we send out ARP replies on every interface (as Linux
212 # does by default) instead of just on the interface that has the IP
213 # address being ARPed for, which this sysctl setting in turn works
214 # around.
215 #
216 # Bug #1378.
217 net.ipv4.conf.all.arp_filter = 1
218 EOF
219 fi
220
221 if test ! -e /etc/openvswitch/conf.db; then
222     install -d -m 755 -o root -g root /etc/openvswitch
223
224     # Create ovs-vswitchd config database
225     ovsdb-tool -vANY:console:emer create /etc/openvswitch/conf.db \
226             /usr/share/openvswitch/vswitch.ovsschema
227
228     # Create initial table in config database
229     ovsdb-tool -vANY:console:emer transact /etc/openvswitch/conf.db \
230             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
231             > /dev/null
232 fi
233
234 # Create default or update existing /etc/sysconfig/openvswitch.
235 SYSCONFIG=/etc/sysconfig/openvswitch
236 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
237 if [ ! -e $SYSCONFIG ]; then
238     cp $TEMPLATE $SYSCONFIG
239 else
240     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
241     do
242         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
243             echo >> $SYSCONFIG
244             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
245         fi
246     done
247 fi
248
249 # Replace XenServer files by our versions.
250 mkdir -p /usr/lib/openvswitch/xs-original \
251     || printf "Could not create script backup directory.\n"
252 for f in \
253     /opt/xensource/libexec/interface-reconfigure \
254     /opt/xensource/libexec/InterfaceReconfigure.py \
255     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
256     /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
257     /etc/xensource/scripts/vif \
258     /usr/sbin/xen-bugtool \
259     /usr/sbin/brctl
260 do
261     s=$(basename "$f")
262     t=$(readlink "$f")
263     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
264         mv "$f" /usr/lib/openvswitch/xs-original/ \
265             || printf "Could not save original XenServer $s script\n"
266         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
267             || printf "Could not link to Open vSwitch $s script\n"
268     fi
269 done
270
271 # Ensure all required services are set to run
272 for s in openvswitch openvswitch-xapi-update; do
273     if chkconfig --list $s >/dev/null 2>&1; then
274         chkconfig --del $s || printf "Could not remove $s init script."
275     fi
276     chkconfig --add $s || printf "Could not add $s init script."
277     chkconfig $s on || printf "Could not enable $s init script."
278 done
279
280 # Configure system to use Open vSwitch
281 echo vswitch > /etc/xensource/network.conf
282
283 if [ "$1" = "1" ]; then    # $1 = 2 for upgrade
284     printf "\nYou MUST reboot the server NOW to complete the change to\n"
285     printf "Open vSwitch.  Attempts to modify networking on the server\n"
286     printf "or any hosted VM will fail until after the reboot and could\n"
287     printf "leave the server in an state requiring manual recovery.\n\n"
288 else
289     printf "\nTo use the new Open vSwitch install, you should reboot the\n" 
290     printf "server now.  Failure to do so may result in incorrect operation."
291     printf "\n\n"
292 fi
293
294 %preun
295 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
296     for s in openvswitch openvswitch-xapi-update; do
297         chkconfig --del $s || printf "Could not remove $s init script."
298     done
299 fi
300
301
302 %postun
303 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
304     . /etc/xensource-inventory
305     if test "$PRODUCT_VERSION" = "5.5.0"; then
306         XSS=/opt/xensource/libexec/xapi-startup-script
307         rm -f $XSS
308     fi
309
310     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
311         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
312
313     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
314         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
315         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
316         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
317         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
318         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo 
319
320     # Restore original XenServer scripts
321     for f in \
322         /opt/xensource/libexec/interface-reconfigure \
323         /opt/xensource/libexec/InterfaceReconfigure.py \
324         /opt/xensource/libexec/InterfaceReconfigureBridge.py \
325         /opt/xensource/libexec/InterfaceReconfigureVswitch.py \
326         /etc/xensource/scripts/vif \
327         /usr/sbin/xen-bugtool \
328         /usr/sbin/brctl
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/refresh-network-uuids
394 /usr/share/openvswitch/scripts/interface-reconfigure
395 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
396 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
397 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
398 /usr/share/openvswitch/scripts/vif
399 /usr/share/openvswitch/scripts/xen-bugtool
400 /usr/share/openvswitch/scripts/brctl
401 /usr/share/openvswitch/scripts/sysconfig.template
402 /usr/share/openvswitch/vswitch.ovsschema
403 /usr/sbin/ovs-brcompatd
404 /usr/sbin/ovs-vswitchd
405 /usr/sbin/ovsdb-server
406 /usr/bin/ovs-appctl
407 /usr/bin/ovs-dpctl
408 /usr/bin/ovs-ofctl
409 /usr/bin/ovs-vsctl
410 /usr/bin/ovsdb-client
411 /usr/bin/ovsdb-tool
412 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
413 /usr/share/man/man1/ovsdb-client.1.gz
414 /usr/share/man/man1/ovsdb-server.1.gz
415 /usr/share/man/man1/ovsdb-tool.1.gz
416 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
417 /usr/share/man/man8/ovs-appctl.8.gz
418 /usr/share/man/man8/ovs-brcompatd.8.gz
419 /usr/share/man/man8/ovs-dpctl.8.gz
420 /usr/share/man/man8/ovs-ofctl.8.gz
421 /usr/share/man/man8/ovs-parse-leaks.8.gz
422 /usr/share/man/man8/ovs-vsctl.8.gz
423 /usr/share/man/man8/ovs-vswitchd.8.gz
424 /var/lib/openvswitch
425 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
426 %exclude /usr/share/openvswitch/scripts/*.py[co]
427 %exclude /usr/share/openvswitch/python/*.py[co]
428 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
429 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]