#!/bin/bash

set -euo pipefail

TIME=$(date +%s)
EXIT_CODE=0

# CLI params
ECR_ACCOUNT_ID=$1
ECR_REGION=$2
IMAGE_NAME=$3
DATA_DIR=$4
COMMAND=("${@:5}")
IMAGE_TAG="DB-$IMAGE_NAME-$TIME"

# avoid thundering herd on jenkins
sleep $((RANDOM % 20 + 1))
MAX_RUNNING=3
SLEEP_INTERVAL=5
while true; do
    NUM_RUNNING=$(docker ps --filter='name=DB' -q | wc -l)
    if [[ $NUM_RUNNING -lt $MAX_RUNNING ]]; then
        break
    fi
    echo "Waiting for running containers to drop below $MAX_RUNNING. Currently: $NUM_RUNNING"
    sleep $SLEEP_INTERVAL
done

# pull down image
docker run \
    --pull always \
    --name $IMAGE_TAG \
    --tmpfs $DATA_DIR \
    -d \
    $ECR_ACCOUNT_ID.dkr.ecr.$ECR_REGION.amazonaws.com/docker-database-images:$IMAGE_NAME

# wait for healthy status
HEALTH='unknown'
STATUS='unknown'
SLEEP_INTERVAL=5
TIMEOUT=600
while true; do
    STATUS=$(docker inspect --format='{{.State.Status}}' $IMAGE_TAG)
    HEALTH=$(docker inspect --format='{{.State.Health.Status}}' $IMAGE_TAG)
    echo "Current: $HEALTH and $STATUS"
    if [[ "$HEALTH" == "healthy" || $TIMEOUT -le 0 ]]; then
        break
    fi
    if [[ "$STATUS" == "exited" ]]; then
        echo "Container exited."
        break
    fi
    sleep $SLEEP_INTERVAL
    TIMEOUT=$((TIMEOUT - SLEEP_INTERVAL))
    echo "Time remaining: $TIMEOUT seconds"
done

# something went wrong
if [ "$HEALTH" != "healthy" ]; then
    docker logs $IMAGE_TAG
    EXIT_CODE=1

# run command to check behavior
else
    docker exec $IMAGE_TAG "${COMMAND[@]}"
fi

# cleanup
set +x
docker stop $IMAGE_TAG
docker rm $IMAGE_TAG

exit $EXIT_CODE
