#!/bin/sh

set -e

export PKGOS_VERBOSE=yes
OSINSTALL_RC=~/osinstallrc
TEMPEST_CONF=/etc/tempest/tempest.conf
# This can be debian or cirros. While it's cool
# to test using the Debian image, it's also a
# quite big image which needs flavor 2 (eg: the
# HDD needs more than 1 GB of space), and it
# takes a while to build it.
TEST_IMAGE_TYPE=cirros
if [ "${TEST_IMAGE_TYPE}" = "debian" ] ; then
	IMAGE_PASS=SupArP4ss
else
	IMAGE_PASS="cubswin:)"
fi

# Default value for parameters:

# Possible values: loopback, presetup
LVMTYPE=loopback

# Device on which we should setup LVM for Cinder use
OTCI_LVM_DEVICE=sda

# URL of the Debian repo to use to create the Debian
# openstack VM image (only useful if the above TEST_IMAGE_TYPE
# is set to debian).
DEBIAN_REPO_PARAM=" -u http://http.debian.net/debian -s http://http.debian.net/debian"

for i in $@ ; do
	case "${1}" in
	"--otci-lvmtype")
		if [ -z "${2}" ] ; then echo "Parameter for option --lvmtype is missing" > /dev/stderr ; DO_EXIT="yes" ; fi
		LVMTYPE="${2}"
		shift
		shift
		;;
	"--otci-lvm-device")
		if [ -z "${2}" ] ; then echo "Parameter for option --lvmtype is missing" > /dev/stderr ; DO_EXIT="yes" ; fi
		OTCI_LVM_DEVICE="${2}"
		shift
		shift
		;;
	"--otci-openstack-debian-images-deb-repo")
		if [ -z "${2}" ] ; then echo "Parameter for option --otci-openstack-debian-images-deb-repo is missing" > /dev/stderr ; DO_EXIT="yes" ; fi
		DEBIAN_REPO_PARAM=" -u ${2} -s ${2}"
		shift
		shift
		;;
	*)
		;;
	esac
done

if [ ${DO_EXIT} = "yes" ] ; then
	echo "Parameters not validated: will exit now!" > /dev/stderr
	exit 1
fi

####################
# INCLUDE OUR LIBS #
####################
if ! [ -r /usr/share/openstack-deploy/preseed-lib ] ; then
	echo "Can't find /usr/share/openstack-deploy/pressed-lib: exiting"
	exit 1
fi
. /usr/share/openstack-deploy/preseed-lib
if ! [ -r /usr/share/openstack-pkg-tools/pkgos_func ] ; then
	echo "Can't find /usr/share/openstack-pkg-tools/pkgos_func: exiting"
	exit 1
fi
. /usr/share/openstack-pkg-tools/pkgos_func

if ! [ -r /etc/default/openstack-proxy-node-network ] ; then
	echo "Can't find /etc/default/openstack-proxy-node-network: exiting"
	exit 1
fi
. /etc/default/openstack-proxy-node-network

if [ -r "${OSINSTALL_RC}" ] ; then
	. ${OSINSTALL_RC}
else
	echo "Cannot find ${OSINSTALL_RC}: exiting..."
	exit 1
fi

if [ -r ~/openrc.sh ] ; then
	. ~/openrc.sh
else
	echo "Cannot find openrc.sh: exiting..."
	exit 1
fi

#################################
# DEFINE SOME UTILITY FUNCTIONS #
#################################
osinstall_check_installed () {
	local PKG_NAME
	PKG_NAME=${1}
	INSTALL_STRING=`dpkg -l ${PKG_NAME} | grep ^ii | awk '{print $2}'`
	if [ "${INSTALL_STRING}" = ${PKG_NAME} ] ; then
		return 0
	else
		return 1
	fi
}

osinstall_install_if_not_installed () {
	local PKG_NAME
	PKG_NAME=${1}
	if ! osinstall_check_installed ${PKG_NAME} ; then
		DEBIAN_FRONTEND=noninteractive ${APTGET} install ${PKG_NAME}
	fi
}

deploy_tempest_install_pkgs () {
	echo "===> Installing tempest and openstack-debian-images"
	osinstall_install_if_not_installed tempest
	cp /usr/share/openstack-deploy/tempest_exclude.conf /etc/tempest/exclude.conf
	osinstall_install_if_not_installed openstack-debian-images
	osinstall_install_if_not_installed openstack-clients
}

