#!/bin/sh

set -e
set -x

if [ -r /etc/default/openstack-tempest-ci ] ; then
	. /etc/default/openstack-tempest-ci
fi

if [ -n "${1}" ] ; then
	OTCI_DEBIAN_REPO_URL=${1}
else
	OTCI_DEBIAN_REPO_URL=http://http.debian.net/debian
fi

if [ "${OTCI_VIRT_MODE}" = "xen" ] ; then
	OTCI_SSH_USER=root
else
	OTCI_SSH_USER=debian
fi

APT_INSTALL="sudo DEBIAN_FRONTEND=noninteractive apt-get install -y"

get_id () {
	"$@" | awk '/ id / { print $4 }'
}

otci_delete_if_already_running () {
	echo "===> Searching for already running instance (to eventually delete)..."
	# Kill the VM if it is online already
	RUNNING_ID=`nova list | grep ${OTCI_VM_HOSTNAME} | awk '{print $2}'`
	if [ -n "${RUNNING_ID}" ] ; then
		echo "===> Deleting instance ${RUNNING_ID}..."
		nova delete ${RUNNING_ID}
		echo "-> Killed"
	else
		echo "-> Instance not running"
	fi
}

otci_launch_vm () {
	echo "===> Starting instance"
	OTCI_VM_ID=`get_id nova boot --flavor ${OTCI_INSTANCE_FLAVOR} --nic net-id=${OTCI_ETH0_NET_ID} --nic net-id=${OTCI_ETH1_NET_ID} --image ${OTCI_DEBIAN_IMAGE_ID} --key-name ${OTCI_KEYPAIR_NAME} ${OTCI_VM_HOSTNAME}`
	echo "-> Got ID: ${OTCI_VM_ID}"
}

otci_wait_until_active () {
	COUNT=50
	CYCLES=0
	OTCI_STATUS=BUILD
	echo "===> Wait until status is active"
	echo "Wating: "
	while [ "${OTCI_STATUS}" != "ACTIVE" ] && [ ${COUNT} != 0 ] ; do
		echo ${CYCLES}
		OTCI_STATUS=`nova list | grep ${OTCI_VM_HOSTNAME} | awk '{print $6}'`
		COUNT=$(( ${COUNT} - 1 ))
		CYCLES=$(( ${CYCLES} + 1 ))
	done
	if [ "${OTCI_STATUS}" != "ACTIVE"  ] ; then
		echo "-> Timed out spawning the OTCI VM: exiting"
		exit 1
	else
		echo " -> VM is spawned \o/"
	fi
}

otci_associate_ip () {
	echo "===> Associating floating IP"
	nova floating-ip-associate ${OTCI_VM_ID} ${OTCI_FLOATING_IP_ADDR}
}


otci_provision_new_vm () {
	if [ "${OTCI_VIRT_MODE}" = "xen" ] ; then
		rm /var/lib/jenkins/.ssh/known_hosts
		ssh -o "StrictHostKeyChecking no" root@${OTCI_XEN_DOM0_IP} /root/p
	else
		otci_delete_if_already_running
		otci_launch_vm
		otci_wait_until_active
		otci_associate_ip
		otci_wait_for_ssh
		otci_aptget_update
		otci_upgrade_kernel
		otci_reboot
	fi
}

otci_wait_for_ssh () {
	if [ -e /var/lib/jenkins/.ssh/known_hosts ] ; then
		rm /var/lib/jenkins/.ssh/known_hosts
	fi
	COUNT=120
	CYCLES=0
	OTCI_CAN_SSH=no
	echo "===> Wait until we can ssh"
	echo "Wating: "
	while [ "${OTCI_CAN_SSH}" != "yes" ] && [ ${COUNT} != 0 ] ; do
		echo ${CYCLES}
		if ssh -o "StrictHostKeyChecking no" root@${OTCI_FLOATING_IP_ADDR} 'echo -n ""' ; then
			OTCI_CAN_SSH=yes
		else
			COUNT=$(( ${COUNT} - 1 ))
			CYCLES=$(( ${CYCLES} + 1 ))
			sleep 1
		fi
	done
}


otci_remote () {
	ssh -o "StrictHostKeyChecking no" ${OTCI_SSH_USER}@${OTCI_FLOATING_IP_ADDR} $@
}

otci_scp () {
	scp -o "StrictHostKeyChecking no" ${1} ${OTCI_SSH_USER}@${OTCI_FLOATING_IP_ADDR}:${2}
}

otci_aptget_update () {
	echo "Acquire::PDiffs \"false\";" >temp_file
	otci_scp temp_file ""
	otci_remote "sudo cp temp_file /etc/apt/apt.conf.d/98nopdiff"
	rm temp_file
	otci_remote "sudo sed -i 's#http.debian.net#${OTCI_DEBIAN_REPO_URL}#' /etc/apt/sources.list'"
	otci_remote "sudo apt-get update"
}

otci_upgrade_kernel () {
	otci_remote "sudo ${APT_INSTALL} -t wheezy-backports linux-image-amd64"
	otci_remote "sudo ${APT_INSTALL} grub-pc"
}

otci_reboot () {
	otci_remote "sudo shutdown -r now"
	sleep 5
}

otci_add_source_list () {
	echo "===> Hacking source list and apt keys: TODO: make this better..."
	echo "-> scp source list"
	otci_scp /etc/openstack-tempest-ci/openstack-ci.list
	echo "-> Install new source list"
	otci_remote "sudo mv openstack-ci.list /etc/apt/sources.list.d/"
	echo "-> wget Jenkins key"
	otci_remote "wget http://kilo-jessie.pkgs.mirantis.com/debian/dists/pubkey.gpg"
	echo "-> Install Jenkins key"
	otci_remote "sudo apt-key add pubkey.gpg"
	echo "-> Updating source list"
	otci_remote "sudo apt-get update"
}

otci_install_openstack_deploy () {
	echo "===> Installing openstack-deploy"
	otci_remote "${APT_INSTALL} openstack-deploy"
	echo "===> Deploying OpenStack"
	otci_remote "sudo openstack-deploy --non-interactive all-in-one"
	echo "===> Switching to qemu"
	otci_remote "${APT_INSTALL} nova-compute-qemu"
	otci_remote "/etc/init.d/nova-compute restart"
	echo "===> Running openstack-deploy-proxy-network"
	otci_remote "sudo openstack-deploy-proxy-network --mgmt-ip-cidr ${OTCI_ETH1_CIDR} --mgmt-if eth1 --ext-host-min ${OTCI_PUBIP_START} --ext-host-max ${OTCI_PUBIP_END} --local-ip ${OTCI_LOCAL_IP}"
	echo "===> Deploying tempest"
	otci_remote "sudo openstack-deploy-tempest ${OTCI_DEBIAN_REPO_URL}"
}

otci_run_tempest () {
	otci_remote tempest
}

otci_provision_new_vm
otci_wait_for_ssh
otci_add_source_list
otci_install_openstack_deploy
otci_run_tempest
