#!/bin/bash

# Runs VOLTHA using a templatized docker stack file.
# We need to use a templatized file to configure a few things that docker doesn't
# make configurable through variables right now, namely number of replicas and
# volume mounts. This runner script first substites some environment variables
# in to the tempated stack file, then runs that stack file.
#
# Look in the stack file template to see what can be configured through environment
# variables - these variable should be set in the environment that runs this script.

set -e

TAG=${TAG:-latest}
STACK_TEMPLATE=${STACK_TEMPLATE:-"voltha-stack.yml.j2"}

start () {
    SWARM_MANAGER_COUNT=$(docker node ls | grep Ready | egrep "(Leader)|(Reachable)" | wc -l | sed -e "s/ //g")
    if [ $SWARM_MANAGER_COUNT -lt 1 ]; then
        echo "No swarm managers found. Run 'docker swarm init' to create a new manager"
        exit 1
    fi

    downloaded=0
    if [ ! -f "$STACK_TEMPLATE" ]; then
        wget https://raw.githubusercontent.com/opencord/voltha/master/compose/voltha-stack.yml.j2
        downloaded=1
    fi

    TMP_STACK_FILE=$(mktemp -u)

    cat $STACK_TEMPLATE 2>&1 | docker run -e RADIUS_ROOT=$RADIUS_ROOT -e CONSUL_ROOT=$CONSUL_ROOT -e VOLTHA_LOGS=$VOLTHA_LOGS -e SWARM_MANAGER_COUNT=$SWARM_MANAGER_COUNT -e ONOS_CONFIG=$ONOS_CONFIG --rm -i ${REGISTRY}${REPOSITORY}voltha-j2:${TAG} - 2>&1 > $TMP_STACK_FILE
    docker stack deploy -c $TMP_STACK_FILE voltha

    rm -f $TMP_STACK_FILE

    if [ $downloaded -eq 1 ]; then
        rm -f $STACK_TEMPLATE
    fi
}

stop () {
    docker stack rm voltha
}

status() {
    if [ -z "$(docker stack ls | grep voltha)" ]; then
        echo "Stopped"
        exit
    fi

    STATUS="Running"
    for i in $(docker service ls --format '{{.Name}}/{{.Replicas}}' | grep "^voltha_" | grep -v voltha_config_push); do
        NAME=$(echo $i | cut -d/ -f1)
        HAVE=$(echo $i | cut -d/ -f2)
        WANT=$(echo $i | cut -d/ -f3)
        if [ $HAVE -ne $WANT ]; then
            echo "$NAME not running: $HAVE of $WANT"
            STATUS="Incomplete"
        fi
    done

    echo $STATUS
}

case $1 in
    start)
        start
        ;;
    status)
        status
        ;;
    stop)
        stop
        ;;
    *)
        echo "Usage: $0 {start|status|stop}" >&2
        exit 1
        ;;
esac
