diff options
Diffstat (limited to 'tools/vnf_build.sh')
-rwxr-xr-x | tools/vnf_build.sh | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/tools/vnf_build.sh b/tools/vnf_build.sh new file mode 100755 index 00000000..7c9265db --- /dev/null +++ b/tools/vnf_build.sh @@ -0,0 +1,317 @@ +#! /bin/bash +# +# Copyright (c) 2017 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +cd $(dirname ${BASH_SOURCE[0]})/.. +export VNF_CORE=$PWD +echo "------------------------------------------------------------------------------" +echo " VNF_CORE exported as $VNF_CORE" +echo "------------------------------------------------------------------------------" + +HUGEPGSZ=`cat /proc/meminfo | grep Hugepagesize | cut -d : -f 2 | tr -d ' '` +MODPROBE="/sbin/modprobe" +INSMOD="/sbin/insmod" +DPDK_DOWNLOAD="http://dpdk.org/browse/dpdk/snapshot/dpdk-16.04.zip" +DPDK_DIR=$VNF_CORE/dpdk + +# +# Sets QUIT variable so script will finish. +# +quit() +{ + QUIT=$1 +} + +# Shortcut for quit. +q() +{ + quit +} + +setup_http_proxy() +{ + while true; do + echo + read -p "Enter Proxy : " proxy + export http_proxy=$proxy + export https_proxy=$proxy + echo "Acquire::http::proxy \"$http_proxy\";" | sudo tee -a /etc/apt/apt.conf > /dev/null + echo "Acquire::https::proxy \"$http_proxy\";" | sudo tee -a /etc/apt/apt.conf > /dev/null + + wget -T 20 -t 3 --spider http://www.google.com > /dev/null 2>&1 + if [ "$?" != 0 ]; then + echo -e "No Internet connection. Proxy incorrect? Try again" + echo -e "eg: http://<proxy>:<port>" + exit 1 + fi + return + done + echo "Network connectivity successful." +} + +step_1() +{ + TITLE="Environment setup." + CONFIG_NUM=1 + TEXT[1]="Check OS and network connection" + FUNC[1]="setup_env" +} +setup_env() +{ + # a. Check for OS dependencies + source /etc/os-release + if [[ $VERSION_ID != "16.04" ]] ; then + echo "WARNING: It is recommended to use Ubuntu 16.04..Your version is "$VERSION_ID + else + echo "Ubuntu 16.04 OS requirement met..." + fi + echo + echo "Checking network connectivity..." + # b. Check for internet connections + wget -T 20 -t 3 --spider http://www.google.com > /dev/null 2>&1 + if [ "$?" != 0 ]; then + while true; do + read -p "No Internet connection. Are you behind a proxy (y/n)? " yn + case $yn in + [Yy]* ) $SETUP_PROXY ; return;; + [Nn]* ) echo "Please check your internet connection..." ; exit;; + * ) "Please answer yes or no.";; + esac + done + fi + echo "Network connectivity successful." +} + +step_2() +{ + TITLE="Download and Install" + CONFIG_NUM=1 + TEXT[1]="Agree to download" + FUNC[1]="get_agreement_download" + TEXT[2]="Download packages" + FUNC[2]="install_libs" + TEXT[3]="Download DPDK zip" + FUNC[3]="download_dpdk_zip" + TEXT[4]="Build and Install DPDK" + FUNC[4]="install_dpdk" + TEXT[5]="Setup hugepages" + FUNC[5]="setup_hugepages" +} +get_agreement_download() +{ + echo + echo "List of packages needed for VNFs build and installation:" + echo "-------------------------------------------------------" + echo "1. DPDK version 16.04" + echo "2. build-essential" + echo "3. linux-headers-generic" + echo "4. git" + echo "5. unzip" + echo "6. libpcap-dev" + echo "7. make" + echo "8. and other library dependencies" + while true; do + read -p "We need download above mentioned package. Press (y/n) to continue? " yn + case $yn in + [Yy]* ) + touch .agree + return;; + [Nn]* ) exit;; + * ) "Please answer yes or no.";; + esac + done +} + +install_libs() +{ + echo "Install libs needed to build and run VNFs..." + file_name=".agree" + if [ ! -e "$file_name" ]; then + echo "Please choose option '2.Agree to download' first" + return + fi + file_name=".download" + if [ -e "$file_name" ]; then + clear + return + fi + sudo apt-get update + sudo apt-get -y install build-essential linux-headers-$(uname -r) git unzip libpcap0.8-dev gcc \ + make libc6 libc6-dev g++-multilib libzmq3-dev libcurl4-openssl-dev + touch .download +} + +download_dpdk_zip() +{ + echo "Download DPDK zip" + file_name=".agree" + if [ ! -e "$file_name" ]; then + echo "Please choose option '2.Agree to download' first" + return + fi + rm -rf $DPDK_DIR + if [ ! -e ${DPDK_DOWNLOAD##*/} ] ; then + wget ${DPDK_DOWNLOAD} + fi + unzip -o ${DPDK_DOWNLOAD##*/} + mv $VNF_CORE/dpdk-16.04 $VNF_CORE/dpdk +} + +install_dpdk() +{ + echo "Build DPDK" + + if [ ! -d "$DPDK_DIR" ]; then + echo "Please choose option '4 Download DPDK zip'" + return + fi + + export RTE_TARGET=x86_64-native-linuxapp-gcc + + pushd $DPDK_DIR + echo "Apply dpdk custom patches..." + patch -p0 < $VNF_CORE/patches/dpdk_custom_patch/rte_pipeline.patch + patch -p1 < $VNF_CORE/patches/dpdk_custom_patch/i40e-fix-link-management.patch + patch -p1 < $VNF_CORE/patches/dpdk_custom_patch/i40e-fix-Rx-hang-when-disable-LLDP.patch + patch -p1 < $VNF_CORE/patches/dpdk_custom_patch/i40e-fix-link-status-change-interrupt.patch + patch -p1 < $VNF_CORE/patches/dpdk_custom_patch/i40e-fix-VF-bonded-device-link-down.patch + + make -j install T=$RTE_TARGET + if [ $? -ne 0 ] ; then + echo "Failed to build dpdk, please check the errors." + return + fi + sudo modinfo igb_uio + if [ $? -ne 0 ] ; then + sudo $MODPROBE -v uio + sudo $INSMOD $RTE_TARGET/kmod/igb_uio.ko + sudo cp -f $RTE_TARGET/kmod/igb_uio.ko /lib/modules/$(uname -r) + echo "uio" | sudo tee -a /etc/modules + echo "igb_uio" | sudo tee -a /etc/modules + sudo depmod + fi + popd +} + +setup_hugepages() +{ + #---- + Pages=16 + if [[ "$HUGEPGSZ" = "2048kB" ]] ; then + Pages=8192 + fi + if [ ! "`grep nr_hugepages /etc/sysctl.conf`" ] ; then + echo "vm.nr_hugepages=$Pages" | sudo tee /etc/sysctl.conf + fi + sudo sysctl -p + + sudo service procps start + + grep -s '/dev/hugepages' /proc/mounts + if [ $? -ne 0 ] ; then + echo "Creating /mnt/huge and mounting as hugetlbfs" + sudo mkdir -p /mnt/huge + sudo mount -t hugetlbfs nodev /mnt/huge + echo "nodev /mnt/huge hugetlbfs defaults 0 0" | sudo tee -a /etc/fstab > /dev/null + fi +} + +step_3() +{ + TITLE="Build VNFs" + CONFIG_NUM=1 + TEXT[1]="Build all VNFs (vACL, vCGNAPT, vFW)" + FUNC[1]="build_vnfs" +} + +build_vnfs() +{ + + if [ ! -d "$DPDK_DIR" ]; then + echo "Please choose option '4 Download DPDK zip'" + return + fi + + if [ ! -d "$DPDK_DIR/x86_64-native-linux-gcc" ]; then + echo "Please choose option '5 Build and Install DPDK'" + return + fi + + export RTE_SDK=$DPDK_DIR + export RTE_TARGET=x86_64-native-linuxapp-gcc + pushd $VNF_CORE + make clean + make || { echo -e "\nVNF: Make failed\n"; } + popd +} + +SETUP_PROXY="setup_http_proxy" +STEPS[1]="step_1" +STEPS[2]="step_2" +STEPS[3]="step_3" + +QUIT=0 + +clear + +echo -n "Checking for user permission.. " +sudo -n true +if [ $? -ne 0 ]; then + echo "Password-less sudo user must run this script" 1>&2 + exit 1 +fi +echo "Done" +clear + +while [ "$QUIT" == "0" ]; do + OPTION_NUM=1 + for s in $(seq ${#STEPS[@]}) ; do + ${STEPS[s]} + + echo "----------------------------------------------------------" + echo " Step $s: ${TITLE}" + echo "----------------------------------------------------------" + + for i in $(seq ${#TEXT[@]}) ; do + echo "[$OPTION_NUM] ${TEXT[i]}" + OPTIONS[$OPTION_NUM]=${FUNC[i]} + let "OPTION_NUM+=1" + done + + # Clear TEXT and FUNC arrays before next step + unset TEXT + unset FUNC + + echo "" + done + + echo "[$OPTION_NUM] Exit Script" + OPTIONS[$OPTION_NUM]="quit" + echo "" + echo -n "Option: " + read our_entry + echo "" + ${OPTIONS[our_entry]} ${our_entry} + + if [ "$QUIT" == "0" ] ; then + echo + echo -n "Press enter to continue ..."; read + clear + continue + exit + fi + echo "Installation successfully complete." +done |