X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=BUILD.sh;h=4eb05776a8663723048a625c543a26ca1d6a20df;hb=8bff092ceca2155d19eb5f4b1dc91d65a2fdb7eb;hp=c8aec58644d3f1e29611abef4c8fe79f9c6c46f0;hpb=d03647dd8a262a6d944ae6f287f483bb120b7429;p=osm%2FSO.git diff --git a/BUILD.sh b/BUILD.sh index c8aec586..4eb05776 100755 --- a/BUILD.sh +++ b/BUILD.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash # # Copyright 2016 RIFT.IO Inc # @@ -13,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# Author(s): Jeremy Mordkoff +# Author(s): Jeremy Mordkoff, Lezz Giles # Creation Date: 08/29/2016 # # @@ -22,73 +23,300 @@ # # This is a top-level build script for RIFT.io # -# args none +# Arguments and options: use -h or --help # # dependencies -- requires sudo rights +# Defensive bash programming flags +set -o errexit # Exit on any error +trap 'echo ERROR: Command failed: \"$BASH_COMMAND\"' ERR +set -o nounset # Expanding an unset variable is an error. Variables must be + # set before they can be used. -# ARGS +############################################################################### +# Options and arguments -PLATFORM_REPOSITORY=${1:-OSM} # change to OSM when published -PLATFORM_VERSION=${2:-4.3.1.0.49553-1} +# There +params="$(getopt -o suhb: -l install-so,install-ui,no-mkcontainer,build-ui:,help --name "$0" -- "$@")" +if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi -# must be run from the top of a workspace -cd $(dirname $0) +eval set -- $params + +installSO=false +installUI=false +runMkcontainer=true +UIPathToBuild= + +while true; do + case "$1" in + -s|--install-so) installSO=true; shift;; + -u|--install-ui) installUI=true; shift;; + -b|--build-ui) shift; UIPathToBuild=$1; shift;; + --no-mkcontainer) runMkcontainer=false; shift;; + -h|--help) + echo + echo "NAME:" + echo " $0" + echo + echo "SYNOPSIS:" + echo " $0 -h|--help" + echo " $0 [-s] [-u|-b PATH-TO-UI-REPO] [PLATFORM_REPOSITORY] [PLATFORM_VERSION]" + echo + echo "DESCRIPTION:" + echo " Prepare current system to run SO and UI. By default, the system" + echo " is set up to support building SO and UI; optionally, either or" + echo " both SO and UI can be installed from a Debian package repository." + echo + echo " -s|--install-so: install SO from package" + echo " -u|--install-ui: install UI from package" + echo " -b|--build-ui PATH-TO-UI-REPO: build the UI in the specified repo" + echo " --no-mkcontainer: do not run mkcontainer, used for debugging script" + echo " PLATFORM_REPOSITORY (optional): name of the RIFT.ware repository." + echo " PLATFORM_VERSION (optional): version of the platform packages to be installed." + echo + exit 0;; + --) shift; break;; + *) echo "Not implemented: $1" >&2; exit 1;; + esac +done + +if $installUI && [[ $UIPathToBuild ]]; then + echo "Cannot both install and build the UI!" + exit 1 +fi + +if [[ $UIPathToBuild && ! -d $UIPathToBuild ]]; then + echo "Not a directory: $UIPathToBuild" + exit 1 +fi + +# Turn this on after handling options, so the output doesn't get cluttered. +set -x # Print commands before executing them + +############################################################################### +# Find the platform +PYTHON=python +if [[ ! -f /usr/bin/python ]]; then + PYTHON=python3 +fi + +if $PYTHON -mplatform | grep -qi fedora; then + PLATFORM=fc20 +elif $PYTHON -mplatform | grep -qi ubuntu; then + PLATFORM=ub16 +else + echo "Unknown platform" + exit 1 +fi + +############################################################################### +# Set up repo and version +if [[ $PLATFORM == ub16 ]]; then + PLATFORM_REPOSITORY=${1:-OSM} + PLATFORM_VERSION=${2:-4.4.2.1.61839} +elif [[ $PLATFORM == fc20 ]]; then + PLATFORM_REPOSITORY=${1:-OSM} # change to OSM when published + PLATFORM_VERSION=${2:-4.4.2.1.61839} +else + echo "Internal error: unknown platform $PLATFORM" + exit 1 +fi +############################################################################### +# Main block +# Disable apt-daily.service and apt-daily.timer + +DAILY_TIMER='apt-daily.timer' +DAILY_SERVICE='apt-daily.service' +if [ $(systemctl is-active $DAILY_TIMER) = "active" ] +then + systemctl stop $DAILY_TIMER + systemctl disable $DAILY_TIMER + systemctl disable $DAILY_SERVICE +fi + +# must be run from the top of a workspace +cd $(dirname $0) # inside RIFT.io this is an NFS mount # so just to be safe test -h /usr/rift && sudo rm -f /usr/rift -# get the container tools from the correct repository -sudo rm -f /etc/yum.repos.d/private.repo -sudo curl -o /etc/yum.repos.d/${PLATFORM_REPOSITORY}.repo \ - http://buildtracker.riftio.com/repo_file/fc20/${PLATFORM_REPOSITORY}/ -sudo yum install --assumeyes rw.tools-container-tools rw.tools-scripts - +if [[ $PLATFORM == ub16 ]]; then + # enable the right repos + curl http://repos.riftio.com/public/xenial-riftware-public-key | sudo apt-key add - + # the old mkcontainer always enabled release which can be bad + # so remove it + sudo rm -f /etc/apt/sources.list.d/release.list /etc/apt/sources.list.d/rbac.list /etc/apt/sources.list.d/OSM.list + # always use the same file name so that updates will overwrite rather than enable a second repo + sudo curl -o /etc/apt/sources.list.d/RIFT.list http://buildtracker.riftio.com/repo_file/ub16/${PLATFORM_REPOSITORY}/ + sudo apt-get update + + # and install the tools + sudo apt remove -y rw.toolchain-rwbase tcpdump + sudo apt-get install -y --allow-downgrades rw.tools-container-tools=${PLATFORM_VERSION} rw.tools-scripts=${PLATFORM_VERSION} python +elif [[ $PLATFORM == fc20 ]]; then + # get the container tools from the correct repository + sudo rm -f /etc/yum.repos.d/private.repo + sudo curl -o /etc/yum.repos.d/${PLATFORM_REPOSITORY}.repo \ + http://buildtracker.riftio.com/repo_file/fc20/${PLATFORM_REPOSITORY}/ + sudo yum install --assumeyes rw.tools-container-tools rw.tools-scripts +else + echo "Internal error: unknown platform $PLATFORM" + exit 1 +fi # enable the OSM repository hosted by RIFT.io # this contains the RIFT platform code and tools # and install of the packages required to build and run # this module -sudo /usr/rift/container_tools/mkcontainer --modes build --modes ext --repo ${PLATFORM_REPOSITORY} +if $runMkcontainer; then + sudo apt-get install -y libxml2-dev libxslt-dev + sudo /usr/rift/container_tools/mkcontainer --modes build --modes ext --repo ${PLATFORM_REPOSITORY} + sudo pip3 install lxml==3.4.0 +fi -temp=$(mktemp -d /tmp/rw.XXX) -pushd $temp -# yum does not accept the --nodeps and --replacefiles options so we -# download first and then install -yumdownloader rw.toolchain-rwbase-${PLATFORM_VERSION} \ - rw.toolchain-rwtoolchain-${PLATFORM_VERSION} \ - rw.core.mgmt-mgmt-${PLATFORM_VERSION} \ - rw.core.util-util-${PLATFORM_VERSION} \ - rw.core.rwvx-rwvx-${PLATFORM_VERSION} \ - rw.core.rwvx-rwha-1.0-${PLATFORM_VERSION} \ - rw.core.rwvx-rwdts-${PLATFORM_VERSION} \ - rw.automation.core-RWAUTO-${PLATFORM_VERSION} +if [[ $PLATFORM == ub16 ]]; then + # install the RIFT platform code: + # remove these packages since some files moved from one to the other, and one was obsoleted + # ignore failures -sudo rpm -i --replacefiles --nodeps *rpm -popd -rm -rf $temp + PACKAGES="rw.toolchain-rwbase rw.toolchain-rwtoolchain rw.core.mgmt-mgmt rw.core.util-util \ + rw.core.rwvx-rwvx rw.core.rwvx-rwdts rw.automation.core-RWAUTO" + # this package is obsolete. + OLD_PACKAGES="rw.core.rwvx-rwha-1.0" + for package in $PACKAGES $OLD_PACKAGES; do + sudo apt remove -y $package || true + done -# this file gets in the way of the one generated by the build -sudo rm -f /usr/rift/usr/lib/libmano_yang_gen.so + packages="" + for package in $PACKAGES; do + packages="$packages $package=${PLATFORM_VERSION}" + done + sudo apt-get install -y --allow-downgrades $packages + sudo apt-get install python-cinderclient + + sudo chmod 777 /usr/rift /usr/rift/usr/share + + if $installSO; then + sudo apt-get install -y \ + rw.core.mano-rwcal_yang_ylib-1.0 \ + rw.core.mano-rwconfig_agent_yang_ylib-1.0 \ + rw.core.mano-rwlaunchpad_yang_ylib-1.0 \ + rw.core.mano-mano_yang_ylib-1.0 \ + rw.core.mano-common-1.0 \ + rw.core.mano-rwsdn_yang_ylib-1.0 \ + rw.core.mano-rwsdnal_yang_ylib-1.0 \ + rw.core.mano-rwsdn-1.0 \ + rw.core.mano-mano-types_yang_ylib-1.0 \ + rw.core.mano-rwcal-cloudsim-1.0 \ + rw.core.mano-rwcal-1.0 \ + rw.core.mano-rw_conman_yang_ylib-1.0 \ + rw.core.mano-rwcalproxytasklet-1.0 \ + rw.core.mano-rwlaunchpad-1.0 \ + rw.core.mano-rwcal-openmano-vimconnector-1.0 \ + rw.core.mano-rwcal-propcloud1-1.0 \ + rw.core.mano-lpmocklet_yang_ylib-1.0 \ + rw.core.mano-rwmon-1.0 \ + rw.core.mano-rwcloud_yang_ylib-1.0 \ + rw.core.mano-rwcal-openstack-1.0 \ + rw.core.mano-rw.core.mano_foss \ + rw.core.mano-rwmon_yang_ylib-1.0 \ + rw.core.mano-rwcm-1.0 \ + rw.core.mano-rwcal-mock-1.0 \ + rw.core.mano-rwmano_examples-1.0 \ + rw.core.mano-rwcal-cloudsimproxy-1.0 \ + rw.core.mano-models-1.0 \ + rw.core.mano-rwcal-aws-1.0 + fi + + if $installUI; then + sudo apt-get install -y \ + rw.ui-about \ + rw.ui-logging \ + rw.ui-skyquake \ + rw.ui-accounts \ + rw.ui-composer \ + rw.ui-launchpad \ + rw.ui-debug \ + rw.ui-config \ + rw.ui-dummy_component + fi +elif [[ $PLATFORM == fc20 ]]; then + + temp=$(mktemp -d /tmp/rw.XXX) + pushd $temp + + # yum does not accept the --nodeps and --replacefiles options so we + # download first and then install + yumdownloader rw.toolchain-rwbase-${PLATFORM_VERSION} \ + rw.toolchain-rwtoolchain-${PLATFORM_VERSION} \ + rw.core.mgmt-mgmt-${PLATFORM_VERSION} \ + rw.core.util-util-${PLATFORM_VERSION} \ + rw.core.rwvx-rwvx-${PLATFORM_VERSION} \ + rw.core.rwvx-rwha-1.0-${PLATFORM_VERSION} \ + rw.core.rwvx-rwdts-${PLATFORM_VERSION} \ + rw.automation.core-RWAUTO-${PLATFORM_VERSION} + + # Install one at a time so that pre-installed packages will not cause a failure + for pkg in *rpm; do + # Check to see if the package is already installed; do not try to install + # it again if it does, since this causes rpm -i to return failure. + if rpm -q $(rpm -q -p $pkg) >/dev/null; then + echo "WARNING: package already installed: $pkg" + else + sudo rpm -i --replacefiles --nodeps $pkg + fi + done + + popd + rm -rf $temp + + # this file gets in the way of the one generated by the build + sudo rm -f /usr/rift/usr/lib/libmano_yang_gen.so -sudo chmod 777 /usr/rift /usr/rift/usr/share -# install some base files used to create VNFs -test -d /usr/rift/images || mkdir /usr/rift/images -for file in Fedora-x86_64-20-20131211.1-sda-ping.qcow2 Fedora-x86_64-20-20131211.1-sda-pong.qcow2 Fedora-x86_64-20-20131211.1-sda.qcow2; do - test -f /usr/rift/images/$file || curl -o /usr/rift/images/$file http://repo.riftio.com/releases/open.riftio.com/4.3.1/$file -done + sudo chmod 777 /usr/rift /usr/rift/usr/share + + if $installSO; then + sudo apt-get install -y \ + rw.core.mc-\*-${PLATFORM_VERSION} + fi + + if $installUI; then + sudo apt-get install -y \ + rw.ui-about-${PLATFORM_VERSION} \ + rw.ui-logging-${PLATFORM_VERSION} \ + rw.ui-skyquake-${PLATFORM_VERSION} \ + rw.ui-accounts-${PLATFORM_VERSION} \ + rw.ui-composer-${PLATFORM_VERSION} \ + rw.ui-launchpad-${PLATFORM_VERSION} \ + rw.ui-debug-${PLATFORM_VERSION} \ + rw.ui-config-${PLATFORM_VERSION} \ + rw.ui-dummy_component-${PLATFORM_VERSION} + fi + +else + echo "Internal error: unknown platform $PLATFORM" + exit 1 +fi -####### If you are re-building, you just need to run +# If you are re-building SO, you just need to run # these two steps -make -j16 -sudo make install +if ! $installSO; then + make -j16 + sudo make install +fi + +if [[ $UIPathToBuild ]]; then + make -C $UIPathToBuild -j16 + sudo make -C $UIPathToBuild install +fi + +echo "Creating Service ...." +sudo $(dirname $0)/create_launchpad_service -# note to start the RIFT.io UI please run -echo 'sudo -H /usr/rift/rift-shell -r -i /usr/rift -a /usr/rift/.artifacts -- ./demos/launchpad.py --use-xml-mode --no-ui'