#!/bin/sh

. "$TESTSUITE_LIB_UTILS"

[ -z "$REDIS_TMPDIR" ] && die "REDIS_TMPDIR must be set"
[ -z "$REDIS_CONFIGS_DIR" ] && die "REDIS_CONFIGS_DIR must be set"
[ -z "$REDIS_HOST" ] && die "REDIS_HOST must be set"
[ -z "$REDIS_CLUSTER_PORTS" ] && die "REDIS_CLUSTER_PORTS must be set"
[ -z "$REDIS_CLUSTER_REPLICAS" ] && die "REDIS_CLUSTER_REPLICAS must be set"

REDIS_DATADIR="$REDIS_TMPDIR/data"
REDIS_LOGSDIR="$REDIS_TMPDIR/logs"
REDIS_SLEEP_WORKAROUND_SECONDS=${REDIS_SLEEP_WORKAROUND_SECONDS:=3}

REDIS_SERVER=$(find_binary_or_die redis-server)
REDIS_CLI=$(find_binary_or_die redis-cli)

REDIS_INSTS=

wait_redis_ready() {
    local HOST=$1
    local PORT=$2
    for i in $(seq 1 10);
    do
        if [ $($REDIS_CLI -h $HOST -p $PORT ping) = PONG ] ; then
            return ;
        fi
        echo "retry to connect to redis instance on $HOST:$PORT"
        sleep 1
    done
    die "Failed to connect to redis instance on port $HOST:$PORT"
}

start() {
    rm -rf $REDIS_DATADIR

    mkdir -p $REDIS_TMPDIR
    mkdir -p $REDIS_DATADIR
    mkdir -p $REDIS_LOGSDIR

    for port in ${REDIS_CLUSTER_PORTS}; do
        config=$REDIS_CONFIGS_DIR/redis_cluster_node0.conf
        pidfile="$(get_pidfile $port)"
        logfile=$REDIS_LOGSDIR/redis_cluster$port.log
        datadir=$REDIS_DATADIR/$port
        echo "Starting redis cluster node on $port $logfile ..."
        mkdir -p $datadir
        $REDIS_SERVER $config \
                      --pidfile $pidfile \
                      --dir $datadir \
                      --port $port \
                      --dbfilename redis_cluster$port.db \
                      --logfile "$logfile" || {
            dump_log_stderr "$logfile"
            die "Failed to start redis ($port) server"
        }
        wait_redis_ready $REDIS_HOST $port
        REDIS_INSTS="$REDIS_INSTS $REDIS_HOST:$port"
    done

    echo "Creating redis cluster ..."
    $REDIS_CLI --cluster create $REDIS_INSTS \
        --cluster-replicas $REDIS_CLUSTER_REPLICAS \
        --cluster-yes || \
        die "Failed to create a redis cluster"
    echo "Created redis cluster ..."

    sleep $REDIS_SLEEP_WORKAROUND_SECONDS
}

stop() {
    for port in ${REDIS_CLUSTER_PORTS}; do
        pidfile="$(get_pidfile $port)"
        stop_daemon $REDIS_SERVER $pidfile
    done
}

script_main "$@"
