#!/bin/bash -x
#
# Copyright 2017-2019 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.
#
echo "This is ${WORKSPACE}/scripts/policy/engine.sh"


# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo ${DIR}

# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`
echo ${WORK_DIR}

cd ${WORK_DIR}

# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
  echo "Could not create temp dir"
  exit 1
fi

# bring down maven
mkdir maven
cd maven
curl -O http://apache.claz.org/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar -xzvf apache-maven-3.3.9-bin.tar.gz
ls -l
export PATH=${PATH}:${WORK_DIR}/maven/apache-maven-3.3.9/bin
${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn -v
cd ..

ifconfig

export IP=`ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}'`
if [ -z "$IP" ]; then
	echo "Could not determine IP address"
	exit 1
fi
echo $IP

if ! ifconfig docker0; then
	export DOCKER_IP="$IP"
else
	export DOCKER_IP=`ifconfig docker0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
fi
echo $DOCKER_IP

git clone http://gerrit.onap.org/r/oparent

git clone http://gerrit.onap.org/r/policy/engine
cd engine/packages/docker 
${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn prepare-package --settings ${WORK_DIR}/oparent/settings.xml
docker build -t onap/policy-pe target/policy-pe

cd ${WORK_DIR}
git clone http://gerrit.onap.org/r/policy/drools-pdp
cd drools-pdp/packages/docker 
${WORK_DIR}/maven/apache-maven-3.3.9/bin/mvn prepare-package --settings ${WORK_DIR}/oparent/settings.xml
docker build -t onap/policy-drools target/policy-drools

cd ${WORK_DIR}
git clone http://gerrit.onap.org/r/policy/docker
cd docker

chmod +x config/drools/drools-tweaks.sh

echo $IP > config/pe/ip_addr.txt
ls -l config/pe/ip_addr.txt
cat config/pe/ip_addr.txt

export MTU=9126

export PRELOAD_POLICIES=false
docker-compose -f docker-compose-integration.yml up -d 

if [ ! $? -eq 0 ]; then
	echo "Docker compose failed"
	exit 1
fi 

docker ps

POLICY_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' drools`
echo ${POLICY_IP}

PDP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pdp`
echo ${PDP_IP}

PAP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pap`
echo ${PAP_IP}

BRMS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' brmsgw`
echo ${BRMS_IP}

NEXUS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' nexus`
echo ${NEXUS_IP}

MARIADB_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' mariadb`
echo ${MARIADB_IP}

sleep 3m

docker logs mariadb 2>&1 | grep -q "mysqld: ready for connections"
if [ $? -eq 0 ]; then
	# mariadb is ok - sleep a little longer for others
	sleep 2m

else
	echo mariadb is not ready
	echo Restarting...

	docker kill drools pdp pap brmsgw nexus mariadb
	docker rm -f drools pdp pap brmsgw nexus mariadb

	docker-compose -f docker-compose-integration.yml up -d 
	
	if [ ! $? -eq 0 ]; then
		echo "Docker compose failed"
		exit 1
	fi 
	
	docker ps
	
	POLICY_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' drools`
	echo ${POLICY_IP}
	
	PDP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pdp`
	echo ${PDP_IP}
	
	PAP_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' pap`
	echo ${PAP_IP}
	
	BRMS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' brmsgw`
	echo ${BRMS_IP}
	
	NEXUS_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' nexus`
	echo ${NEXUS_IP}
	
	MARIADB_IP=`docker inspect --format '{{ .NetworkSettings.Networks.docker_default.IPAddress}}' mariadb`
	echo ${MARIADB_IP}
	
	sleep 5m
fi

netstat -tnl

${DIR}/wait_for_port.sh ${MARIADB_IP} 3306
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${MARIADB_IP} 3306"
        telnet ${MARIADB_IP} 3306 < /dev/null
        nc -vz ${MARIADB_IP} 3306
        docker logs mariadb
        exit $rc
fi

${DIR}/wait_for_port.sh ${NEXUS_IP} 8081
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${NEXUS_IP} 8081"
	netstat -tnl
        telnet ${NEXUS_IP} 8081 < /dev/null
        nc -vz ${NEXUS_IP} 8081
        docker logs nexus
        exit $rc
fi

${DIR}/wait_for_port.sh ${POLICY_IP} 9696
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${POLICY_IP} 9696"
	netstat -tnl
        telnet ${POLICY_IP} 9696 < /dev/null
        nc -vz ${POLICY_IP} 9696
        docker logs drools
        exit $rc
fi

${DIR}/wait_for_port.sh ${PAP_IP} 9091
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${PAP_IP} 9091"
	netstat -tnl
        telnet ${PAP_IP} 9091 < /dev/null
        nc -vz ${PAP_IP} 9091
        docker logs pap
        exit $rc
fi

${DIR}/wait_for_port.sh ${PDP_IP} 8081
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${PDP_IP} 8081"
	netstat -tnl
        telnet ${PDP_IP} 8081 < /dev/null
        nc -vz ${PDP_IP} 8081
        docker logs pdp
        exit $rc
fi

${DIR}/wait_for_port.sh ${BRMS_IP} 9989
rc=$?
if [[ $rc != 0 ]]; then
        echo "cannot open ${BRMS_IP} 9989"
	netstat -tnl
        telnet ${BRMS_IP} 9989" < /dev/null
        nc -vz ${BRMS_IP} 9989"
        docker logs brmsgw
        exit $rc
fi

docker logs drools
docker logs pap
docker logs pdp
docker logs brmsgw

TIME_OUT=300
INTERVAL=20 
TIME=0 
while [ "$TIME" -lt "$TIME_OUT" ]; do 
    curl -k -i --user "demo@people.osaaf.org:demo123456!" -H "ContentType: application/json" -H "Accept: application/json" https://${POLICY_IP}:6969/healthcheck && break
	
  echo Sleep: $INTERVAL seconds before testing if Policy is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds 
  sleep $INTERVAL 
  TIME=$(($TIME+$INTERVAL))
	
done

TIME_OUT=300
INTERVAL=20 
TIME=0 
while [ "$TIME" -lt "$TIME_OUT" ]; do 
	
	curl -k -i -v -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'ClientAuth: cHl0aG9uOnRlc3Q=' -H 'Authorization: Basic dGVzdHBkcDphbHBoYTEyMw==' -H 'Environment: TEST' -d '{"policyName": ".*"}' https://${PDP_IP}:8081/pdp/api/getConfig && break
	
echo Sleep: $INTERVAL seconds before testing if Policy is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds 
  sleep $INTERVAL 
  TIME=$(($TIME+$INTERVAL))
	
done

#
# Add more sleep for everything to settle
#
sleep 3m
