#!/bin/bash

function cleanup {
    echo ""
    echo "---- Clean Up RKE ----"
    for i in ./bin/cluster-*.yml; do
        ./bin/rke remove --dind --force --config $i 2>&1 >/dev/null
    done
    rm -f ./bin/*.rkestate ./bin/*.yml
}
trap cleanup TERM EXIT

pids=""
tail_pids=""
RESULT="0"
declare -A versions_to_test
declare -A pids_to_version
declare -A pids_results

echo "INFO - Running $0"
source $(dirname $0)/version

cd $(dirname $0)/..


# Get latest version from rke
all_versions=$(./bin/rke --quiet config --all --list-version | sort -V)

# Get the latest of the major.minor versions.
for ver in $all_versions; do
    # clean up list. Remove blanks
    ver=$(echo $ver | xargs echo -n)
    if [ -z "$ver" ]; then
        continue
    fi

    #split value on .
    split=($(echo $ver | tr '.' '\n'))
    major_ver="${split[0]}.${split[1]}"
    versions_to_test["${major_ver}"]="${ver}"
done

for ver in "${!versions_to_test[@]}"; do
    echo "testing ${versions_to_test["${ver}"]}"

    # Create cluster yaml with random node names
    node=$(cat /dev/urandom | tr -dc a-z | head -c${1:-8})
    cat << EOF > "./bin/cluster-${versions_to_test["${ver}"]}.yml"
kubernetes_version: ${versions_to_test["${ver}"]}
nodes:
- address: rke-node-${node}
  role: [etcd, controlplane, worker]
  user: ubuntu
EOF

    # Run rke - output to logs and track results.
    export DOCKER_API_VERSION=1.24
    ./bin/rke up --dind --config "./bin/cluster-${versions_to_test["${ver}"]}.yml" 2>&1 >"./bin/cluster-${versions_to_test["${ver}"]}.log" &
    pids="$pids $!"
    pid_to_version["$!"]="${versions_to_test["${ver}"]}"

    # Tail logs.
    sleep 1
    tail -f "./bin/cluster-${versions_to_test["${ver}"]}.log" &
    tail_pids="$tail_pids $!"
done

# Wait for rke to finish
for pid in $pids; do
    wait $pid
    pid_results["${pid}"]="$?"
done

# Stop tailing the logs
for pid in $tail_pids; do
    kill $pid 2>&1 >/dev/null
done

echo ""
echo "---- TEST RESULTS ----"
for pid in "${!pid_results[@]}"; do
    if [ "${pid_results["${pid}"]}" == "0" ]; then
        echo "[PASS] ${pid_to_version["${pid}"]}"
    else
        echo "[FAIL] ${pid_to_version["${pid}"]}"
        RESULT="1"
    fi
done

if [ "$RESULT" == "1" ]; then
    exit 1
fi
