From: Alexandru Avadanii Date: Sun, 26 Jun 2016 20:17:59 +0200 Subject: [PATCH] build, install, pre_build_hook: Prepare multiarch install.sh: Factor out dpkg arch into var, read it from dpkg. install.sh: Relax DPDK/OVS/OVS-DPDK version hardcodes Instead of putting all debs in one archive, and possibly wasting bandwidth / space with unused foreign packages, split plugin archive(s) into arch-specific archives, with <_${arch}> suffix. E.g. for becomes Since only one (DPDK/OVS/OVS-DPDK) set of packages is shipped per archive, we can safely wildcard the installed version of libdpdk, which previously hardcoded 2.2.0 and 16.04 for NSH/non-NSH. This is helpful for arm64, which has a custom deb subversion for DPDK16.07 and also requires DPDK16.07 for OVS-DPDK-NSH, instead of 2.2.0. Pass UBUNTU_ARCH from pre_build_hook and make install.sh more arch-independant. CHANGE: UBUNTU_ARCH specifies the complete list of supported architectures of the resulting RPM, in `dpkg --print-architecture` format. e.g. UBUNTU_ARCH='arm64 amd64' will result in x86 + AArch64 support Change-Id: I04ac0a78319b460270545708efc4b53f02f7dd05 Signed-off-by: Alexandru Avadanii --- deployment_scripts/install.sh | 51 +++++++++++----------- ovs_build/build-ovs-dpdk.sh | 64 ++++++++++++++++------------ ovs_build/build-ovs-nsh-dpdk.sh | 93 ++++++++++++++++++++++++----------------- pre_build_hook | 24 +++++++---- 4 files changed, 136 insertions(+), 96 deletions(-) diff --git a/deployment_scripts/install.sh b/deployment_scripts/install.sh index efbed72..46d74bb 100644 --- a/deployment_scripts/install.sh +++ b/deployment_scripts/install.sh @@ -9,34 +9,33 @@ host=$1 nsh=$2 dpdk=$3 dpdk_socket_mem=${4:-''} +arch=$(dpkg --print-architecture) +ovs="ovs-dpdk_${arch}.tar.gz" -if [ $nsh = 'true' ] -then - curl http://$host:8080/plugins/fuel-plugin-ovs-0.9/repositories/ubuntu/ovs-nsh-dpdk.tar.gz | tar -xzv - dpkg -i openvswitch-datapath-dkms_2.5.90-1.nsh_all.deb - dpkg -i openvswitch-common_2.5.90-1.nsh_amd64.deb - dpkg -i openvswitch-switch_2.5.90-1.nsh_amd64.deb - dpkg -i python-openvswitch_2.5.90-1.nsh_all.deb - if [ $dpdk = 'true' ] - then +if [ $nsh = 'true' ]; then + ovs="ovs-nsh-dpdk_${arch}.tar.gz" +fi + +curl http://$host:8080/plugins/fuel-plugin-ovs-0.9/repositories/ubuntu/${ovs} | tar -xzv +dpkg -i openvswitch-datapath-dkms_*.deb +dpkg -i openvswitch-common_*.deb +dpkg -i openvswitch-switch_*.deb +dpkg -i python-openvswitch_*.deb +if [ $dpdk = 'true' ]; then + if [ $nsh = 'true' -o -n $dpdk_socket_mem ]; then dpkg -i libxenstore3.0*.deb - dpkg -i libdpdk0_2.2.0-1_amd64.deb - dpkg -i dpdk_2.2.0-1_amd64.deb - dpkg -i openvswitch-switch-dpdk_2.5.90-1.nsh_amd64.deb + if [ $arch = 'arm64' ]; then + # FIXME(armband): arm64 DPDK ships individual libs, install them all + dpdk_deb_name=$(ls dpdk_*) + dpdk_deb_suffix=${dpdk_deb_name#dpdk_} + dpkg -i *${dpdk_deb_suffix%_*}*.deb + else + dpkg -i libdpdk0_*.deb + dpkg -i dpdk_*.deb + fi + dpkg -i openvswitch-switch-dpdk_*.deb fi -else - curl http://$host:8080/plugins/fuel-plugin-ovs-0.9/repositories/ubuntu/ovs-dpdk.tar.gz | tar -xzv - dpkg -i openvswitch-datapath-dkms_2.5.90-1_all.deb - dpkg -i openvswitch-common_2.5.90-1_amd64.deb - dpkg -i openvswitch-switch_2.5.90-1_amd64.deb - dpkg -i python-openvswitch_2.5.90-1_all.deb - if [[ $dpdk = 'true' && -n $dpdk_socket_mem ]] - then - dpkg -i libxenstore3.0*.deb - dpkg -i libdpdk0_16.07-1_amd64.deb - dpkg -i dpdk_16.07-1_amd64.deb - dpkg -i openvswitch-switch-dpdk_2.5.90-1_amd64.deb - + if ! [ $nsh = 'true' -a -n $dpdk_socket_mem ]; then #Set to 0, dpdk init script mount hugepages but don't change current allocation sed -i "s/[# ]*\(NR_2M_PAGES=\).*/\10/" /etc/dpdk/dpdk.conf service dpdk start @@ -47,3 +46,5 @@ else service openvswitch-switch restart fi fi + +rm -rf $INSTALL_HOME diff --git a/ovs_build/build-ovs-dpdk.sh b/ovs_build/build-ovs-dpdk.sh index dd9c6ff..a14f5fd 100755 --- a/ovs_build/build-ovs-dpdk.sh +++ b/ovs_build/build-ovs-dpdk.sh @@ -10,18 +10,27 @@ BUILD_DEST=${BUILD_DEST:-/tmp/ovs-dpdk} export DEB_BUILD_OPTIONS='parallel=8 nocheck' -sudo apt-get -y --force-yes install devscripts dpkg-dev wget +# Keep track of native arch (BUILD_ARCH) and target arch(s) (UBUNTU_ARCH) +# All archs should be represented in `dpkg --print-architecture` format +# UBUNTU_ARCH holds a space-separated list of target arch(s) +# FIXME(armband): For now, only native building is supported! +BUILD_ARCH=$(dpkg --print-architecture) +UBUNTU_ARCH=${UBUNTU_ARCH:-${BUILD_ARCH}} -rm -rf ${BUILD_DEST}; mkdir -p ${BUILD_DEST} +# Build and/or fetch precompiled packages for all arch(s) in UBUNTU_ARCH +for ARCH in ${UBUNTU_ARCH}; do + rm -rf ${BUILD_DEST}; mkdir -p ${BUILD_DEST}; cd ${BUILD_DEST} + if [ ${ARCH} = ${BUILD_ARCH} ]; then + # Native building for: DPDK, OVS-DPDK, OVS + sudo apt-get -y --force-yes install devscripts dpkg-dev wget -cd ${BUILD_DEST} -wget -c http://fast.dpdk.org/rel/dpdk-16.07.tar.xz -xz -d dpdk-16.07.tar.xz; tar xvf dpdk-16.07.tar -cd dpdk-16.07 -cp -r ${BUILD_SRC}/dpdk_16.07/debian . + wget -c http://fast.dpdk.org/rel/dpdk-16.07.tar.xz + xz -d dpdk-16.07.tar.xz; tar xvf dpdk-16.07.tar + cd dpdk-16.07 + cp -r ${BUILD_SRC}/dpdk_16.07/debian . -# copy from debian/control -sudo apt-get install -y --force-yes debhelper \ + # DPDK build-dep install: copy from debian/control + sudo apt-get install -y --force-yes debhelper \ dh-python \ dh-systemd \ doxygen \ @@ -35,15 +44,15 @@ sudo apt-get install -y --force-yes debhelper \ python-sphinx \ texlive-fonts-recommended \ texlive-latex-extra -debian/rules build; fakeroot debian/rules binary + debian/rules build; fakeroot debian/rules binary -cd ${BUILD_DEST} -sudo dpkg -i *.deb -apt-get download libxenstore3.0 + cd ${BUILD_DEST} + sudo dpkg -i *.deb + apt-get download libxenstore3.0 -sudo apt-get build-dep openvswitch -y --force-yes -# copy from debian/control -sudo apt-get install -y --force-yes autoconf \ + sudo apt-get build-dep openvswitch -y --force-yes + # OVS-DPDK build-dep install: copy from debian/control + sudo apt-get install -y --force-yes autoconf \ automake \ bzip2 \ debhelper \ @@ -62,16 +71,19 @@ sudo apt-get install -y --force-yes autoconf \ python-zopeinterface \ python-six -wget -c ${URL_OVS_ARCHIVE}/${OVS_COMMIT}.tar.gz -tar xzf ${OVS_COMMIT}.tar.gz; mv ovs-${OVS_COMMIT} ovs -cp -r ovs ovs-dpdk + wget -c ${URL_OVS_ARCHIVE}/${OVS_COMMIT}.tar.gz + tar xzf ${OVS_COMMIT}.tar.gz; mv ovs-${OVS_COMMIT} ovs + cp -r ovs ovs-dpdk -cd ovs-dpdk -cp -r ${BUILD_SRC}/openvswitch-dpdk_2.5.90/debian . -debian/rules build; fakeroot debian/rules binary + cd ovs-dpdk + cp -r ${BUILD_SRC}/openvswitch-dpdk_2.5.90/debian . + debian/rules build; fakeroot debian/rules binary -cd ${BUILD_DEST}/ovs -debian/rules build; fakeroot debian/rules binary + cd ${BUILD_DEST}/ovs + debian/rules build; fakeroot debian/rules binary + fi -cp -r ${BUILD_DEST}/*.deb ${BUILD_DEB} -rm -rf ${BUILD_DEST} + # Store DEBs in <${BUILD_DEB}/${ARCH}/> dir and cleanup + rm -rf ${BUILD_DEB}/${ARCH}; mkdir -p ${BUILD_DEB}/${ARCH}; cd ${BUILD_DEB}/${ARCH} + cp ${BUILD_DEST}/*.deb .; rm -rf ${BUILD_DEST} +done diff --git a/ovs_build/build-ovs-nsh-dpdk.sh b/ovs_build/build-ovs-nsh-dpdk.sh index 3751c02..a65a2bb 100755 --- a/ovs_build/build-ovs-nsh-dpdk.sh +++ b/ovs_build/build-ovs-nsh-dpdk.sh @@ -11,16 +11,24 @@ DIR="$(dirname `readlink -f $0`)" export DEB_BUILD_OPTIONS='parallel=8 nocheck' -sudo apt-get build-dep openvswitch -y --force-yes -sudo apt-get -y --force-yes install devscripts dpkg-dev wget +# Keep track of native arch (BUILD_ARCH) and target arch(s) (UBUNTU_ARCH) +# All archs should be represented in `dpkg --print-architecture` format +# UBUNTU_ARCH holds a space-separated list of target arch(s) +# FIXME(armband): For now, only native building is supported! +BUILD_ARCH=$(dpkg --print-architecture) +UBUNTU_ARCH=${UBUNTU_ARCH:-${BUILD_ARCH}} -rm -rf ${BUILD_HOME}; mkdir -p ${BUILD_HOME} +# Build and/or fetch precompiled packages for all arch(s) in UBUNTU_ARCH +for ARCH in ${UBUNTU_ARCH}; do + rm -rf ${BUILD_HOME}; mkdir -p ${BUILD_HOME}; cd ${BUILD_HOME} + if [ ${ARCH} = ${BUILD_ARCH} ]; then + # Native building for: DPDK, OVS-DPDK, OVS + sudo apt-get build-dep openvswitch -y --force-yes + sudo apt-get -y --force-yes install devscripts dpkg-dev wget + dget -x -u https://launchpad.net/ubuntu/+archive/primary/+files/dpdk_2.2.0-0ubuntu8.dsc -cd ${BUILD_HOME} -dget -x -u https://launchpad.net/ubuntu/+archive/primary/+files/dpdk_2.2.0-0ubuntu8.dsc - -# copy from debian/control -sudo apt-get install -y --force-yes debhelper \ + # DPDK build-dep install: copy from debian/control + sudo apt-get install -y --force-yes debhelper \ dh-python \ dh-systemd \ doxygen \ @@ -35,21 +43,22 @@ sudo apt-get install -y --force-yes debhelper \ texlive-fonts-recommended \ texlive-latex-extra -cd dpdk-2.2.0; rm -rf debian/patches/ -cat << EOF > debian/changelog + cd dpdk-2.2.0; rm -rf debian/patches/ + cat << EOF > debian/changelog dpdk (2.2.0-1) unstable; urgency=low * DPDK 2.2.0 -- DPDK team $(date --rfc-2822) EOF -debian/rules build; fakeroot debian/rules binary -cd ${BUILD_HOME}; sudo dpkg -i *.deb -apt-get download libxenstore3.0 + # DPDK build & install (required for following native build of OVS-NSH) + debian/rules build; fakeroot debian/rules binary + cd ${BUILD_HOME}; sudo dpkg -i *.deb + apt-get download libxenstore3.0 -cd ${BUILD_HOME} -dget -x -u https://launchpad.net/ubuntu/+archive/primary/+files/openvswitch-dpdk_2.4.0-0ubuntu1.dsc + cd ${BUILD_HOME} + dget -x -u https://launchpad.net/ubuntu/+archive/primary/+files/openvswitch-dpdk_2.4.0-0ubuntu1.dsc -# copy from debian/control -sudo apt-get install -y --force-yes autoconf \ + # OVS-NSH build-dep install: copy from debian/control + sudo apt-get install -y --force-yes autoconf \ automake \ bzip2 \ debhelper \ @@ -68,33 +77,41 @@ sudo apt-get install -y --force-yes autoconf \ python-zopeinterface \ python-six -wget -c ${URL_OVS_ARCHIVE}/${OVS_COMMIT}.tar.gz -tar xzf ${OVS_COMMIT}.tar.gz; mv ovs-${OVS_COMMIT} ovs -PATCHES=$(cd ${DIR}/patches; echo *patch) -for patch in ${PATCHES} -do - patch -p1 < ${DIR}/patches/${patch} -done -cd ${BUILD_HOME}; tar czvf ovs.tar.gz ovs -rm -rf openvswitch-dpdk-${OVS_VER}* -cd openvswitch-dpdk-2.4.0; uupdate -v ${OVS_VER} ../ovs.tar.gz -cd ../openvswitch-dpdk-${OVS_VER} -sed -i "s/include\/rte_config.h/include\/dpdk\/rte_config.h/" acinclude.m4 -sed -i 's/DPDK_INCLUDE=.*/DPDK_INCLUDE=$RTE_SDK\/include\/dpdk/' acinclude.m4 -autoreconf --install -rm -rf debian/patches/ -cat << EOF > debian/changelog + # OVS-NSH build preparations: download sources, patch if needed + wget -c ${URL_OVS_ARCHIVE}/${OVS_COMMIT}.tar.gz + tar xzf ${OVS_COMMIT}.tar.gz; mv ovs-${OVS_COMMIT} ovs; cd ovs + + # Apply OVS-NSH patches, create a new orig tar archive + PATCHES=$(cd ${DIR}/patches; echo *patch) + for patch in ${PATCHES} + do + patch -p1 < ${DIR}/patches/${patch} + done + cd ${BUILD_HOME}; tar czvf ovs.tar.gz ovs + rm -rf openvswitch-dpdk-${OVS_VER}* + cd openvswitch-dpdk-2.4.0; uupdate -v ${OVS_VER} ../ovs.tar.gz + cd ../openvswitch-dpdk-${OVS_VER} + sed -i "s/include\/rte_config.h/include\/dpdk\/rte_config.h/" acinclude.m4 + sed -i 's/DPDK_INCLUDE=.*/DPDK_INCLUDE=$RTE_SDK\/include\/dpdk/' acinclude.m4 + autoreconf --install + rm -rf debian/patches/ + cat << EOF > debian/changelog openvswitch-dpdk (${OVS_VER}-1.nsh) unstable; urgency=low * Support NSH -- Open vSwitch team $(date --rfc-2822) EOF -debian/rules build; fakeroot debian/rules binary + debian/rules build; fakeroot debian/rules binary -cd ${BUILD_HOME}/ovs -cat << EOF > debian/changelog + cd ${BUILD_HOME}/ovs + cat << EOF > debian/changelog openvswitch (${OVS_VER}-1.nsh) unstable; urgency=low * Support NSH -- Open vSwitch team $(date --rfc-2822) EOF -debian/rules build; fakeroot debian/rules binary -cp ${BUILD_HOME}/*.deb ${BUILD_DEST} + debian/rules build; fakeroot debian/rules binary + fi + + # Store DEBs in <${BUILD_DEST}/${ARCH}/> dir and cleanup + rm -rf ${BUILD_DEST}/${ARCH}; mkdir -p ${BUILD_DEST}/${ARCH}; cd ${BUILD_DEST}/${ARCH} + cp ${BUILD_HOME}/*.deb . +done diff --git a/pre_build_hook b/pre_build_hook index b9ae6bb..3e46a37 100755 --- a/pre_build_hook +++ b/pre_build_hook @@ -10,6 +10,11 @@ if [ `uname -m` = 'aarch64' ]; then USE_DOCKER=false fi +# Pass target arch(s) (UBUNTU_ARCH) to build scripts. +# All archs should be represented in `dpkg --print-architecture` format +# UBUNTU_ARCH holds a space-separated list of target arch(s) +export UBUNTU_ARCH=${UBUNTU_ARCH:-$(dpkg --print-architecture)} + function build_pkg { case $1 in ubuntu) @@ -23,8 +28,10 @@ function build_pkg { cd ${DIR}/ovs_build if [ "${USE_DOCKER}" = true ]; then sudo docker build -t ovs_build . - sudo docker run -v ${DEB_DIR}:/deb -t ovs_build /ovs_build/build-ovs-dpdk.sh - sudo docker run -v ${DEB_DIR_NSH}:/deb -t ovs_build /ovs_build/build-ovs-nsh-dpdk.sh + sudo docker run -e "UBUNTU_ARCH=${UBUNTU_ARCH}" -v ${DEB_DIR}:/deb \ + -t ovs_build /ovs_build/build-ovs-dpdk.sh + sudo docker run -e "UBUNTU_ARCH=${UBUNTU_ARCH}" -v ${DEB_DIR_NSH}:/deb \ + -t ovs_build /ovs_build/build-ovs-nsh-dpdk.sh else rm -rf /tmp/ovs-build-{,nsh-}dpdk; mkdir -p /tmp/ovs-build-{,nsh-}dpdk BUILD_HOME=/tmp/ovs-build-dpdk BUILD_DEB=${DEB_DIR} ./build-ovs-dpdk.sh @@ -32,11 +39,14 @@ function build_pkg { rm -rf /tmp/ovs-build-{,nsh-}dpdk fi - cd ${DEB_DIR}; tar czvf ../repositories/ubuntu/ovs-dpdk.tar.gz .; - cd ..; rm -rf ${DEB_DIR} - - cd ${DEB_DIR_NSH}; tar czvf ../repositories/ubuntu/ovs-nsh-dpdk.tar.gz .; - cd ..; rm -rf ${DEB_DIR_NSH} + # Gather packages for each arch(s) in UBUNTU_ARCH in a separate archive + for ARCH in ${UBUNTU_ARCH}; do + cd ${DEB_DIR}/${ARCH} + tar czvf ../../repositories/ubuntu/ovs-dpdk_${ARCH}.tar.gz . + cd ${DEB_DIR_NSH}/${ARCH} + tar czvf ../../repositories/ubuntu/ovs-nsh-dpdk_${ARCH}.tar.gz . + done + cd ${DIR}; sudo rm -rf ${DEB_DIR} ${DEB_DIR_NSH} ;; *) echo "Not supported system"; exit 1;;