#!/bin/bash
#
# ============LICENSE_START=======================================================
# ONAP DMAAP MR 
# ================================================================================
# Copyright (C) 2018 AT&T Intellectual Property. All rights
#                             reserved.
# ================================================================================
# 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.
# ============LICENSE_END============================================
# ===================================================================
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
#
# This script is a copy of plans/dmaap/mrpubsub/setup.sh, placed in the scripts
# dir, and edited to be a callable function from other plans. e.g. dmaap-buscontroller needs it.
#
source ${SCRIPTS}/common_functions.sh

# function to launch DMaaP MR docker containers.
# sets global var IP with assigned IP address of MR container.
# (kafka and zk containers are not called externally)

function dmaap_mr_launch() {
		# Clone DMaaP Message Router repo
		mkdir -p $WORKSPACE/archives/dmaapmr
		cd $WORKSPACE/archives/dmaapmr
		#unset http_proxy https_proxy
		git clone --depth 1 http://gerrit.onap.org/r/dmaap/messagerouter/messageservice -b master
		cd messageservice
		git pull
		cd $WORKSPACE/archives/dmaapmr/messageservice/src/main/resources/docker-compose
		cp $WORKSPACE/archives/dmaapmr/messageservice/bundleconfig-local/etc/appprops/MsgRtrApi.properties /var/tmp/


		# start DMaaP MR containers with docker compose and configuration from docker-compose.yml
		docker login -u docker -p docker nexus3.onap.org:10001
		docker-compose up -d

		# Wait for initialization of Docker contaienr for DMaaP MR, Kafka and Zookeeper
		for i in {1..50}; do
			if [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ] && \
				[ $(docker inspect --format '{{ .State.Running }}' dockercompose_zookeeper_1) ] && \
				[ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ] 
			then
				echo "DMaaP Service Running"	
				break    		
			else 
				echo sleep $i		
				sleep $i
			fi
		done


		DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_dmaap_1)
		IP=${DMAAP_MR_IP}
		KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_kafka_1)
		ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dockercompose_zookeeper_1)

		echo DMAAP_MR_IP=${DMAAP_MR_IP}
		echo IP=${IP}
		echo KAFKA_IP=${KAFKA_IP}
		echo ZOOKEEPER_IP=${ZOOKEEPER_IP}

		# Initial docker-compose up and down is for populating kafka and zookeeper IPs in /var/tmp/MsgRtrApi.properites
		docker-compose down 

		# Update kafkfa and zookeeper properties in MsgRtrApi.propeties which will be copied to DMaaP Container
		sed -i -e 's/<zookeeper_host>/'$ZOOKEEPER_IP'/' /var/tmp/MsgRtrApi.properties
		sed -i -e 's/<kafka_host>:<kafka_port>/'$KAFKA_IP':9092/' /var/tmp/MsgRtrApi.properties

		docker-compose build
		docker login -u docker -p docker nexus3.onap.org:10001
		docker-compose up -d 

		# Wait for initialization of Docker containers
		for i in {1..50}; do
				if [ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ] && \
						[ $(docker inspect --format '{{ .State.Running }}' dockercompose_zookeeper_1) ] && \
						[ $(docker inspect --format '{{ .State.Running }}' dockercompose_dmaap_1) ]
				then
						echo "DMaaP Service Running"
						break
				else
						echo sleep $i
						sleep $i
				fi
		done

		# Wait for initialization of docker services
		for i in {1..50}; do
			curl -sS -m 1 ${DMAAP_MR_IP}:3904/events/TestTopic && break 
			echo sleep $i
			sleep $i
		done
}

