#!/bin/bash

# Copyright 2017 the original author or authors.
#
# 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.

PROG=$(basename $0)
BASE_DIR=$(pwd)

GREEN='\033[32;1m'
RED='\033[0;31m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color

SERVICES=""
STACKS="consul kafka fluentd voltha"
NETWORKS="voltha_net kafka_net"

usage() {
    echo >&2 "$PROG: [-d <dir>] [-l <log-dir>] [-h]"
    echo >&2 "  -z              zero out the consul data"
    echo >&2 "  -h              this message"
}

VOLUME_CLEANUP=0

OPTIND=1
while getopts d:l:c:zh OPT; do
    case "$OPT" in
        z) VOLUME_CLEANUP=1;;
        c) export CONSUL_ROOT="$OPTARG";;
        h) usage;
           exit 1;;
        esac
done

for s in $SERVICES; do
    echo -n "[service] $s ... "
    if [ $(docker service ls | grep $s | wc -l) -ne 0 ]; then
        OUT=$(docker service rm $s 2>&1)
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}removed${NC}"
        else
            echo -e "${RED}ERROR: $OUT${NC}"
        fi
    else
        echo -e "${WHITE}not running${NC}"
    fi
done

for s in $STACKS; do
    echo -n "[stack] $s ... "
    if [ $(docker stack ls | grep $s | wc -l) -ne 0 ]; then
        OUT=$(docker stack rm $s 2>&1)
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}removed${NC}"
        else
            echo -e "${RED}ERROR: $OUT${NC}"
        fi
    else
        echo -e "${WHITE}not running${NC}"
    fi
done

for n in $NETWORKS; do
    echo -n "[network] $n ... "
    if [ $(docker network ls | grep $n | wc -l) -ne 0 ]; then
        OUT=$(docker network rm $n 2>&1)
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}removed${NC}"
        else
            echo -e "${RED}ERROR: $OUT${NC}"
        fi
    else
        echo -e "${WHITE}not running${NC}"
    fi
done

# Attempt to count Ready Docker Swarm managers
SWARM_MANAGER_COUNT=$(docker node ls | grep Ready | egrep '(Leader)|(Reachable)' | wc -l)
echo -n "[volume] consul ... "
if [ $VOLUME_CLEANUP -ne 0 ]; then
    RUNNING=$(docker service ps volume_cleanup 2> /dev/null | wc -l)
    if [ $RUNNING -ne 0 ]; then
        docker service rm volume_cleanup > /dev/null
    fi
    docker service create --detach=true --restart-condition=none \
    --mode=global --name=volume_cleanup \
    --mount=type=bind,src=${CONSUL_ROOT:-/cord/incubator/voltha/consul}/data,dst=/consul/data \
    --mount=type=bind,src=${CONSUL_ROOT:-/cord/incubator/voltha/consul}/config,dst=/consul/config \
    alpine:latest \
    ash -c 'rm -rf /consul/data/* /consul/config/*' > /dev/null

    RETRY=10
    while [ $RETRY -ge 0 ]; do
        COMPLETE=$(docker service ps --filter 'desired-state=Shutdown' --format '{{.DesiredState}}' volume_cleanup | wc -l)
        ERRORS=$(docker service ps --format '{{.Error}}' volume_cleanup  | grep -v "^$" | wc -l)
        if [ $COMPLETE -eq $SWARM_MANAGER_COUNT ]; then
           if [ $ERRORS -eq 0 ]; then
               echo -e "${GREEN}data removed${NC}"
               docker service rm volume_cleanup > /dev/null
               break
           else
               echo -e "${RED}ERROR: $(docker service ps --format '{{.Error}}' volume_cleanup | awk '{printf("%s ", $0)}')${NC}"
               exit 1
           fi

        fi
        sleep 5
        RETRY=$(expr $RETRY - 1)
    done
else
   echo -e "${WHITE}skipped${NC}" 
fi