build_and_upload_image () {
	# Even if we don't use the Cirros image for tests, we need it
	# because there's some Cinder tests that are expecting the image
	# to be in there.
	# Download the Cirros image
	CIRROS_VERSION=0.3.1
	mkdir -p /opt/stack/new/devstack/files/images/cirros-${CIRROS_VERSION}-x86_64-uec
	wget http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz
	tar -C /opt/stack/new/devstack/files/images/cirros-${CIRROS_VERSION}-x86_64-uec -xvzf cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz
	rm cirros-${CIRROS_VERSION}-x86_64-uec.tar.gz


	AUTH_TOKEN=${RC_KEYSTONE_AUTHTOKEN}

	if [ "${TEST_IMAGE_TYPE}" = debian ] ; then
		echo "===> Creating Debian image"
		build-openstack-debian-image -r jessie -p ${IMAGE_PASS} ${DEBIAN_REPO_PARAM}
		IMAGE_PATH=`ls *.qcow2`
		echo "===> Uploading image to Glance"
		IMAGE_REF=`pkgos_get_id glance image-create --name foo --disk-format=qcow2 --container-format=bare --visibility public --file=${IMAGE_PATH}`
	else
		echo "===> Download the Cirros image"
		IMAGE_PATH=/opt/stack/new/devstack/files/images/cirros-${CIRROS_VERSION}-x86_64-disk.img
		wget http://download.cirros-cloud.net/${CIRROS_VERSION}/cirros-${CIRROS_VERSION}-x86_64-disk.img -O ${IMAGE_PATH}
		IMAGE_REF=`pkgos_get_id glance image-create --name foo --disk-format=qcow2 --container-format=bare --visibility public --file=${IMAGE_PATH}`
	fi
}

create_non_admin_keystone_user () {
	openstack project create testme
	openstack user create --password testme --project testme --email root@localhost --enable testme
	openstack project create testme2
	openstack user create --password testme2 --project testme2 --email root@localhost --enable testme2
}

fix_tempest_config () {
	echo "===> Fixing tempest.conf"
	# [identity]
	pkgos_inifile set ${TEMPEST_CONF} identity uri http://${DEFROUTE_IP}:35357/v2.0
	pkgos_inifile set ${TEMPEST_CONF} identity uri_v3 http://${DEFROUTE_IP}:35357/v3

	# [application_catalog]
	pkgos_inifile set ${TEMPEST_CONF} application_catalog region regionOne

	# [auth]
	pkgos_inifile set ${TEMPEST_CONF} auth admin_project_name admin
	pkgos_inifile set ${TEMPEST_CONF} auth admin_password ${RC_KEYSTONE_ADMINPASS}

	# [compute]
	pkgos_inifile set ${TEMPEST_CONF} compute image_ref ${IMAGE_REF}
	pkgos_inifile set ${TEMPEST_CONF} compute image_ref_alt ${IMAGE_REF}
	if [ "${TEST_IMAGE_TYPE}" = debian ] ; then
		pkgos_inifile set ${TEMPEST_CONF} validation image_ssh_user debian
	else
		pkgos_inifile set ${TEMPEST_CONF} validation image_ssh_user cirros
	fi
	pkgos_inifile set ${TEMPEST_CONF} validation image_ssh_password ${IMAGE_PASS}
	pkgos_inifile set ${TEMPEST_CONF} validation network_for_ssh ext-net
	pkgos_inifile set ${TEMPEST_CONF} compute fixed_network_name demo-net

	pkgos_inifile set ${TEMPEST_CONF} compute-feature-enabled spice_console true
	pkgos_inifile set ${TEMPEST_CONF} compute-feature-enabled allow_duplicate_networks true

	# [dashboard]
	pkgos_inifile set ${TEMPEST_CONF} dashboard dashboard_url http://${DEFROUTE_IP}/

	# [network]
	pkgos_inifile set ${TEMPEST_CONF} network tenant_network_cidr ${TENANT_NET_CIDR}
	PUBLIC_NETWORK_ID=`pkgos_get_id neutron net-show ext-net`
	pkgos_inifile set ${TEMPEST_CONF} network public_network_id ${PUBLIC_NETWORK_ID}
# We shouldn't do this. Doing it fails all tests
#	PUBLIC_ROUTER_ID=`pkgos_get_id neutron router-show demo-router`
#	pkgos_inifile set ${TEMPEST_CONF} network public_router_id ${PUBLIC_ROUTER_ID}

	pkgos_inifile set ${TEMPEST_CONF} network default_network 192.168.64.0/20

	pkgos_inifile set ${TEMPEST_CONF} network tenant_network_v6_cidr 2403:cc00:1000:8888:200:20ff:fe01:8402/64

	# [orchestration]
	pkgos_inifile set ${TEMPEST_CONF} orchestration instance_type m1.small
	pkgos_inifile set ${TEMPEST_CONF} orchestration keypair_name odtkey

	# [service_available]
#	pkgos_inifile set ${TEMPEST_CONF} service_available zaqar false
	pkgos_inifile set ${TEMPEST_CONF} service_available swift true
	pkgos_inifile set ${TEMPEST_CONF} service_available ceilometer true
	pkgos_inifile set ${TEMPEST_CONF} service_available horizon true
#	pkgos_inifile set ${TEMPEST_CONF} service_available ironic false
	pkgos_inifile set ${TEMPEST_CONF} service_available nova true
	pkgos_inifile set ${TEMPEST_CONF} service_available cinder true
#	pkgos_inifile set ${TEMPEST_CONF} service_available trove false
	pkgos_inifile set ${TEMPEST_CONF} service_available heat true
	pkgos_inifile set ${TEMPEST_CONF} service_available aodh true
#	pkgos_inifile set ${TEMPEST_CONF} service_available sahara false
	pkgos_inifile set ${TEMPEST_CONF} service_available glance true
	pkgos_inifile set ${TEMPEST_CONF} service_available neutron true
}

