| #!/bin/bash |
| |
| source /var/onap/commons |
| source /var/onap/config/env-vars |
| source /var/onap/_composed_functions |
| source /var/onap/_onap_functions |
| |
| export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' |sort -n | head -1) |
| export NIC=$(ip route get 8.8.8.8 | awk '{ print $5; exit }') |
| export IP_ADDRESS=$(ifconfig $NIC | grep "inet addr" | tr -s ' ' | cut -d' ' -f3 | cut -d':' -f2) |
| |
| mvn_conf_file=/root/.m2/settings.xml |
| |
| # configure_dns() - DNS/GW IP address configuration |
| function configure_dns { |
| echo "nameserver 10.0.0.1" >> /etc/resolvconf/resolv.conf.d/head |
| resolvconf -u |
| } |
| |
| # get_next_ip() - Function that provides the next ip |
| function get_next_ip { |
| local ip=${1:-$IP_ADDRESS} |
| ip_hex=$(printf '%.2X%.2X%.2X%.2X\n' `echo $ip | sed -e 's/\./ /g'`) |
| next_ip_hex=$(printf %.8X `echo $(( 0x$ip_hex + 1 ))`) |
| echo $(printf '%d.%d.%d.%d\n' `echo $next_ip_hex | sed -r 's/(..)/0x\1 /g'`) |
| } |
| |
| # _git_timed() - git can sometimes get itself infinitely stuck with transient network |
| # errors or other issues with the remote end. This wraps git in a |
| # timeout/retry loop and is intended to watch over non-local git |
| # processes that might hang. |
| function _git_timed { |
| local count=0 |
| local timeout=0 |
| |
| install_package git |
| until timeout -s SIGINT ${timeout} git "$@"; do |
| # 124 is timeout(1)'s special return code when it reached the |
| # timeout; otherwise assume fatal failure |
| if [[ $? -ne 124 ]]; then |
| exit 1 |
| fi |
| |
| count=$(($count + 1)) |
| if [ $count -eq 3 ]; then |
| exit 1 |
| fi |
| sleep 5 |
| done |
| } |
| |
| # clone_repo() - Clone Git repository into specific folder |
| function clone_repo { |
| local repo_url=${3:-"https://git.onap.org/"} |
| local repo=$1 |
| local dest_folder=${2:-$git_src_folder/$repo} |
| if [ ! -d $dest_folder ]; then |
| if [[ "$debug" == "False" ]]; then |
| _git_timed clone --quiet ${repo_url}${repo} $dest_folder |
| else |
| _git_timed clone ${repo_url}${repo} $dest_folder |
| fi |
| fi |
| } |
| |
| # clone_repos() - Function that clones source repositories for a given project |
| function clone_repos { |
| local project=$1 |
| local repo_name=${2:-$project} |
| |
| for repo in ${repos[$project]}; do |
| clone_repo $repo ${src_folders[$project]}${repo#*$repo_name} |
| done |
| } |
| |
| # _install_bind() - Install bind utils |
| function _install_bind { |
| install_packages bind9 bind9utils |
| } |
| |
| # install_java() - Install java binaries |
| function install_java { |
| if is_package_installed openjdk-8-jdk; then |
| return |
| fi |
| source /etc/os-release || source /usr/lib/os-release |
| case ${ID,,} in |
| *suse) |
| ;; |
| ubuntu|debian) |
| install_package software-properties-common |
| add-apt-repository -y ppa:openjdk-r/ppa |
| ;; |
| rhel|centos|fedora) |
| ;; |
| esac |
| update_repos |
| |
| # Remove Java 7 |
| uninstall_packages default-jre openjdk-7-jdk openjdk-7-jre openjdk-7-jre-headless |
| |
| install_package openjdk-8-jdk |
| # ca-certificates-java is not a dependency in the Oracle JDK/JRE so this must be explicitly installed. |
| /var/lib/dpkg/info/ca-certificates-java.postinst configure |
| } |
| |
| # install_maven() - Install maven binaries |
| function install_maven { |
| if is_package_installed maven3; then |
| return |
| fi |
| install_java |
| source /etc/os-release || source /usr/lib/os-release |
| case ${ID,,} in |
| *suse) |
| ;; |
| ubuntu|debian) |
| install_package software-properties-common |
| add-apt-repository -y ppa:andrei-pozolotin/maven3 |
| ;; |
| rhel|centos|fedora) |
| ;; |
| esac |
| update_repos |
| install_package maven3 |
| |
| # Remove Java 7 |
| uninstall_package openjdk-7-jdk |
| |
| _configure_maven |
| } |
| |
| # _configure_docker_settings() - Configures Docker settings |
| function _configure_docker_settings { |
| local docker_conf_backup=/tmp/docker.backup |
| local docker_conf=/etc/default/docker |
| local chameleonsocks_filename=chameleonsocks.sh |
| local max_concurrent_downloads=${1:-3} |
| |
| cp ${docker_conf} ${docker_conf_backup} |
| if [ $http_proxy ]; then |
| echo "export http_proxy=$http_proxy" >> $docker_conf |
| fi |
| if [ $https_proxy ]; then |
| echo "export https_proxy=$https_proxy" >> $docker_conf |
| #If you have a socks proxy, then use that to connect to the nexus repo |
| #via a redsocks container |
| if [ $socks_proxy ]; then |
| wget https://raw.githubusercontent.com/crops/chameleonsocks/master/$chameleonsocks_filename |
| chmod 755 $chameleonsocks_filename |
| socks=$(echo $socks_proxy | sed -e "s/^.*\///" | sed -e "s/:.*$//") |
| port=$(echo $socks_proxy | sed -e "s/^.*://") |
| PROXY=$socks PORT=$port ./$chameleonsocks_filename --install |
| rm $chameleonsocks_filename |
| cp ${docker_conf_backup} ${docker_conf} |
| fi |
| fi |
| rm ${docker_conf_backup} |
| |
| echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --max-concurrent-downloads $max_concurrent_downloads \"" >> $docker_conf |
| usermod -aG docker $USER |
| |
| source /etc/os-release || source /usr/lib/os-release |
| case ${ID,,} in |
| *suse) |
| ;; |
| ubuntu|debian) |
| service docker restart |
| sleep 10 |
| ;; |
| rhel|centos|fedora) |
| ;; |
| esac |
| } |
| |
| # install_nodejs() - Download and install NodeJS |
| function install_nodejs { |
| if is_package_installed nodejs; then |
| return |
| fi |
| curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - |
| install_package nodejs |
| |
| # Update NPM to latest version |
| npm install npm -g |
| } |
| |
| # install_python() - Install Python 2.7 and other tools necessary for development. |
| function install_python { |
| install_packages python2.7 python-dev |
| } |
| |
| # _install_pip() - Install Python Package Manager |
| function _install_pip { |
| install_python |
| if ! which pip; then |
| curl -sL https://bootstrap.pypa.io/get-pip.py | python |
| fi |
| } |
| |
| # install_python_package() - Install python modules |
| function install_python_package { |
| local python_packages=$@ |
| |
| _install_pip |
| pip install $python_packages |
| } |
| |
| # install_python_requirements() - Install a list of python modules defined in requirement.txt file |
| function install_python_requirements { |
| local python_project_path=$1 |
| |
| _install_pip |
| pushd $python_project_path |
| pip install -r requirements.txt |
| popd |
| } |
| |
| # install_docker() - Download and install docker-engine |
| function install_docker { |
| if $(docker version &>/dev/null); then |
| return |
| fi |
| source /etc/os-release || source /usr/lib/os-release |
| case ${ID,,} in |
| *suse) |
| ;; |
| ubuntu|debian) |
| install_packages software-properties-common linux-image-extra-$(uname -r) linux-image-extra-virtual apt-transport-https ca-certificates curl |
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
| add-apt-repository \ |
| "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ |
| $(lsb_release -cs) stable" |
| ;; |
| rhel|centos|fedora) |
| ;; |
| esac |
| update_repos |
| |
| install_package docker-ce |
| _configure_docker_settings |
| } |
| |
| # pull_docker_image() - Pull Docker container image from the Public Docker Registry Hub |
| function pull_docker_image { |
| install_docker |
| local image=$1 |
| local tag=$2 |
| docker pull ${image} |
| if [ ${tag} ]; then |
| docker tag ${image} $tag |
| fi |
| } |
| |
| # wait_docker_pull() - Function that waits for all docker pull processes |
| function wait_docker_pull { |
| local counter=60 |
| local delay=${1:-60} |
| |
| sleep $delay |
| while [ $(ps -ef | grep "docker pull" | wc -l) -gt 1 ]; do |
| sleep $delay |
| counter=$((counter - 1)) |
| if [ "$counter" -eq 0 ]; then |
| break |
| fi |
| done |
| } |
| |
| # run_docker_image() - Starts a Docker instance |
| function run_docker_image { |
| install_docker |
| docker run $@ |
| } |
| |
| # run_docker_compose() - Ensures that docker compose is installed and run it in background |
| function run_docker_compose { |
| local folder=$1 |
| |
| install_docker_compose |
| pushd $folder |
| /opt/docker/docker-compose up -d |
| popd |
| } |
| |
| # install_docker_compose() - Download and install docker-engine |
| function install_docker_compose { |
| local docker_compose_version=${1:-1.12.0} |
| if [ ! -d /opt/docker ]; then |
| mkdir /opt/docker |
| curl -L https://github.com/docker/compose/releases/download/$docker_compose_version/docker-compose-`uname -s`-`uname -m` > /opt/docker/docker-compose |
| chmod +x /opt/docker/docker-compose |
| fi |
| } |
| |
| # install_chefdk() - Install ChefDK package |
| function install_chefdk { |
| local chefdk_version="2.4.17" |
| |
| if is_package_installed chefdk; then |
| return |
| fi |
| pushd $(mktemp -d) |
| source /etc/os-release || source /usr/lib/os-release |
| case ${ID,,} in |
| *suse) |
| ;; |
| ubuntu|debian) |
| chefdk_pkg="chefdk_$chefdk_version-1_amd64.deb" |
| chefdk_url="https://packages.chef.io/files/stable/chefdk/$chefdk_version/ubuntu/$VERSION_ID/$chefdk_pkg" |
| |
| wget $chefdk_url |
| dpkg -i $chefdk_pkg |
| apt-get install -f -y |
| ;; |
| rhel|centos|fedora) |
| rpm -Uvh "https://packages.chef.io/files/stable/chefdk/$chefdk_version/el/7/chefdk-$chefdk_version-1.el7.x86_64.rpm" |
| ;; |
| esac |
| popd |
| } |
| |
| # _install_ODL() - Download and Install OpenDayLight SDN controller |
| function _install_ODL { |
| if [ ! -d /opt/opendaylight/current ]; then |
| mkdir -p /opt/opendaylight/ |
| wget "https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/"$odl_version"/distribution-karaf-"$odl_version".tar.gz" -P /opt/ |
| tar xvf "/opt/distribution-karaf-"$odl_version".tar.gz" -C /tmp/ |
| mv "/tmp/distribution-karaf-"$odl_version /opt/opendaylight/current |
| rm -rf "/opt/distribution-karaf-"$odl_version".tar.gz" |
| fi |
| } |
| |
| # start_ODL() - Start OpenDayLight SDN controller |
| function start_ODL { |
| _install_ODL |
| if [ -d /opt/opendaylight ]; then |
| export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre |
| /opt/opendaylight/current/bin/start |
| sleep 180 |
| /opt/opendaylight/current/bin/client feature:install odl-dlux-all |
| fi |
| } |
| |
| # compile_src() - Function that compiles the java source code thru maven |
| function compile_src { |
| local src_folder=$1 |
| pushd $src_folder |
| local mvn_build='mvn clean install -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dadditionalparam=-Xdoclint:none' |
| if [[ "$debug" == "False" ]]; then |
| mvn_build+=" -q" |
| fi |
| if [ -f pom.xml ]; then |
| install_maven |
| echo "Compiling $src_folder folder..." |
| eval $mvn_build |
| fi |
| popd |
| } |
| |
| # compile_repos() - Function that compiles source repositories for a given project |
| function compile_repos { |
| local project=$1 |
| |
| for repo in ${repos[$project]}; do |
| compile_src ${src_folders[$project]}${repo#*$project} |
| done |
| } |
| |
| # build_docker_image() - Build Docker container image from source code |
| function build_docker_image { |
| local src_folder=$1 |
| local profile=$2 |
| install_docker |
| pushd $src_folder |
| |
| if [ -f pom.xml ]; then |
| install_maven |
| # Cleanup external repo |
| sed -i 's|${docker.push.registry}/||g' pom.xml |
| local docker_build="mvn clean package docker:build -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true" |
| if [ $profile ]; then |
| docker_build+=" -P $profile" |
| fi |
| if [[ "$debug" == "False" ]]; then |
| docker_build+=" -q" |
| fi |
| if [ $http_proxy ]; then |
| if ! grep -ql "docker.buildArg.http_proxy" pom.xml ; then |
| docker_build+=" -Ddocker.buildArg.http_proxy=$http_proxy" |
| fi |
| if ! grep -ql "docker.buildArg.HTTP_PROXY" pom.xml ; then |
| docker_build+=" -Ddocker.buildArg.HTTP_PROXY=$http_proxy" |
| fi |
| fi |
| if [ $https_proxy ]; then |
| if ! grep -ql "docker.buildArg.https_proxy" pom.xml ; then |
| docker_build+=" -Ddocker.buildArg.https_proxy=$https_proxy" |
| fi |
| if ! grep -ql "docker.buildArg.HTTPS_PROXY" pom.xml ; then |
| docker_build+=" -Ddocker.buildArg.HTTPS_PROXY=$https_proxy" |
| fi |
| fi |
| elif [ -f Dockerfile ]; then |
| # NOTE: Workaround for dmmapbc images |
| sed -i '/LocalKey/d' Dockerfile |
| sed -i "s/nexus3.onap.org\:10003\///g" Dockerfile |
| local docker_build="docker build -t $profile -f ./Dockerfile ." |
| if [ $http_proxy ]; then |
| docker_build+=" --build-arg http_proxy=$http_proxy" |
| docker_build+=" --build-arg HTTP_PROXY=$http_proxy" |
| fi |
| if [ $https_proxy ]; then |
| docker_build+=" --build-arg https_proxy=$https_proxy" |
| docker_build+=" --build-arg HTTPS_PROXY=$https_proxy" |
| fi |
| fi |
| echo $docker_build |
| eval $docker_build |
| popd |
| } |
| |
| # mount_external_partition() - Create partition and mount the external volume |
| function mount_external_partition { |
| local dev_name="/dev/$1" |
| local mount_dir=$2 |
| |
| sfdisk $dev_name << EOF |
| ; |
| EOF |
| mkfs -t ext4 ${dev_name}1 |
| mkdir -p $mount_dir |
| mount ${dev_name}1 $mount_dir |
| echo "${dev_name}1 $mount_dir ext4 errors=remount-ro,noatime,barrier=0 0 1" >> /etc/fstab |
| } |
| |
| # add_no_proxy_value() - Add no_proxy values into environment file, used for internal IPs generated at deploy time |
| function add_no_proxy_value { |
| if [[ `grep "no_proxy" /etc/environment` ]]; then |
| sed -i.bak "s/^no_proxy.*$/&,$1/" /etc/environment |
| else |
| echo "no_proxy=$1" >> /etc/environment |
| fi |
| if [[ `grep "NO_PROXY" /etc/environment` ]]; then |
| sed -i.bak "s/^NO_PROXY.*$/&,$1/" /etc/environment |
| else |
| echo "NO_PROXY=$1" >> /etc/environment |
| fi |
| } |
| |