#!/bin/sh

# Check a standalone PuppetDB instance
# Perform basic checks using the REST endpoints. No puppet integration is
# tested at this point.

STATUS_URL="http://localhost:8080/status/v1/services/puppetdb-status"
QUERY_URL="http://localhost:8080/pdb/query/v4"
CERTNAME="autopkgtest"

set -e

cleanup () {
	retval=$?
	set +e
	if [ -n "${AUTOPKGTEST_ARTIFACTS}" ]; then
		cp /var/log/puppetdb/puppetdb.log "${AUTOPKGTEST_ARTIFACTS}"
		if [ -d /run/systemd/system ]; then
			journalctl -u puppetdb.service > "${AUTOPKGTEST_ARTIFACTS}/journal.log"
		fi
	fi
	return $retval
}

get_status () {
	curl -s "$STATUS_URL"
}

check_status_var () {
	get_status | jq -e ".status[\"$1\"] == $2"
}

query () {
	curl -s "${QUERY_URL}/$1"
}

wait_for_pdb() {
	local state="boot"
	local timeout=120

	for count in $(seq 1 $timeout); do
		case "$state" in
		boot)
			if curl -s --connect-timeout 1 "$STATUS_URL" >/dev/null; then
				state="starting"
				echo "PuppetDB is responding, checking maintenance mode"
				continue
			else
				sleep 1
			fi
			;;
		starting)
			if check_status_var maintenance_mode? true >/dev/null; then
				echo "Still in maintenance mode"
				sleep 1
			else
				echo "Maintenance mode disabled"
				break
			fi
			;;
		esac
	done
	if [ $count -eq $timeout ]; then
		echo "Timed out"
		exit 1
	fi
}

trap 'cleanup' EXIT

echo "Waiting for PuppetDB to start"
wait_for_pdb

echo "Checking read DB status (should be up)"
check_status_var read_db_up? true

echo "Checking write DB status (should be up)"
check_status_var write_db_up? true

echo "Issuing replace_facts for '$CERTNAME'"
curl -s -X POST \
  -H 'Content-Type:application/json' \
  -H 'Accept:application/json' \
  -d '{"certname": "'$CERTNAME'",
        "environment":"DEP-8",
        "values":{"debian":"rocks"},
        "producer_timestamp":"2017-08-07",
        "producer":"builder"}' \
  "http://localhost:8080/pdb/cmd/v1?command=replace_facts&version=5&certname=$CERTNAME" >/dev/null

sleep 5

echo "Checking node existence"
query "nodes/${CERTNAME}" | jq -e ".certname == \"${CERTNAME}\""

echo "Checking the value of 'debian' fact"
query "nodes/${CERTNAME}/facts/debian" | jq -e '.[0].value == "rocks"'
