blob: f40761f595e1f5d244d230892da86e740203cbd7 [file] [log] [blame]
Victor Morales89ce3212017-06-16 18:32:48 -05001#!/bin/bash
2
Victor Morales89ce3212017-06-16 18:32:48 -05003source /var/onap/commons
Victor Morales54646642017-12-08 11:57:42 -08004source /var/onap/config/env-vars
Victor Moralesdd074802017-07-26 16:06:35 -05005source /var/onap/_composed_functions
6source /var/onap/_onap_functions
7
Victor Morales96512652017-08-16 13:44:28 -05008export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' |sort -n | head -1)
Victor Morales4ab71c12017-11-08 07:28:28 -08009export NIC=$(ip route get 8.8.8.8 | awk '{ print $5; exit }')
10export IP_ADDRESS=$(ifconfig $NIC | grep "inet addr" | tr -s ' ' | cut -d' ' -f3 | cut -d':' -f2)
Victor Morales96512652017-08-16 13:44:28 -050011
Victor Moralesdd074802017-07-26 16:06:35 -050012mvn_conf_file=/root/.m2/settings.xml
Victor Moralesdd074802017-07-26 16:06:35 -050013
Victor Morales89ce3212017-06-16 18:32:48 -050014# configure_dns() - DNS/GW IP address configuration
15function configure_dns {
16 echo "nameserver 10.0.0.1" >> /etc/resolvconf/resolv.conf.d/head
17 resolvconf -u
18}
19
Victor Morales4ab71c12017-11-08 07:28:28 -080020# get_next_ip() - Function that provides the next ip
21function get_next_ip {
22 local ip=${1:-$IP_ADDRESS}
23 ip_hex=$(printf '%.2X%.2X%.2X%.2X\n' `echo $ip | sed -e 's/\./ /g'`)
24 next_ip_hex=$(printf %.8X `echo $(( 0x$ip_hex + 1 ))`)
25 echo $(printf '%d.%d.%d.%d\n' `echo $next_ip_hex | sed -r 's/(..)/0x\1 /g'`)
26}
27
Victor Moralesdd074802017-07-26 16:06:35 -050028# _git_timed() - git can sometimes get itself infinitely stuck with transient network
Victor Morales89ce3212017-06-16 18:32:48 -050029# errors or other issues with the remote end. This wraps git in a
30# timeout/retry loop and is intended to watch over non-local git
31# processes that might hang.
Victor Moralesdd074802017-07-26 16:06:35 -050032function _git_timed {
Victor Morales89ce3212017-06-16 18:32:48 -050033 local count=0
34 local timeout=0
35
36 install_package git
37 until timeout -s SIGINT ${timeout} git "$@"; do
38 # 124 is timeout(1)'s special return code when it reached the
39 # timeout; otherwise assume fatal failure
40 if [[ $? -ne 124 ]]; then
41 exit 1
42 fi
43
44 count=$(($count + 1))
45 if [ $count -eq 3 ]; then
46 exit 1
47 fi
48 sleep 5
49 done
50}
51
52# clone_repo() - Clone Git repository into specific folder
53function clone_repo {
Victor Morales9f1c94b2017-11-07 07:56:04 -080054 local repo_url=${3:-"https://git.onap.org/"}
Victor Morales89ce3212017-06-16 18:32:48 -050055 local repo=$1
Victor Moralesdd074802017-07-26 16:06:35 -050056 local dest_folder=${2:-$git_src_folder/$repo}
57 if [ ! -d $dest_folder ]; then
Victor Morales7abf1a82017-11-06 09:20:27 -080058 if [[ "$debug" == "False" ]]; then
59 _git_timed clone --quiet ${repo_url}${repo} $dest_folder
60 else
61 _git_timed clone ${repo_url}${repo} $dest_folder
62 fi
Victor Morales89ce3212017-06-16 18:32:48 -050063 fi
64}
65
Victor Moralesf1f1ba52017-11-20 16:38:28 -080066# clone_repos() - Function that clones source repositories for a given project
67function clone_repos {
68 local project=$1
Victor Morales5d21f642017-12-07 11:54:59 -080069 local repo_name=${2:-$project}
Victor Moralesf1f1ba52017-11-20 16:38:28 -080070
Victor Morales54646642017-12-08 11:57:42 -080071 for repo in ${repos[$project]}; do
72 clone_repo $repo ${src_folders[$project]}${repo#*$repo_name}
Victor Moralesf1f1ba52017-11-20 16:38:28 -080073 done
74}
75
Victor Moralesdd074802017-07-26 16:06:35 -050076# _install_bind() - Install bind utils
77function _install_bind {
Victor Morales7ae05a42017-08-22 14:39:00 -050078 install_packages bind9 bind9utils
Victor Morales89ce3212017-06-16 18:32:48 -050079}
80
Victor Morales89ce3212017-06-16 18:32:48 -050081# install_java() - Install java binaries
82function install_java {
Victor Moralesece790c2017-08-08 11:11:36 -050083 if is_package_installed openjdk-8-jdk; then
84 return
85 fi
Victor Morales9f1c94b2017-11-07 07:56:04 -080086 source /etc/os-release || source /usr/lib/os-release
87 case ${ID,,} in
88 *suse)
89 ;;
90 ubuntu|debian)
91 install_package software-properties-common
92 add-apt-repository -y ppa:openjdk-r/ppa
93 ;;
94 rhel|centos|fedora)
95 ;;
96 esac
Victor Morales332d7d82017-11-06 11:51:37 -080097 update_repos
Victor Morales7ae05a42017-08-22 14:39:00 -050098
99 # Remove Java 7
100 uninstall_packages default-jre openjdk-7-jdk openjdk-7-jre openjdk-7-jre-headless
101
Victor Morales89ce3212017-06-16 18:32:48 -0500102 install_package openjdk-8-jdk
Victor Morales455bece2017-07-31 18:40:39 -0500103 # ca-certificates-java is not a dependency in the Oracle JDK/JRE so this must be explicitly installed.
104 /var/lib/dpkg/info/ca-certificates-java.postinst configure
Victor Morales89ce3212017-06-16 18:32:48 -0500105}
106
107# install_maven() - Install maven binaries
108function install_maven {
Victor Moralesdd074802017-07-26 16:06:35 -0500109 if is_package_installed maven3; then
Victor Morales89ce3212017-06-16 18:32:48 -0500110 return
111 fi
Victor Moralesece790c2017-08-08 11:11:36 -0500112 install_java
Victor Morales9f1c94b2017-11-07 07:56:04 -0800113 source /etc/os-release || source /usr/lib/os-release
114 case ${ID,,} in
115 *suse)
116 ;;
117 ubuntu|debian)
118 install_package software-properties-common
119 add-apt-repository -y ppa:andrei-pozolotin/maven3
120 ;;
121 rhel|centos|fedora)
122 ;;
123 esac
Victor Morales332d7d82017-11-06 11:51:37 -0800124 update_repos
Victor Morales89ce3212017-06-16 18:32:48 -0500125 install_package maven3
126
Victor Morales7ae05a42017-08-22 14:39:00 -0500127 # Remove Java 7
128 uninstall_package openjdk-7-jdk
Victor Moralesdd074802017-07-26 16:06:35 -0500129
130 _configure_maven
Victor Morales89ce3212017-06-16 18:32:48 -0500131}
132
Idan Amite17b5ec2017-08-16 14:17:59 +0300133# _configure_docker_settings() - Configures Docker settings
134function _configure_docker_settings {
Victor Moralescf269992017-10-18 09:29:55 -0700135 local docker_conf_backup=/tmp/docker.backup
136 local docker_conf=/etc/default/docker
137 local chameleonsocks_filename=chameleonsocks.sh
Victor Moralesfa9eb9c2017-12-18 09:56:13 -0800138 local max_concurrent_downloads=${1:-3}
Victor Moralescf269992017-10-18 09:29:55 -0700139
Victor Morales80f144b2018-01-10 07:20:54 -0800140 cp ${docker_conf} ${docker_conf_backup}
Victor Morales89ce3212017-06-16 18:32:48 -0500141 if [ $http_proxy ]; then
Victor Moralescf269992017-10-18 09:29:55 -0700142 echo "export http_proxy=$http_proxy" >> $docker_conf
Victor Morales89ce3212017-06-16 18:32:48 -0500143 fi
144 if [ $https_proxy ]; then
Victor Moralescf269992017-10-18 09:29:55 -0700145 echo "export https_proxy=$https_proxy" >> $docker_conf
Victor Morales5ce04212017-09-24 09:03:32 -0700146 #If you have a socks proxy, then use that to connect to the nexus repo
Kiranf2824c22017-09-22 18:05:29 -0700147 #via a redsocks container
148 if [ $socks_proxy ]; then
Victor Moralescf269992017-10-18 09:29:55 -0700149 wget https://raw.githubusercontent.com/crops/chameleonsocks/master/$chameleonsocks_filename
150 chmod 755 $chameleonsocks_filename
Victor Morales5ce04212017-09-24 09:03:32 -0700151 socks=$(echo $socks_proxy | sed -e "s/^.*\///" | sed -e "s/:.*$//")
152 port=$(echo $socks_proxy | sed -e "s/^.*://")
Victor Moralescf269992017-10-18 09:29:55 -0700153 PROXY=$socks PORT=$port ./$chameleonsocks_filename --install
154 rm $chameleonsocks_filename
Victor Morales80f144b2018-01-10 07:20:54 -0800155 cp ${docker_conf_backup} ${docker_conf}
Kiranf2824c22017-09-22 18:05:29 -0700156 fi
Victor Morales89ce3212017-06-16 18:32:48 -0500157 fi
Victor Morales80f144b2018-01-10 07:20:54 -0800158 rm ${docker_conf_backup}
Idan Amite17b5ec2017-08-16 14:17:59 +0300159
Victor Moralesfa9eb9c2017-12-18 09:56:13 -0800160 echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --max-concurrent-downloads $max_concurrent_downloads \"" >> $docker_conf
161 usermod -aG docker $USER
162
163 source /etc/os-release || source /usr/lib/os-release
164 case ${ID,,} in
165 *suse)
166 ;;
167 ubuntu|debian)
168 service docker restart
169 sleep 10
170 ;;
171 rhel|centos|fedora)
172 ;;
173 esac
Victor Morales89ce3212017-06-16 18:32:48 -0500174}
175
Victor Moralesdd074802017-07-26 16:06:35 -0500176# install_nodejs() - Download and install NodeJS
177function install_nodejs {
178 if is_package_installed nodejs; then
179 return
180 fi
181 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
182 install_package nodejs
183
184 # Update NPM to latest version
185 npm install npm -g
186}
187
188# install_python() - Install Python 2.7 and other tools necessary for development.
189function install_python {
Victor Morales7ae05a42017-08-22 14:39:00 -0500190 install_packages python2.7 python-dev
Victor Moralesdd074802017-07-26 16:06:35 -0500191}
192
Victor Morales970ec192017-07-31 09:10:11 -0500193# _install_pip() - Install Python Package Manager
194function _install_pip {
195 install_python
Victor Morales4ab71c12017-11-08 07:28:28 -0800196 if ! which pip; then
Victor Morales158c18c2017-08-06 11:23:15 -0500197 curl -sL https://bootstrap.pypa.io/get-pip.py | python
198 fi
Victor Morales970ec192017-07-31 09:10:11 -0500199}
200
Victor Morales88d193e2017-11-16 10:50:28 -0800201# install_python_package() - Install python modules
Victor Morales970ec192017-07-31 09:10:11 -0500202function install_python_package {
Victor Morales4ab71c12017-11-08 07:28:28 -0800203 local python_packages=$@
Victor Morales970ec192017-07-31 09:10:11 -0500204
205 _install_pip
Victor Morales4ab71c12017-11-08 07:28:28 -0800206 pip install $python_packages
Victor Morales970ec192017-07-31 09:10:11 -0500207}
208
Victor Morales88d193e2017-11-16 10:50:28 -0800209# install_python_requirements() - Install a list of python modules defined in requirement.txt file
210function install_python_requirements {
211 local python_project_path=$1
212
213 _install_pip
214 pushd $python_project_path
215 pip install -r requirements.txt
216 popd
217}
218
Victor Morales970ec192017-07-31 09:10:11 -0500219# install_docker() - Download and install docker-engine
Victor Moralesdd074802017-07-26 16:06:35 -0500220function install_docker {
Victor Moralesfa9eb9c2017-12-18 09:56:13 -0800221 if $(docker version &>/dev/null); then
Victor Moralesdd074802017-07-26 16:06:35 -0500222 return
223 fi
Victor Morales9f1c94b2017-11-07 07:56:04 -0800224 source /etc/os-release || source /usr/lib/os-release
225 case ${ID,,} in
226 *suse)
227 ;;
228 ubuntu|debian)
Victor Morales071b81c2017-11-07 14:13:07 -0800229 install_packages software-properties-common linux-image-extra-$(uname -r) linux-image-extra-virtual apt-transport-https ca-certificates curl
Victor Morales9f1c94b2017-11-07 07:56:04 -0800230 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
231 add-apt-repository \
232 "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
233 $(lsb_release -cs) stable"
234 ;;
235 rhel|centos|fedora)
236 ;;
237 esac
Victor Morales332d7d82017-11-06 11:51:37 -0800238 update_repos
Victor Morales7abf1a82017-11-06 09:20:27 -0800239
Victor Moralesdd074802017-07-26 16:06:35 -0500240 install_package docker-ce
Idan Amite17b5ec2017-08-16 14:17:59 +0300241 _configure_docker_settings
Victor Moralesdd074802017-07-26 16:06:35 -0500242}
243
244# pull_docker_image() - Pull Docker container image from the Public Docker Registry Hub
245function pull_docker_image {
246 install_docker
247 local image=$1
248 local tag=$2
249 docker pull ${image}
250 if [ ${tag} ]; then
251 docker tag ${image} $tag
252 fi
253}
254
Victor Morales472a3062018-02-02 08:26:50 -0800255# wait_docker_pull() - Function that waits for all docker pull processes
256function wait_docker_pull {
257 local counter=60
258 local delay=${1:-60}
259
260 sleep $delay
261 while [ $(ps -ef | grep "docker pull" | wc -l) -gt 1 ]; do
262 sleep $delay
263 counter=$((counter - 1))
264 if [ "$counter" -eq 0 ]; then
265 break
266 fi
267 done
268}
269
Victor Morales9d205bc2017-12-01 17:52:07 -0800270# run_docker_image() - Starts a Docker instance
271function run_docker_image {
272 install_docker
273 docker run $@
274}
275
Victor Morales96fe3882018-03-02 14:08:39 -0800276# run_docker_compose() - Ensures that docker compose is installed and run it in background
277function run_docker_compose {
278 local folder=$1
279
280 install_docker_compose
281 pushd $folder
282 /opt/docker/docker-compose up -d
283 popd
284}
285
Victor Moralesdd074802017-07-26 16:06:35 -0500286# install_docker_compose() - Download and install docker-engine
287function install_docker_compose {
288 local docker_compose_version=${1:-1.12.0}
289 if [ ! -d /opt/docker ]; then
290 mkdir /opt/docker
291 curl -L https://github.com/docker/compose/releases/download/$docker_compose_version/docker-compose-`uname -s`-`uname -m` > /opt/docker/docker-compose
292 chmod +x /opt/docker/docker-compose
293 fi
294}
295
Victor Moralesf6dbe282018-03-05 10:58:15 -0800296# install_chefdk() - Install ChefDK package
297function install_chefdk {
298 local chefdk_version="2.4.17"
299
300 if is_package_installed chefdk; then
301 return
302 fi
303 pushd $(mktemp -d)
304 source /etc/os-release || source /usr/lib/os-release
305 case ${ID,,} in
306 *suse)
307 ;;
308 ubuntu|debian)
309 chefdk_pkg="chefdk_$chefdk_version-1_amd64.deb"
310 chefdk_url="https://packages.chef.io/files/stable/chefdk/$chefdk_version/ubuntu/$VERSION_ID/$chefdk_pkg"
311
312 wget $chefdk_url
313 dpkg -i $chefdk_pkg
314 apt-get install -f -y
315 ;;
316 rhel|centos|fedora)
317 rpm -Uvh "https://packages.chef.io/files/stable/chefdk/$chefdk_version/el/7/chefdk-$chefdk_version-1.el7.x86_64.rpm"
318 ;;
319 esac
320 popd
321}
322
Victor Moralesdd074802017-07-26 16:06:35 -0500323# _install_ODL() - Download and Install OpenDayLight SDN controller
324function _install_ODL {
325 if [ ! -d /opt/opendaylight/current ]; then
326 mkdir -p /opt/opendaylight/
327 wget "https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/"$odl_version"/distribution-karaf-"$odl_version".tar.gz" -P /opt/
Victor Moralesfa9eb9c2017-12-18 09:56:13 -0800328 tar xvf "/opt/distribution-karaf-"$odl_version".tar.gz" -C /tmp/
329 mv "/tmp/distribution-karaf-"$odl_version /opt/opendaylight/current
Victor Moralesdd074802017-07-26 16:06:35 -0500330 rm -rf "/opt/distribution-karaf-"$odl_version".tar.gz"
331 fi
332}
333
334# start_ODL() - Start OpenDayLight SDN controller
335function start_ODL {
336 _install_ODL
337 if [ -d /opt/opendaylight ]; then
338 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
339 /opt/opendaylight/current/bin/start
340 sleep 180
341 /opt/opendaylight/current/bin/client feature:install odl-dlux-all
342 fi
343}
344
345# compile_src() - Function that compiles the java source code thru maven
346function compile_src {
347 local src_folder=$1
348 pushd $src_folder
Victor Morales7abf1a82017-11-06 09:20:27 -0800349 local mvn_build='mvn clean install -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dadditionalparam=-Xdoclint:none'
350 if [[ "$debug" == "False" ]]; then
351 mvn_build+=" -q"
352 fi
Victor Moralesdd074802017-07-26 16:06:35 -0500353 if [ -f pom.xml ]; then
354 install_maven
Victor Morales7abf1a82017-11-06 09:20:27 -0800355 echo "Compiling $src_folder folder..."
356 eval $mvn_build
Victor Moralesdd074802017-07-26 16:06:35 -0500357 fi
358 popd
359}
360
Victor Moralesf1f1ba52017-11-20 16:38:28 -0800361# compile_repos() - Function that compiles source repositories for a given project
362function compile_repos {
363 local project=$1
Victor Moralesf1f1ba52017-11-20 16:38:28 -0800364
Victor Morales54646642017-12-08 11:57:42 -0800365 for repo in ${repos[$project]}; do
366 compile_src ${src_folders[$project]}${repo#*$project}
Victor Moralesf1f1ba52017-11-20 16:38:28 -0800367 done
368}
369
Victor Morales89ce3212017-06-16 18:32:48 -0500370# build_docker_image() - Build Docker container image from source code
371function build_docker_image {
372 local src_folder=$1
373 local profile=$2
Victor Morales89ce3212017-06-16 18:32:48 -0500374 install_docker
375 pushd $src_folder
376
Victor Morales9d205bc2017-12-01 17:52:07 -0800377 if [ -f pom.xml ]; then
378 install_maven
379 # Cleanup external repo
380 sed -i 's|${docker.push.registry}/||g' pom.xml
Victor Moralesbe844712018-01-22 10:07:28 -0800381 local docker_build="mvn clean package docker:build -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true"
Victor Morales9d205bc2017-12-01 17:52:07 -0800382 if [ $profile ]; then
383 docker_build+=" -P $profile"
Victor Moralesdd074802017-07-26 16:06:35 -0500384 fi
Victor Morales472a3062018-02-02 08:26:50 -0800385 if [[ "$debug" == "False" ]]; then
386 docker_build+=" -q"
387 fi
Victor Morales9d205bc2017-12-01 17:52:07 -0800388 if [ $http_proxy ]; then
389 if ! grep -ql "docker.buildArg.http_proxy" pom.xml ; then
390 docker_build+=" -Ddocker.buildArg.http_proxy=$http_proxy"
391 fi
Victor Moralesdd074802017-07-26 16:06:35 -0500392 if ! grep -ql "docker.buildArg.HTTP_PROXY" pom.xml ; then
Victor Morales9d205bc2017-12-01 17:52:07 -0800393 docker_build+=" -Ddocker.buildArg.HTTP_PROXY=$http_proxy"
394 fi
395 fi
396 if [ $https_proxy ]; then
397 if ! grep -ql "docker.buildArg.https_proxy" pom.xml ; then
398 docker_build+=" -Ddocker.buildArg.https_proxy=$https_proxy"
399 fi
400 if ! grep -ql "docker.buildArg.HTTPS_PROXY" pom.xml ; then
401 docker_build+=" -Ddocker.buildArg.HTTPS_PROXY=$https_proxy"
402 fi
403 fi
404 elif [ -f Dockerfile ]; then
405 # NOTE: Workaround for dmmapbc images
406 sed -i '/LocalKey/d' Dockerfile
407 sed -i "s/nexus3.onap.org\:10003\///g" Dockerfile
408 local docker_build="docker build -t $profile -f ./Dockerfile ."
409 if [ $http_proxy ]; then
410 docker_build+=" --build-arg http_proxy=$http_proxy"
411 docker_build+=" --build-arg HTTP_PROXY=$http_proxy"
412 fi
413 if [ $https_proxy ]; then
414 docker_build+=" --build-arg https_proxy=$https_proxy"
415 docker_build+=" --build-arg HTTPS_PROXY=$https_proxy"
Victor Moralesdd074802017-07-26 16:06:35 -0500416 fi
Victor Morales89ce3212017-06-16 18:32:48 -0500417 fi
Victor Morales9d205bc2017-12-01 17:52:07 -0800418 echo $docker_build
419 eval $docker_build
Victor Morales89ce3212017-06-16 18:32:48 -0500420 popd
421}
Victor Moralesfa9eb9c2017-12-18 09:56:13 -0800422
423# mount_external_partition() - Create partition and mount the external volume
424function mount_external_partition {
425 local dev_name="/dev/$1"
426 local mount_dir=$2
427
428 sfdisk $dev_name << EOF
429;
430EOF
431 mkfs -t ext4 ${dev_name}1
432 mkdir -p $mount_dir
433 mount ${dev_name}1 $mount_dir
434 echo "${dev_name}1 $mount_dir ext4 errors=remount-ro,noatime,barrier=0 0 1" >> /etc/fstab
435}
Nate Potterfdf88f32018-01-17 09:29:35 -0800436
Victor Morales96fe3882018-03-02 14:08:39 -0800437# add_no_proxy_value() - Add no_proxy values into environment file, used for internal IPs generated at deploy time
Nate Potterfdf88f32018-01-17 09:29:35 -0800438function add_no_proxy_value {
439 if [[ `grep "no_proxy" /etc/environment` ]]; then
440 sed -i.bak "s/^no_proxy.*$/&,$1/" /etc/environment
441 else
442 echo "no_proxy=$1" >> /etc/environment
443 fi
444 if [[ `grep "NO_PROXY" /etc/environment` ]]; then
445 sed -i.bak "s/^NO_PROXY.*$/&,$1/" /etc/environment
446 else
447 echo "NO_PROXY=$1" >> /etc/environment
448 fi
449}
Victor Morales96fe3882018-03-02 14:08:39 -0800450