#!/usr/bin/env bash

# A useful script for testing out changes to PVC by building the debs and deploying them out to a
# set of hosts automatically, including restarting the daemon (with a pause between) on the remote
# side. Mostly just useful for quickly testing/debugging changes as Ansible should be used for
# production upgrades.

# Check if we're root, or not
if [[ $( id -u ) -eq 0 ]]; then
    SUDO=""
else
    SUDO="sudo"
fi

KEEP_ARTIFACTS=""
if [[ -n ${1} ]]; then
    for arg in ${@}; do
        case ${arg} in
            -k|--keep)
                KEEP_ARTIFACTS="y"
                shift
            ;;
        esac
    done
fi

HOSTS=( ${@} )
echo "> Deploying to host(s): ${HOSTS[@]}"

# Move to repo root if we're not
pushd $( git rev-parse --show-toplevel ) &>/dev/null

# Prepare code
echo "Preparing code (format and lint)..."
./format || exit 1
./lint || exit 1

# Build the packages
echo -n "Building packages..."
version="$( ./build-unstable-deb.sh 2>/dev/null )"
echo " done. Package version ${version}."

# Install the client(s) locally
echo -n "Installing client packages locally..."
$SUDO dpkg -i --force-all ../pvc-client*_${version}*.deb &>/dev/null
echo " done".

for HOST in ${HOSTS[@]}; do
    echo -n "Copying packages to host ${HOST}..."
    ssh $HOST $SUDO rm -rf /tmp/pvc &>/dev/null
    ssh $HOST mkdir /tmp/pvc &>/dev/null
    scp ../pvc-*_${version}*.deb $HOST:/tmp/pvc/ &>/dev/null
    echo " done."
done
if [[ -z ${KEEP_ARTIFACTS} ]]; then
    rm ../pvc*_${version}*
fi

for HOST in ${HOSTS[@]}; do
    echo "> Deploying packages to host ${HOST}"
    echo -n "Installing packages..."
    ssh $HOST $SUDO dpkg -i --force-all /tmp/pvc/*.deb &>/dev/null
    ssh $HOST rm -rf /tmp/pvc &>/dev/null
    echo " done."
    echo -n "Restarting PVC daemons..."
    ssh $HOST $SUDO systemctl restart pvcapid &>/dev/null
    sleep 2
    ssh $HOST $SUDO systemctl restart pvcworkerd &>/dev/null
    sleep 2
    ssh $HOST $SUDO systemctl restart pvchealthd &>/dev/null
    sleep 2
    ssh $HOST $SUDO systemctl restart pvcnoded &>/dev/null
    echo " done."
    echo -n "Waiting for node daemon to be running..."
    while [[ $( ssh $HOST "pvc -q node list -f json ${HOST%%.*} | jq -r '.[].daemon_state'" 2>/dev/null ) != "run" ]]; do
        sleep 5
        echo -n "."
    done
    echo " done."
done

popd &>/dev/null
