1 # Spec file for vswitch and related programs.
3 # Copyright (C) 2009 Nicira Networks, Inc.
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.
10 # When building, the rpmbuild command line should define
11 # vswitch_version, xen_version, and build_number using -D arguments.
14 # rpmbuild -D "vswitch_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/vswitch-xen.spec
16 %define version %{vswitch_version}-%{xen_version}
17 %define _prefix /root/vswitch
20 Summary: Virtual switch
21 Group: System Environment/Daemons
22 URL: http://www.openvswitch.org/
23 Version: %{vswitch_version}
25 # The entire source code is ASL 2.0 except datapath/ which is GPLv2
26 License: ASL 2.0 and GPLv2
28 Source: openvswitch-%{vswitch_version}.tar.gz
29 Buildroot: /tmp/vswitch-xen-rpm
30 Requires: kernel-xen = %(echo '%{xen_version}' | sed 's/xen$//')
33 The vswitch provides standard network bridging functions augmented with
34 support for the OpenFlow protocol for remote per-flow control of
38 %setup -q -n openvswitch-%{vswitch_version}
41 ./configure --prefix=%{_prefix} --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
45 rm -rf $RPM_BUILD_ROOT
46 make install DESTDIR=$RPM_BUILD_ROOT prefix=%{_prefix}
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_vswitch \
50 $RPM_BUILD_ROOT/etc/init.d/vswitch
51 install -m 755 xenserver/etc_init.d_vswitch-xapi-update \
52 $RPM_BUILD_ROOT/etc/init.d/vswitch-xapi-update
53 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
54 install -m 755 xenserver/etc_sysconfig_vswitch.example \
55 $RPM_BUILD_ROOT/etc/sysconfig/vswitch.example
56 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
57 install -m 755 xenserver/etc_logrotate.d_vswitch \
58 $RPM_BUILD_ROOT/etc/logrotate.d/vswitch
59 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
60 install -m 755 xenserver/etc_profile.d_vswitch.sh \
61 $RPM_BUILD_ROOT/etc/profile.d/vswitch.sh
62 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
63 install -m 755 xenserver/etc_xapi.d_plugins_vswitch-cfg-update \
64 $RPM_BUILD_ROOT/etc/xapi.d/plugins/vswitch-cfg-update
65 install -d -m 755 $RPM_BUILD_ROOT%{_prefix}/scripts
66 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
67 $RPM_BUILD_ROOT%{_prefix}/scripts/interface-reconfigure
68 install -m 755 xenserver/etc_xensource_scripts_vif \
69 $RPM_BUILD_ROOT%{_prefix}/scripts/vif
70 install -m 755 xenserver/root_vswitch_scripts_dump-vif-details \
71 $RPM_BUILD_ROOT%{_prefix}/scripts/dump-vif-details
72 install -m 755 xenserver/usr_sbin_xen-bugtool \
73 $RPM_BUILD_ROOT%{_prefix}/scripts/xen-bugtool
75 xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
76 $RPM_BUILD_ROOT%{_prefix}/scripts/XSFeatureVSwitch.py
78 install -d -m 755 $RPM_BUILD_ROOT%{_prefix}/kernel_modules
79 find datapath/linux-2.6 -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT%{_prefix}/kernel_modules/ \;
81 # Get rid of stuff we don't want to make RPM happy.
83 $RPM_BUILD_ROOT/root/vswitch/bin/ezio-term \
84 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-controller \
85 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-discover \
86 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-kill \
87 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-pki \
88 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-switchui \
89 $RPM_BUILD_ROOT/root/vswitch/bin/ovs-wdt \
90 $RPM_BUILD_ROOT/root/vswitch/bin/secchan \
91 $RPM_BUILD_ROOT/root/vswitch/sbin/ovs-monitor \
92 $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-controller.8 \
93 $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-discover.8 \
94 $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-kill.8 \
95 $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-pki.8 \
96 $RPM_BUILD_ROOT/root/vswitch/share/man/man8/secchan.8 \
97 $RPM_BUILD_ROOT/root/vswitch/share/openvswitch
100 rm -rf $RPM_BUILD_ROOT
103 if [ ! -f /etc/xensource-inventory ]; then
104 printf "XenSource inventory not present in /etc/xensource-inventory"
108 if [ "$1" = "1" ]; then
109 if ! md5sum -c --status <<EOF
110 b8e9835862ef1a9cec2a3f477d26c989 /etc/xensource/scripts/vif
111 51970ad613a3996d5997e18e44db47da /opt/xensource/libexec/interface-reconfigure
112 5654c8c36699fcc8744ca9cd5b855414 /usr/sbin/xen-bugtool
115 printf "\nThe original XenServer scripts replaced by this package\n"
116 printf "are different than expected. This could lead to unexpected\n"
117 printf "behavior of your server. Unless you are sure you know what\n"
118 printf "you are doing, it is highly recomended that you remove this\n"
119 printf "package immediately after the install completes, which\n"
120 printf "will restore the XenServer scripts that you were previously\n"
125 if test ! -e /etc/ovs-vswitch.dbcache; then
126 if test "$1" = 1; then
127 printf "Creating xapi database cache... "
129 printf "warning: Open vSwitch is being re-installed or upgraded,\n"
130 printf " but the xapi database cache is missing.\n"
131 printf "Re-creating xapi database cache... "
134 source /etc/xensource-inventory
135 if python - "$INSTALLATION_UUID" <<EOF
140 session = XenAPI.xapi_local()
142 session.xenapi.login_with_password("root", "")
144 vlans = session.xenapi.VLAN.get_all_records()
145 bonds = session.xenapi.Bond.get_all_records()
146 pifs = session.xenapi.PIF.get_all_records()
147 networks = session.xenapi.network.get_all_records()
148 host = session.xenapi.host.get_by_uuid(sys.argv[1])
150 session.xenapi.session.logout()
152 dbcache_file = "/etc/ovs-vswitch.dbcache"
153 f = open(dbcache_file, 'w')
154 pickle.dump({'vlans': vlans,
157 'networks': networks}, f)
158 pickle.dump({'host': host}, f)
165 printf "Open vSwitch can only be installed on a XenServer that\n"
166 printf "has connectivity to xapi on the pool master. Please\n"
167 printf "fix connectivity to the pool master, then try again.\n"
173 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
174 cat >>/etc/sysctl.conf <<EOF
175 # This works around an issue in xhad, which binds to a particular
176 # Ethernet device, which in turn causes ICMP port unreachable messages
177 # if packets are received are on the wrong interface, which in turn
178 # can happen if we send out ARP replies on every interface (as Linux
179 # does by default) instead of just on the interface that has the IP
180 # address being ARPed for, which this sysctl setting in turn works
184 net.ipv4.conf.all.arp_filter = 1
188 # Ensure ovs-vswitchd.conf exists
189 touch /etc/ovs-vswitchd.conf
191 # Replace original XenServer files
192 mkdir -p %{_prefix}/xs-original \
193 || printf "Could not create script backup directory.\n"
195 /opt/xensource/libexec/interface-reconfigure \
196 /etc/xensource/scripts/vif \
197 /usr/sbin/xen-bugtool
201 if [ "$t" != "%{_prefix}/scripts/$s" ]; then
202 mv "$f" %{_prefix}/xs-original/ \
203 || printf "Could not save original XenServer $s script\n"
204 ln -s "%{_prefix}/scripts/$s" "$f" \
205 || printf "Could not link to vSwitch $s script\n"
209 # Install xsconsole plugin
210 plugin=$(readlink /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py)
211 if [ "$plugin" != "/root/vswitch/scripts/XSFeatureVSwitch.py" ]; then
212 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
213 ln -s /root/vswitch/scripts/XSFeatureVSwitch.py /usr/lib/xsconsole/plugins-base/ || printf "Could not link to vSswitch xsconsole plugin.\n"
216 # Ensure all required services are set to run
217 for s in vswitch vswitch-xapi-update; do
218 if chkconfig --list $s >/dev/null 2>&1; then
219 chkconfig --del $s || printf "Could not remove $s init script."
221 chkconfig --add $s || printf "Could not add $s init script."
222 chkconfig $s on || printf "Could not enable $s init script."
225 if [ "$1" = "1" ]; then # $1 = 2 for upgrade
226 printf "\nYou MUST reboot the server NOW to complete the change to the\n"
227 printf "the vSwitch. Attempts to modify networking on the server\n"
228 printf "or any hosted VM will fail until after the reboot and could\n"
229 printf "leave the server in an state requiring manual recovery.\n\n"
231 printf "\nTo use the new vSwitch, you should reboot the server\n"
232 printf "now. Failure to do so may result in incorrect operation.\n\n"
236 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
237 for s in vswitch vswitch-xapi-update; do
238 chkconfig --del $s || printf "Could not remove $s init script."
244 if [ "$1" = "0" ]; then # $1 = 1 for upgrade
246 rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py \
247 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
248 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo \
249 || printf "Could not remove vSwitch xsconsole plugin.\n"
251 # Restore original XenServer scripts
253 /opt/xensource/libexec/interface-reconfigure \
254 /etc/xensource/scripts/vif \
255 /usr/sbin/xen-bugtool
258 if [ ! -f "%{_prefix}/xs-original/$s" ]; then
259 printf "Original XenServer $s script not present in %{_prefix}/xs-original\n"
260 printf "Could not restore original XenServer script.\n"
263 && mv "%{_prefix}/xs-original/$s" "$f") \
264 || printf "Could not restore original XenServer $s script.\n"
268 find %{_prefix} -type d -depth -exec rmdir \{\} \; \
269 || printf "Could not remove vSwitch install directory.\n"
271 # Remove all configuration and log files
272 rm -f /etc/ovs-vswitchd.conf
273 rm -f /etc/sysconfig/vswitch
274 rm -f /var/log/vswitch*
275 rm -f /etc/ovs-vswitchd.cacert
277 printf "\nYou MUST reboot the server now to complete the change to\n"
278 printf "standard Xen networking. Attempts to modify networking on the\n"
279 printf "server or any hosted VM will fail until after the reboot and\n"
280 printf "could leave the server in a state requiring manual recovery.\n\n"
285 %defattr(-,root,root)
287 /etc/init.d/vswitch-xapi-update
288 /etc/xapi.d/plugins/vswitch-cfg-update
289 /etc/sysconfig/vswitch.example
290 /etc/logrotate.d/vswitch
291 /etc/profile.d/vswitch.sh
292 /root/vswitch/kernel_modules/brcompat_mod.ko
293 /root/vswitch/kernel_modules/openvswitch_mod.ko
294 /root/vswitch/kernel_modules/veth_mod.ko
295 /root/vswitch/scripts/dump-vif-details
296 /root/vswitch/scripts/interface-reconfigure
297 /root/vswitch/scripts/vif
298 /root/vswitch/scripts/xen-bugtool
299 /root/vswitch/scripts/XSFeatureVSwitch.py
300 # Following two files are generated automatically by rpm. We don't
301 # really need them and they won't be used on the XenServer, but there
302 # isn't an obvious place to get rid of them since they are generated
303 # after the install script runs. Since they are small, we just
305 /root/vswitch/scripts/XSFeatureVSwitch.pyc
306 /root/vswitch/scripts/XSFeatureVSwitch.pyo
307 /root/vswitch/sbin/ovs-brcompatd
308 /root/vswitch/sbin/ovs-vswitchd
309 /root/vswitch/bin/ovs-appctl
310 /root/vswitch/bin/ovs-cfg-mod
311 /root/vswitch/bin/ovs-dpctl
312 /root/vswitch/bin/ovs-ofctl
313 /root/vswitch/share/man/man5/ovs-vswitchd.conf.5
314 /root/vswitch/share/man/man8/ovs-appctl.8
315 /root/vswitch/share/man/man8/ovs-brcompatd.8
316 /root/vswitch/share/man/man8/ovs-cfg-mod.8
317 /root/vswitch/share/man/man8/ovs-dpctl.8
318 /root/vswitch/share/man/man8/ovs-ofctl.8
319 /root/vswitch/share/man/man8/ovs-vswitchd.8