#!/bin/sh

# Copyright 2019 ETSI
#
# 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.

WAIT_TIME=340  # LCM healthcheck needs 2x(30+140) senconds
SERVICES_WITH_HEALTH="nbi ro zookeeper lcm mon light-ui pol kafka"
NUM_SERVICES_WITH_HEALTH=$(echo $SERVICES_WITH_HEALTH | wc -w)
WAIT_FINAL=30
OSM_DEPLOYMENT="light-ui nbi lcm ro mon pol keystone"
OSM_STATEFULSET="zookeeper kafka mongo mysql prometheus"
NUM_K8S_PODS=$(echo $OSM_DEPLOYMENT $OSM_STATEFULSET | wc -w)

while getopts "w:s:n:c:k" o; do
    case "${o}" in
        w)
            WAIT_TIME=${OPTARG}
            ;;
        s)
            STACK_NAME=${OPTARG}
            ;;
        n)
            NUM_SERVICES_WITH_HEALTH=${OPTARG}
            ;;
        c)
            SERVICES_WITH_HEALTH="${OPTARG}"
            ;;
        k)
            KUBERNETES="y"
            ;;
    esac
done


time=0
step=2
while [ $time -le "$WAIT_TIME" ]; do
    if [ -n "$KUBERNETES" ]; then
        if [ "$(kubectl get pods -n "${STACK_NAME}" | grep -i running | wc -l)" -ge "$NUM_K8S_PODS" ]; then
            #all pods are running now.
            sleep $WAIT_FINAL
            exit 0
        fi
    else
        if [ "$(sg docker -c "docker ps" | grep " ${STACK_NAME}_" | grep -i healthy | wc -l)" -ge "$NUM_SERVICES_WITH_HEALTH" ]; then
            # all dockers are healthy now.
            # final sleep is needed until more health checks are added to validate system is ready to handle requests
            sleep $WAIT_FINAL
            exit 0
        fi
    fi

    sleep $step
    time=$((time+step))
done

if [ -n "$KUBERNETES" ]; then
    echo "Not all pods are running"
    kubectl get pods -n "${STACK_NAME}"
    for POD in $OSM_DEPLOYMENT $OSM_STATEFULSET; do
        kubectl get pods -n "${STACK_NAME}" | grep -i running | grep -q ^"${POD}-" && continue
        echo
        echo BEGIN LOGS of pods ${POD} not running
        LOG_POD=$(kubectl get pods -n "${STACK_NAME}" | grep -e ^"${POD}-" | awk '{print $1}' )
        [ -z "$LOG_POD" ] && echo "${POD} Failed to deploy" || kubectl logs ${LOG_POD} -n $STACK_NAME 2>&1 | tail -n 100
        echo END LOGS of services $POD not running
    done
else
    echo "Not all Docker services are healthy"
    sg docker -c "docker ps" | grep " ${STACK_NAME}_"
    for S_WITH_HEALTH in $SERVICES_WITH_HEALTH ; do
        sg docker -c "docker ps" | grep " ${STACK_NAME}_" | grep -i healthy | grep -q "_${S_WITH_HEALTH}."  && continue
        echo
        echo BEGIN LOGS of container ${S_WITH_HEALTH} not healthy
        sg docker -c "docker service logs ${STACK_NAME}_${S_WITH_HEALTH} 2>&1" | tail -n 100
        echo END LOGS of container ${S_WITH_HEALTH} not healthy
        echo
    done
fi

exit 1
