xenserver: Split kernel/userspace into separate RPMs for supplemental packs.
authorAndrew Evans <aevans@nicira.com>
Thu, 17 Feb 2011 06:40:46 +0000 (22:40 -0800)
committerAndrew Evans <aevans@nicira.com>
Sat, 19 Feb 2011 05:55:51 +0000 (21:55 -0800)
XenServer has the concept of a "supplemental pack", which is just a collection
of RPMs rolled into an ISO image for installation as a unit, either during
XenServer installation or later as an update.

The script used to build supplemental packs requires that a single RPM not mix
kernel and userspace components. It also enforces a particular naming scheme
for kernel module RPMs. This commit modifies the OVS RPM spec file to create
separate RPMs in accordance with these conventions.

In an attempt to ensure that the userspace and kernel module packages are both
present and compatible, the kernel package provides a fictitious capability,
openvswitch_mod.ko.0, and the userspace package requires that capability. If a
future change breaks backward compatibility between userspace and kernel, we'll
increment the numeric suffix, preventing mismatched installs.

Reviewed by Ben Pfaff.

INSTALL.XenServer
xenserver/openvswitch-xen.spec

index e7be494..48f8178 100644 (file)
@@ -41,27 +41,30 @@ where:
     appears as the name of a directory in /lib/modules inside the VM.
     It always ends in "xen".
 
-Two RPMs will be output into /usr/src/redhat/RPMS/i386, whose names
-begin with "openvswitch" and "openvswitch-debuginfo".
+Three RPMs will be output into /usr/src/redhat/RPMS/i386, whose names begin
+with "openvswitch", "openvswitch-modules-xen", and "openvswitch-debuginfo".
 
 Installing Open vSwitch for XenServer
 -------------------------------------
 
-To install Open vSwitch on a XenServer host, or to upgrade to a newer
-version, copy the "openvswitch" RPM to that host with "scp", then install
-it with "rpm -U", e.g.:
+To install Open vSwitch on a XenServer host, or to upgrade to a newer version,
+copy the "openvswitch" and "openvswitch-modules-xen" RPMs to that host with
+"scp", then install them with "rpm -U", e.g.:
 
-     scp openvswitch-$VERSION-1.i386.rpm root@<host>:
-(At this point you will have to enter <host>'s root password.) 
+     scp openvswitch-$VERSION-1.i386.rpm \
+         openvswitch-modules-xen-$XEN_KERNEL_VERSION-$VERSION-1.i386.rpm \
+         root@<host>:
+(At this point you will have to enter <host>'s root password.)
      ssh root@<host>
-(At this point you will have to enter <host>'s root password again.) 
-     rpm -U openvswitch-$VERSION-1.i386.rpm
+(At this point you will have to enter <host>'s root password again.)
+     rpm -U openvswitch-$VERSION-1.i386.rpm \
+         openvswitch-modules-xen-$XEN_KERNEL_VERSION-$VERSION-1.i386.rpm
 
-To uninstall Open vSwitch from a XenServer host, remove the package:
+To uninstall Open vSwitch from a XenServer host, remove the packages:
 
      ssh root@<host>
-(At this point you will have to enter <host>'s root password again.) 
-     rpm -e openvswitch
+(At this point you will have to enter <host>'s root password again.)
+     rpm -e openvswitch openvswitch-modules-xen-$XEN_KERNEL_VERSION
 
 After installing or uninstalling Open vSwitch, the XenServer should be
 rebooted as soon as possible.
index a5df6d6..05229de 100644 (file)
 # for example:
 #
 #    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
-#
+
 %define version %{openvswitch_version}-%{xen_version}
 
+# bump this when breaking compatibility with userspace
+%define module_abi_version 0
+
+# extract kernel type (xen or kdump)
+%define binsuffix -%(echo '%{xen_version}' | sed -r 's/^.*[0-9]+//')
+# kernel version string w/o kernel type
+%define kernel_version %(echo '%{xen_version}' | sed -r 's/[a-z]+$//')
+# build-supplemental-pack.sh requires this naming for kernel module packages
+%define module_package modules%{binsuffix}-%{kernel_version}
+
 Name: openvswitch
-Summary: Virtual switch
+Summary: Open vSwitch daemon/database/utilities
 Group: System Environment/Daemons
 URL: http://www.openvswitch.org/
 Vendor: Nicira Networks, Inc.
 Version: %{openvswitch_version}
 
-# The entire source code is ASL 2.0 except datapath/ which is GPLv2
-License: ASL 2.0 and GPLv2
+License: ASL 2.0
 Release: 1
 Source: openvswitch-%{openvswitch_version}.tar.gz
 Buildroot: /tmp/openvswitch-xen-rpm
-Requires: kernel-xen = %(echo '%{xen_version}' | sed 's/xen$//')
+Requires: openvswitch_mod.ko.%{module_abi_version}
 
 %description
 Open vSwitch provides standard network bridging functions augmented with
 support for the OpenFlow protocol for remote per-flow control of
 traffic.
 
+%package %{module_package}
+Summary: Open vSwitch kernel module
+Group: System Environment/Kernel
+License: GPLv2
+Provides: %{name}-modules = %{kernel_version}, openvswitch_mod.ko.%{module_abi_version}
+Requires: kernel%{binsuffix} = %{kernel_version}
+
+%description %{module_package}
+Open vSwitch Linux kernel module compiled against kernel version
+%{xen_version}.
+
 %prep
 %setup -q -n openvswitch-%{openvswitch_version}
 
@@ -135,9 +155,6 @@ if runlevel >/dev/null 2>&1; then
     fi
 fi
 
-# Ensure that modprobe will find our modules.
-depmod %{xen_version}
-
 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
     cat >>/etc/sysctl.conf <<EOF
 # This works around an issue in xhad, which binds to a particular
@@ -245,6 +262,10 @@ else
     printf "\n\n"
 fi
 
+%post %{module_package}
+# Ensure that modprobe will find our modules.
+depmod %{xen_version}
+
 %preun
 if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
     for s in openvswitch openvswitch-xapi-update; do
@@ -252,7 +273,6 @@ if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
     done
 fi
 
-
 %postun
 # Restore original XenServer scripts if the OVS equivalent no longer exists.
 # This works both in the upgrade and erase cases.
@@ -322,7 +342,6 @@ fi
 /etc/xensource/bugtool/network-status/openvswitch.xml
 /etc/logrotate.d/openvswitch
 /etc/profile.d/openvswitch.sh
-/lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
 /usr/share/openvswitch/python/ovs/__init__.py
 /usr/share/openvswitch/python/ovs/daemon.py
 /usr/share/openvswitch/python/ovs/db/__init__.py
@@ -381,7 +400,6 @@ fi
 /usr/share/man/man8/ovs-vsctl.8.gz
 /usr/share/man/man8/ovs-vswitchd.8.gz
 /var/lib/openvswitch
-%exclude /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko
 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
 %exclude /usr/sbin/ovs-brcompatd
 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
@@ -389,3 +407,7 @@ fi
 %exclude /usr/share/openvswitch/python/*.py[co]
 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
+
+%files %{module_package}
+/lib/modules/%{xen_version}/kernel/extra/openvswitch/openvswitch_mod.ko
+%exclude /lib/modules/%{xen_version}/kernel/extra/openvswitch/brcompat_mod.ko