#!/bin/sh

set -e
#set -x

if ! [ -r /etc/oci-poc/oci-poc.conf ] ; then
	echo "Cannot read /etc/oci-poc/oci-poc.conf"
fi
. /etc/oci-poc/oci-poc.conf

API_URL="http://192.168.100.2/oci/api.php?"

# Check that we really have NUMBER_OF_GUESTS machines available
# before starting anything
check_enough_vms_available () {
	local TMPFILE STATUS MESSAGE EXPECTED_NUM_OF_SLAVES
	EXPECTED_NUM_OF_SLAVES=${1}

	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=get_all_status" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API to check VM their statuses: API status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	expected_all_status=""
	expected_all_clusters=""
	for i in $(seq -s ' ' 1 ${EXPECTED_NUM_OF_SLAVES}) ; do
		expected_all_status="${expected_all_status}live "
		expected_all_clusters="${expected_all_clusters}null "
	done
	all_status=$(cat ${TMPFILE} | jq -r '.["data"][]["status"]' | tr '\n' ' ')
	if ! [ "${expected_all_status}" = "${all_status}" ] ; then
		echo "Not all VMs booted on live"
		rm ${TMPFILE}
		exit 1
	fi
	all_clusters=$(cat ${TMPFILE} | jq -r '.["data"][]["cluster"]' | tr '\n' ' ')
	if ! [ "${expected_all_clusters}" = "${all_clusters}" ] ; then
		echo "Some VMs are already enroled in a cluster"
		rm ${TMPFILE}
		exit 1
	fi
	rm ${TMPFILE}
}

create_new_cluster () {
	local TMPFILE MESSAGE STATUS
	CLUSTER_NAME=${1}
	DOMAIN_NAME=${2}

	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=new_cluster&name=${CLUSTER_NAME}&domain=${DOMAIN_NAME}" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API to create cluster: API status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	rm ${TMPFILE}
}

create_new_network () {
	local TMPFILE MESSAGE STATUS
	NETWORK_NAME=${1}
	NETWORK_IP=${2}
	NETWORK_CIDR_MASK=${3}
	NETWORK_IS_PUBLIC=${4}

	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=new_network&name=${NETWORK_NAME}&ipaddr=${NETWORK_IP}&cidr_mask=${NETWORK_CIDR_MASK}&is_public=${NETWORK_IS_PUBLIC}" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API to create cluster: API status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	rm ${TMPFILE}
}

assign_network_to_cluster () {
	local TMPFILE MESSAGE STATUS
	NETWORK_NAME=${1}
	CLUSTER_NAME=${2}
	ROLE_NAME=${3}
	IFACE1=${4}
	IFACE2=${5}

	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=assign_network_to_cluster&network_name=${NETWORK_NAME}&cluster_name=${CLUSTER_NAME}&role_name=${ROLE_NAME}&iface1=${IFACE1}&iface2=${IFACE2}" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API to create cluster: API status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	rm ${TMPFILE}
}

enroll_a_single_machine () {
	local MACHINE_IP CLUSTER_NAME ROLE_NAME TMPFILE STATUS MESSAGE
	MACHINE_IP=${1}
	CLUSTER_NAME=${2}
	ROLE_NAME=${3}

	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=add_machine_to_cluster&ipaddr=${MACHINE_IP}&cluster_name=${CLUSTER_NAME}&role_name=${ROLE_NAME}" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API to create cluster: API status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	rm ${TMPFILE}
}

enroll_machines_in_cluster () {
	local TMPFILE STATUS MESSAGE COUNT
	TMPFILE=$(mktemp -t oci-poc-install-cluster.XXXXXX)
	curl -s ${API_URL}"action=get_all_status" >${TMPFILE}
	STATUS=$(cat ${TMPFILE} | jq -r '.["status"]')
	if ! [ "${STATUS}" = "success" ] ; then
		echo "Could not query API, status isn't success"
		MESSAGE=$(cat ${TMPFILE} | jq -r '.["message"]')
		echo $MESSAGE
		rm ${TMPFILE}
		exit 1
	fi
	all_ips=$(cat ${TMPFILE} | jq -r '.["data"][]["ipaddr"]' | tr '\n' ' ')
	# Example result: 192.168.100.32 192.168.100.33 192.168.100.34 192.168.100.35 192.168.100.42 192.168.100.36 192.168.100.41 192.168.100.43 192.168.100.40 192.168.100.39 192.168.100.38 192.168.100.37 

	COUNT=1
	for ip in ${all_ips} ; do
		case "${COUNT}" in
		"1")	echo "Enrolling $ip as compute in cluster zigo"; enroll_a_single_machine ${ip} zigo compute ;;
		"2")	echo "Enrolling $ip as compute in cluster zigo"; enroll_a_single_machine ${ip} zigo compute ;;
		"3")	echo "Enrolling $ip as controller in cluster zigo"; enroll_a_single_machine ${ip} zigo controller ;;
		"4")	echo "Enrolling $ip as controller in cluster zigo"; enroll_a_single_machine ${ip} zigo controller ;;
		"5")	echo "Enrolling $ip as network in cluster zigo"; enroll_a_single_machine ${ip} zigo network ;;
		"6")	echo "Enrolling $ip as network in cluster zigo"; enroll_a_single_machine ${ip} zigo network ;;
		"7")	echo "Enrolling $ip as volume in cluster zigo"; enroll_a_single_machine ${ip} zigo volume ;;
		"8")	echo "Enrolling $ip as volume in cluster zigo"; enroll_a_single_machine ${ip} zigo volume ;;
		"*")	echo "Doing nothing with server $ip" ;;
		esac
		COUNT=$((${COUNT} + 1))
	done
	rm ${TMPFILE}
}

check_enough_vms_available $((${NUMBER_OF_GUESTS} - 1))
create_new_cluster zigo infomaniak.ch
create_new_network zigo-management   192.168.101.0 24 no
create_new_network zigo-vm-traffic   192.168.102.0 24 no
create_new_network zigo-ceph-traffic 192.168.103.0 24 no
assign_network_to_cluster zigo-management zigo all eth0 none
assign_network_to_cluster zigo-vm-traffic zigo compute eth1 none
enroll_machines_in_cluster

exit 0
