#!/bin/bash

set -e

. ./CLUSTER-SERVER/_mongodb_cluster_common.bash

failures=0

check_endpoint()
{
    description=$1
    host=$2
    port=$3

    printf "%-30s %s:%s ... " "$description" "$host" "$port"
    if gs_mongodb_cluster_shell_eval \
        "$host" "$port" \
        'quit(db.getSiblingDB("admin").runCommand({ping:1}).ok === 1 ? 0 : 1)' \
        >/dev/null 2>&1
    then
        echo "OK"
    else
        echo "NOT AVAILABLE"
        failures=$((failures + 1))
    fi
}

check_endpoint \
    "Config server" \
    "$GS_MONGODB_CONFIG_SERVER_HOSTNAME" \
    "$GS_MONGODB_CONFIG_SERVER_PORT"

for shard_index in "${!GS_MONGODB_SHARD_HOSTNAMES[@]}"; do
    check_endpoint \
        "Shard $((shard_index + 1))" \
        "${GS_MONGODB_SHARD_HOSTNAMES[$shard_index]}" \
        "$GS_MONGODB_SHARD_PORT"
done

check_endpoint \
    "Router" \
    "$GS_MONGODB_ROUTER_HOSTNAME" \
    "$GS_MONGODB_ROUTER_PORT"

if [ "$failures" -ne 0 ]; then
    echo ""
    echo "$failures cluster endpoint(s) were unavailable." >&2
    exit 1
fi

echo ""
echo "Registered shards:"
"$GS_MONGODB_SHELL" \
    --quiet \
    --host "$GS_MONGODB_ROUTER_HOSTNAME" \
    --port "$GS_MONGODB_ROUTER_PORT" \
    --eval '
db.getSiblingDB("config").shards.find().sort({_id:1}).forEach(
    function (shard) {
        print(shard._id + "  " + shard.host);
    }
)
'
