#!/bin/bash
#
# ============LICENSE_START=======================================================
# ONAP AAF
# ================================================================================
# Copyright (C) 2017 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.
#
# Place the scripts in run order:
source ${SCRIPTS}/common_functions.sh

# Clone AAF Authz repo
mkdir -p $WORKSPACE/archives/aafcsit
cd $WORKSPACE/archives/aafcsit
#unset http_proxy https_proxy
git clone --depth 1 http://gerrit.onap.org/r/aaf/authz -b master
git pull
cd $WORKSPACE/archives/aafcsit/authz/auth/auth-service/src/main/resources/docker-compose
pwd
chmod -R 777 $WORKSPACE/archives/aafcsit/authz/auth/auth-service/src/main/resources/docker-compose


# start aaf containers with docker compose and configuration from docker-compose.yml
docker-compose up -d
export aaf_service=$(get_docker_compose_service aaf_container)
export cassandra_service=$(get_docker_compose_service cassandra_container)

# Wait for initialization of Docker container for AAF & Cassandra
for i in {1..12}; do

	if [ $(docker inspect --format '{{ .State.Running }}' $aaf_service) ] && \
		[ $(docker inspect --format '{{ .State.Running }}' $cassandra_service) ]
	then
		echo "AAF Service Running"
		break
	else
		echo sleep $i
		sleep $i
	fi
done


AAF_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $aaf_service)
CASSANDRA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $cassandra_service)

bypass_ip_adress $AAF_IP
bypass_ip_adress $CASSANDRA_IP

echo AAF_IP=${AAF_IP}
echo CASSANDRA_IP=${CASSANDRA_IP}


# Wait for initialization of docker services
for i in {1..12}; do
    curl -sS -m 1 ${AAF_IP}:8101 && break
    echo sleep $i
    sleep $i
done

#Pass any variables required by Robot test suites in ROBOT_VARIABLES
ROBOT_VARIABLES="-v AAF_IP:${AAF_IP}"