gen_ssh_root_key () {
	ssh-keygen -t rsa -N "" -f .ssh/id_rsa
	nova keypair-add --pub-key .ssh/id_rsa.pub odtkey
}

setup_loopback_based_lvm_vg () {
	echo "===> Creating a 40 GB loopback file used as LVM"
	## Create a 10GB file on the root
	#dd if=/dev/zero of=/lvm-data.dat count=20971520
	# Create a 40GB file on the root
	#dd if=/dev/zero of=/lvm-data.dat count=83886080 sparse
	qemu-img create /lvm-data.dat 40G
	# Setup the loopback device
	losetup /dev/loop0 /lvm-data.dat
	# Create the PV
	pvcreate /dev/loop0
	# Create the VG
	vgcreate pkgosvg0 /dev/loop0
	# Activate the pkgosvg0
	vgchange -a y pkgosvg0
	echo "Done!"
}

setup_real_hdd_based_lvm_vg () {
	echo "===> Creating new volume group on device ${OTCI_LVM_DEVICE} (will destroy everything there...)"
	parted /dev/${OTCI_LVM_DEVICE} mklabel msdos -s
	parted /dev/${OTCI_LVM_DEVICE} mkpart primary ext4 -a optimal 2048 48G
	parted /dev/${OTCI_LVM_DEVICE} set 1 lvm on
	pvcreate /dev/${OTCI_LVM_DEVICE}1 -ff -y
	vgcreate pkgosvg0 /dev/${OTCI_LVM_DEVICE}1
	vgchange -a y pkgosvg0
	echo "Done!"
}

