Implement steps for Multicloud Images
[integration.git] / bootstrap / vagrant-onap / lib / functions
1 #!/bin/bash
2
3 source /var/onap/commons
4 source /var/onap/_composed_functions
5 source /var/onap/_onap_functions
6
7 export MTU=$(/sbin/ifconfig | grep MTU | sed 's/.*MTU://' | sed 's/ .*//' |sort -n | head -1)
8 export NIC=$(ip route get 8.8.8.8 | awk '{ print $5; exit }')
9 export IP_ADDRESS=$(ifconfig $NIC | grep "inet addr" | tr -s ' ' | cut -d' ' -f3 | cut -d':' -f2)
10
11 mvn_conf_file=/root/.m2/settings.xml
12 git_src_folder=/opt
13
14 # configure_dns() - DNS/GW IP address configuration
15 function configure_dns {
16     echo "nameserver 10.0.0.1" >> /etc/resolvconf/resolv.conf.d/head
17     resolvconf -u
18 }
19
20 # get_next_ip() - Function that provides the next ip
21 function 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
28 # _git_timed() - git can sometimes get itself infinitely stuck with transient network
29 # 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.
32 function _git_timed {
33     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
53 function clone_repo {
54     local repo_url=${3:-"https://git.onap.org/"}
55     local repo=$1
56     local dest_folder=${2:-$git_src_folder/$repo}
57     if [ ! -d $dest_folder ]; then
58         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
63     else
64         pushd $dest_folder
65         _git_timed pull
66         popd
67     fi
68 }
69
70 # _install_bind() - Install bind utils
71 function _install_bind {
72     install_packages bind9 bind9utils
73 }
74
75 # install_java() - Install java binaries
76 function install_java {
77     if is_package_installed openjdk-8-jdk; then
78         return
79     fi
80     source /etc/os-release || source /usr/lib/os-release
81     case ${ID,,} in
82         *suse)
83         ;;
84         ubuntu|debian)
85             install_package software-properties-common
86             add-apt-repository -y ppa:openjdk-r/ppa
87         ;;
88         rhel|centos|fedora)
89         ;;
90     esac
91     update_repos
92
93     # Remove Java 7
94     uninstall_packages default-jre openjdk-7-jdk openjdk-7-jre openjdk-7-jre-headless
95
96     install_package openjdk-8-jdk
97     # ca-certificates-java is not a dependency in the Oracle JDK/JRE so this must be explicitly installed.
98     /var/lib/dpkg/info/ca-certificates-java.postinst configure
99 }
100
101 # install_maven() - Install maven binaries
102 function install_maven {
103     if is_package_installed maven3; then
104         return
105     fi
106     install_java
107     source /etc/os-release || source /usr/lib/os-release
108     case ${ID,,} in
109         *suse)
110         ;;
111         ubuntu|debian)
112             install_package software-properties-common
113             add-apt-repository -y ppa:andrei-pozolotin/maven3
114         ;;
115         rhel|centos|fedora)
116         ;;
117     esac
118     update_repos
119     install_package maven3
120
121     # Remove Java 7
122     uninstall_package openjdk-7-jdk
123
124     _configure_maven
125 }
126
127 # _configure_docker_settings() - Configures Docker settings
128 function _configure_docker_settings {
129     local docker_conf_backup=/tmp/docker.backup
130     local docker_conf=/etc/default/docker
131     local chameleonsocks_filename=chameleonsocks.sh
132
133     cp $docker_conf $docker_conf_backup
134     if [ $http_proxy ]; then
135         echo "export http_proxy=$http_proxy" >> $docker_conf
136     fi
137     if [ $https_proxy ]; then
138         echo "export https_proxy=$https_proxy" >> $docker_conf
139         #If you have a socks proxy, then use that to connect to the nexus repo
140         #via a redsocks container
141         if [ $socks_proxy ]; then
142             wget https://raw.githubusercontent.com/crops/chameleonsocks/master/$chameleonsocks_filename
143             chmod 755 $chameleonsocks_filename
144             socks=$(echo $socks_proxy | sed -e "s/^.*\///" | sed -e "s/:.*$//")
145             port=$(echo $socks_proxy | sed -e "s/^.*://")
146             PROXY=$socks PORT=$port ./$chameleonsocks_filename --install
147             rm $chameleonsocks_filename
148             cp $docker_conf_backup $docker_conf
149         fi
150     fi
151     rm $docker_conf_backup
152
153     echo "DOCKER_OPTS=\"-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\"" >> $docker_conf
154 }
155
156 # install_nodejs() - Download and install NodeJS
157 function install_nodejs {
158     if is_package_installed nodejs; then
159         return
160     fi
161     curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
162     install_package nodejs
163
164     # Update NPM to latest version
165     npm install npm -g
166 }
167
168 # install_python() - Install Python 2.7 and other tools necessary for development.
169 function install_python {
170     install_packages python2.7 python-dev
171 }
172
173 # _install_pip() - Install Python Package Manager
174 function _install_pip {
175     install_python
176     if ! which pip; then
177         curl -sL https://bootstrap.pypa.io/get-pip.py | python
178     fi
179 }
180
181 # install_python_package() - Install python modules
182 function install_python_package {
183     local python_packages=$@
184
185     _install_pip
186     pip install $python_packages
187 }
188
189 # install_python_requirements() - Install a list of python modules defined in requirement.txt file
190 function install_python_requirements {
191     local python_project_path=$1
192
193     _install_pip
194     pushd $python_project_path
195     pip install -r requirements.txt
196     popd
197 }
198
199 # install_docker() - Download and install docker-engine
200 function install_docker {
201     if is_package_installed docker-ce; then
202         return
203     fi
204     source /etc/os-release || source /usr/lib/os-release
205     case ${ID,,} in
206         *suse)
207         ;;
208         ubuntu|debian)
209             install_packages software-properties-common linux-image-extra-$(uname -r) linux-image-extra-virtual apt-transport-https ca-certificates curl
210             curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
211             add-apt-repository \
212             "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
213             $(lsb_release -cs) stable"
214         ;;
215         rhel|centos|fedora)
216         ;;
217     esac
218     update_repos
219
220     install_package docker-ce
221     _configure_docker_settings
222     service docker restart
223     sleep 10
224 }
225
226 # pull_docker_image() - Pull Docker container image from the Public Docker Registry Hub
227 function pull_docker_image {
228     install_docker
229     local image=$1
230     local tag=$2
231     docker pull ${image}
232     if [ ${tag} ]; then
233         docker tag ${image} $tag
234     fi
235 }
236
237 # install_docker_compose() - Download and install docker-engine 
238 function install_docker_compose {
239     local docker_compose_version=${1:-1.12.0}
240     if [ ! -d /opt/docker ]; then
241         mkdir /opt/docker
242         curl -L https://github.com/docker/compose/releases/download/$docker_compose_version/docker-compose-`uname -s`-`uname -m` > /opt/docker/docker-compose
243         chmod +x /opt/docker/docker-compose
244     fi
245 }
246
247 # _install_ODL() - Download and Install OpenDayLight SDN controller
248 function _install_ODL {
249     if [ ! -d /opt/opendaylight/current ]; then
250         mkdir -p /opt/opendaylight/
251         wget "https://nexus.opendaylight.org/content/repositories/public/org/opendaylight/integration/distribution-karaf/"$odl_version"/distribution-karaf-"$odl_version".tar.gz" -P /opt/
252         tar xvf "/opt/distribution-karaf-"$odl_version".tar.gz" -C /opt/
253         mv "/opt/distribution-karaf-"$odl_version /opt/opendaylight/current
254         rm -rf "/opt/distribution-karaf-"$odl_version".tar.gz"
255     fi
256 }
257
258 # start_ODL() - Start OpenDayLight SDN controller
259 function start_ODL {
260     _install_ODL
261     if [ -d /opt/opendaylight ]; then
262         export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
263         /opt/opendaylight/current/bin/start
264         sleep 180
265         /opt/opendaylight/current/bin/client feature:install odl-dlux-all
266     fi
267 }
268
269 # compile_src() - Function that compiles the java source code thru maven
270 function compile_src {
271     local src_folder=$1
272     pushd $src_folder
273     local mvn_build='mvn clean install -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dadditionalparam=-Xdoclint:none'
274     if [[ "$debug" == "False" ]]; then
275         mvn_build+=" -q"
276     fi
277     if [ -f pom.xml ]; then
278         install_maven
279         echo "Compiling $src_folder folder..."
280         eval $mvn_build
281     fi
282     popd
283 }
284
285 # build_docker_image() - Build Docker container image from source code
286 function build_docker_image {
287     local src_folder=$1
288     local profile=$2
289     install_maven
290     install_docker
291     pushd $src_folder
292
293     # Cleanup external repo
294     sed -i 's|${docker.push.registry}/||g' pom.xml
295     local mvn_docker="mvn clean package docker:build"
296     if [ $profile ]; then
297         mvn_docker+=" -P $profile"
298     fi
299     if [ $http_proxy ]; then
300         if ! grep -ql "docker.buildArg.http_proxy" pom.xml ; then
301             mvn_docker+=" -Ddocker.buildArg.http_proxy=$http_proxy"
302         fi
303         if ! grep -ql "docker.buildArg.HTTP_PROXY" pom.xml ; then
304             mvn_docker+=" -Ddocker.buildArg.HTTP_PROXY=$http_proxy"
305         fi
306     fi
307     if [ $https_proxy ]; then
308         if ! grep -ql "docker.buildArg.https_proxy" pom.xml ; then
309             mvn_docker+=" -Ddocker.buildArg.https_proxy=$https_proxy"
310         fi
311         if ! grep -ql "docker.buildArg.HTTPS_PROXY" pom.xml ; then
312             mvn_docker+=" -Ddocker.buildArg.HTTPS_PROXY=$https_proxy"
313         fi
314     fi
315     eval $mvn_docker
316     popd
317 }