#!/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() {
        #
        # the default prefix for docker containers is the directory name containing the docker-compose.yml file.
        # It can be over-written by an env variable COMPOSE_PROJECT_NAME.  This env var seems to be set in the Jenkins CSIT environment
        COMPOSE_PREFIX=${COMPOSE_PROJECT_NAME:-dockercompose}
        export COMPOSE_PROJECT_NAME=$COMPOSE_PREFIX
        echo "COMPOSE_PROJECT_NAME=$COMPOSE_PROJECT_NAME"
        echo "COMPOSE_PREFIX=$COMPOSE_PREFIX"

        # 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
        docker ps

        # Wait for initialization of Docker contaienr for DMaaP MR, Kafka and Zookeeper
        for i in {1..50}; do
            if [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ] && \
                [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_zookeeper_1) ] && \
                [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_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}}' ${COMPOSE_PREFIX}_dmaap_1)
        IP=${DMAAP_MR_IP}
        KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_kafka_1)
        ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_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/' /var/tmp/MsgRtrApi.properties
        sed -i -e 's/<kafka_host>:<kafka_port>/kafka:9092/' /var/tmp/MsgRtrApi.properties

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

        # Wait for initialization of Docker containers
        for i in {1..50}; do
                if [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_dmaap_1) ] && \
                        [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_zookeeper_1) ] && \
                        [ $(docker inspect --format '{{ .State.Running }}' ${COMPOSE_PREFIX}_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}}' ${COMPOSE_PREFIX}_dmaap_1)
        IP=${DMAAP_MR_IP}
        KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_kafka_1)
        ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${COMPOSE_PREFIX}_zookeeper_1)

        echo "After restart of ZK and Kafka..."
        echo DMAAP_MR_IP=${DMAAP_MR_IP}
        echo IP=${IP}
        echo KAFKA_IP=${KAFKA_IP}
        echo ZOOKEEPER_IP=${ZOOKEEPER_IP}

        source ${SCRIPTS}/common_functions.sh
        bypass_ip_adress ${DMAAP_MR_IP}
        bypass_ip_adress ${KAFKA_IP}
        bypass_ip_adress ${ZOOKEEPER_IP}

        # 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
}