setup_loopback_based_swift () {
	### NOTE: this comes from http://docs.openstack.org/developer/swift/development_saio.html ###
	echo "===> Installing Swift and xfsprogs"
	DEBIAN_FRONTEND=noninteractive ${APTGET} install swift swift-proxy swift-account swift-container swift-object swift-object-expirer xfsprogs

	if [ "${LVMTYPE}" = "loopback" ] ; then
		echo "===> Creating swift HDDs using a 20 GB loopback file at /srv/swift-disk"
		# Create the loopback device
		mkdir -p /srv
		qemu-img create /srv/swift-disk 20G
		mkfs.xfs /srv/swift-disk

		# Mount it
		mkdir /mnt/sdb1
		echo "/srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0" >>/etc/fstab
		mount /mnt/sdb1
	elif [ "${LVMTYPE}" = "resetup" ] ; then
		echo "===> Creating swift HDDs using a 48GB file on /dev/${OTCI_LVM_DEVICE}2"
		mkdir -p /srv

		# Create the partition and the FS
		parted /dev/${OTCI_LVM_DEVICE} mkpart primary xfs -a optimal 48G 96G
		sleep 5
		mkfs.xfs /dev/${OTCI_LVM_DEVICE}2 -f

		# Mount it
		mkdir /mnt/sdb1
		echo "/dev/${OTCI_LVM_DEVICE}2 /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0" >>/etc/fstab
		mount /mnt/sdb1
	fi

	echo "===> Configuring Swift & rsync"
	# Setup swift disks
	mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4
	chown swift:swift /mnt/sdb1/*
	for x in `seq 1 4`; do ln -s /mnt/sdb1/$x /srv/$x; done
	mkdir -p /srv/1/node/sdb1 /srv/1/node/sdb5 \
		/srv/2/node/sdb2 /srv/2/node/sdb6 \
		/srv/3/node/sdb3 /srv/3/node/sdb7 \
		/srv/4/node/sdb4 /srv/4/node/sdb8 \
		/var/run/swift
	chown -R swift:swift /var/run/swift
	# **Make sure to include the trailing slash after /srv/$x/**
	for x in `seq 1 4`; do chown -R swift:swift /srv/$x/; done

	# Common Post-Device Setup
	mkdir -p /var/cache/swift /var/cache/swift2 /var/cache/swift3 /var/cache/swift4
	chown swift:swift /var/cache/swift*

	# Enable rsyncd for swift
	cp /usr/share/openstack-deploy/saio/rsyncd.conf /etc
	sed -i s/RSYNC_ENABLE=false/RSYNC_ENABLE=true/ /etc/default/rsync
	service rsync restart

	# Copy the saio config files for swift
	rm -rf /etc/swift/
	mkdir -p /etc/swift/
	cp -rfv /usr/share/openstack-deploy/saio/swift/* /etc/swift/
	chown -R swift:swift /etc/swift

	# Customize the config (ie: keystone authtoken)
	pkgos_inifile set /etc/swift/proxy-server.conf filter:authtoken admin_password ${RC_KEYSTONE_ADMINPASS}
	pkgos_inifile set /etc/swift/proxy-server.conf filter:authtoken identity_uri http://${DEFROUTE_IP}:35357/
	pkgos_inifile set /etc/swift/proxy-server.conf filter:authtoken auth_uri http://${DEFROUTE_IP}:5000/
	pkgos_inifile set /etc/swift/proxy-server.conf filter:authtoken auth_url http://${DEFROUTE_IP}:5000/

	# Create the swift ring
	chmod +x /usr/share/openstack-deploy/saio/bin/remakerings
	/usr/share/openstack-deploy/saio/bin/remakerings

	# Restart swift after the config is good
	for i in `ls /etc/init.d/swift-*` ; do $i stop ; done
	for i in `ls /etc/init.d/swift-*` ; do $i start ; done

	echo "===> Creating swift endpoints in Keystone catalog"
	# Setup the endpoint
	openstack --os-identity-api-version=3 service create --description "OpenStack Object Storage" --name swift object-store
	openstack --os-identity-api-version=3 endpoint create --region regionOne swift public http://${DEFROUTE_IP}:8080/v1/AUTH_%\(tenant_id\)s
	openstack --os-identity-api-version=3 endpoint create --region regionOne swift admin http://${DEFROUTE_IP}:8080/v1/AUTH_%\(tenant_id\)s
	openstack --os-identity-api-version=3 endpoint create --region regionOne swift internal http://${DEFROUTE_IP}:8080/v1/AUTH_%\(tenant_id\)s
	#openstack --os-domain-name default --os-identity-api-version=3 endpoint create --publicurl http://${DEFROUTE_IP}:8080/v1/AUTH_%\(tenant_id\)s --adminurl http://${DEFROUTE_IP}:8080/ --internalurl http://${DEFROUTE_IP}:8080/v1/AUTH_%\(tenant_id\)s --region regionOne swift
}

install_cinder () {
	# At this point in time, cinder should already be preseeded by openstack-deploy,
	# so just installing it this way should be fine
	DEBIAN_FRONTEND=noninteractive ${APTGET} install cinder-api cinder-volume python-cinderclient cinder-backup cinder-scheduler
	if [ -x /usr/bin/lsb_release ] && [ `lsb_release -a | grep Codename | awk '{print $2}'` = "wheezy" ] ; then
		DEBIAN_FRONTEND=noninteractive ${APTGET} install -t wheezy-backports tgt || true
	else
		DEBIAN_FRONTEND=noninteractive ${APTGET} install tgt || true
	fi
	# Set configuration for swift-backup (normally not needed...)
	#pkgos_inifile set /etc/cinder/cinder.conf backup_swift_tenant admin
	#pkgos_inifile set /etc/cinder/cinder.conf backup_swift_user admin
	#pkgos_inifile set /etc/cinder/cinder.conf backup_swift_key admin
}

restart_swift_again () {
	echo "===> Stopping swift..."
	for i in /etc/init.d/swift* ; do $i stop ; done
	echo "===> Waiting 5 seconds..."
	sleep 5
	echo "===> Starting swift..."
	for i in /etc/init.d/swift* ; do $i start ; done
}

# Param: $1 = name
#        $2 = ram
#        $3 = disk
#        $4 = vcpus
create_flavor_if_not_exists () {
	RET=$(openstack flavor list --format=csv | q -d , -H 'SELECT ID FROM - WHERE `Name`="'${1}'"' 2>/dev/null)
	if [ -z "${RET}" ] ; then
		openstack flavor create --ram ${2} --disk ${3} --vcpus ${4} ${1}
	RET=$(openstack flavor list --format=csv | q -d , -H 'SELECT ID FROM - WHERE `Name`="'${1}'"')
	fi
}

set_nova_flavors () {
	create_flavor_if_not_exists m1.tiny    512  1 1
	M1_TINY_FLID=$RET
	create_flavor_if_not_exists m1.small  2048 20 1
	M1_SMALL_FLID=$RET
	create_flavor_if_not_exists m1.medium 4096 40 2
	M1_MEDIUM_FLID=$RET
	create_flavor_if_not_exists m1.large  8192 80 4
	M1_LARGE_FLID=$RET

	pkgos_inifile set ${TEMPEST_CONF} compute flavor_ref ${M1_TINY_FLID}
	pkgos_inifile set ${TEMPEST_CONF} compute flavor_ref_alt ${M1_SMALL_FLID}
}

prepare_node_for_trove () {
	openstack project create trove_for_trove_usage
	openstack user create --password trove --project trove_for_trove_usage --email root@localhost --enable regular_trove_user
	openstack user create --password trove --project trove_for_trove_usage --email root@localhost --enable admin_trove_user
	openstack role add --user admin_trove_user --project trove_for_trove_usage admin

	# TODO: fix this by packaging rabbitmqadmin within the rabbitmq-server package.
	# This is already commited to git on Alioth, though a backport should be done.
	echo "===> Downloading rabbitmqadmin to declare queues and exchanges"
	wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/rabbitmq_v3_6_0/bin/rabbitmqadmin -O /usr/bin/rabbitmqadmin
	chmod +x /usr/bin/rabbitmqadmin

	# The management is needed for rabbitmqadmin to work
	rabbitmq-plugins enable rabbitmq_management
	# Restarting is necessary to enable plugins
	invoke-rc.d rabbitmq-server restart
	# Add a new user to the rabbitmq for trove to use
	rabbitmqctl add_user trove trove
	# Set it as admin
	rabbitmqctl set_user_tags trove administrator
	# Set permissions
	rabbitmqadmin --username=trove --password=trove --host=localhost declare permission vhost=/ user=trove configure='.*' write='.*' read='.*'
	# Declare the exchange
	rabbitmqadmin --username=trove --password=trove --host=localhost declare exchange name=trove type=topic durable=true

	echo "#!/bin/sh

set -e
set -x

. /etc/pkgos/pkgos.conf
. /root/osinstallrc

APTGET=\"apt-get -o Dpkg::Options::=--force-confnew --force-yes -y\"

cp /etc/apt/sources.list.d/openstack.list \${BODI_CHROOT_PATH}/etc/apt/sources.list.d
echo \"#!/bin/sh
exit 101
\" >\${BODI_CHROOT_PATH}/usr/sbin/policy-rc.d
chmod +x \${BODI_CHROOT_PATH}/usr/sbin/policy-rc.d

chroot \${BODI_CHROOT_PATH} \${APTGET} update
chroot \${BODI_CHROOT_PATH} \${APTGET} install \${TARGET_OPENSTACK_REL}-\${TARGET_DISTRO}-archive-keyring
chroot \${BODI_CHROOT_PATH} \${APTGET} update

echo \"\${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password password \${RC_MYSQL_PASSWORD}
\${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password seen true
\${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password_again password \${RC_MYSQL_PASSWORD}
\${RC_MYSQL_SERVER_PKG_NAME} mysql-server/root_password_again seen true
\" >\${BODI_CHROOT_PATH}/root/mysql-password-preseed
chroot \${BODI_CHROOT_PATH} debconf-set-selections /root/mysql-password-preseed
rm \${BODI_CHROOT_PATH}/root/mysql-password-preseed

DEBIAN_FRONTEND=noninteractive chroot \${BODI_CHROOT_PATH} \${APTGET} install -y trove-guestagent heat-cfntools mysql-server-5.5 percona-xtrabackup
rm \${BODI_CHROOT_PATH}/usr/sbin/policy-rc.d
mkdir -p \${BODI_CHROOT_PATH}/root/.ssh
cp /root/.ssh/id_rsa.pub \${BODI_CHROOT_PATH}/root/.ssh/authorized_keys
cp /root/.ssh/id_rsa.pub \${BODI_CHROOT_PATH}/root/.ssh/authorized_keys2
" >/root/trove-hook

pkgos-fix-config-default /etc/trove/trove-guestagent.conf oslo_messaging_rabbit rabbit_host ${RC_KEYSTONE_ENDPOINT_IP}
pkgos-fix-config-default /etc/trove/trove-guestagent.conf oslo_messaging_rabbit rabbit_userid trove
pkgos-fix-config-default /etc/trove/trove-guestagent.conf oslo_messaging_rabbit rabbit_password trove
pkgos-fix-config-default /etc/trove/trove-guestagent.conf DEFAULT swift_url http://${RC_KEYSTONE_ENDPOINT_IP}:8080/v1/AUTH_
pkgos-fix-config-default /etc/trove/trove-guestagent.conf DEFAULT os_region_name regionOne
pkgos-fix-config-default /etc/trove/trove-guestagent.conf DEFAULT swift_service_type object-store
pkgos-fix-config-default /etc/trove/trove-guestagent.conf DEFAULT trove_auth_url http://${RC_KEYSTONE_ENDPOINT_IP}:5000/v2.0
	chmod +x /root/trove-hook
	build-openstack-debian-image -r jessie --hook-script /root/trove-hook -p trovepass -u ${DEBIAN_REPO_PARAM} -s ${DEBIAN_REPO_PARAM}

#trove-manage datastore_update mysql ""
#trove-manage datastore_version_update mysql 5.5 mysql aefce61e-af5a-4139-8f38-e7a32207a329 mysql-server-5.5 1
#trove-manage datastore_update mysql 5.5

	glance --os-username admin_trove_user --os-password trove --os-project-name trove_for_trove_usage image-create --name trove-image --visibility public --container-format ovf --disk-format qcow2 --owner admin_trove_user --file debian-jessie-8.0.0-1-amd64.qcow2

	echo "#cloud-config
packages:
- trove-guestagent
- mysql-server-5.5

# config file for trove guestagent
write_files:
- path: /etc/trove/trove-guestagent.conf
  content: |
rabbit_host = ${RC_KEYSTONE_ENDPOINT_IP}
rabbit_password = trove
rabbit_userid = trove

" >/etc/trove/cloudinit/mysql.cloudinit
}

deploy_tempest_install_pkgs
create_non_admin_keystone_user
build_and_upload_image
fix_tempest_config
gen_ssh_root_key
if [ "${LVMTYPE}" = "loopback" ] ; then
	setup_loopback_based_lvm_vg
elif [ "${LVMTYPE}" = "resetup" ] ; then
	setup_real_hdd_based_lvm_vg
fi
setup_loopback_based_swift
install_cinder
restart_swift_again
set_nova_flavors
#prepare_node_for_trove
