Blob Blame History Raw
#!/bin/bash
#
# Copyright (C) 2011, Red Hat, Inc.
# Russell Bryant <rbryant@redhat.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#

#
# Print --help output and exit.
#
usage() {

cat << EOF
Set up a local MySQL database for use with openstack-nova.
This script will create a 'nova' database that is accessible
only on localhost by user 'nova' with password 'nova'.
The setup of MySQL with a multi-server OpenStack installation
is outside of the scope of this simple helper script.

Usage: openstack-nova-db-setup [options]
Options:
	--help        | -h
		Print usage information.
	--novapw <pw> | -n <pw>
		Specify the password for the 'nova' MySQL user that nova will
		use to connect to the 'nova' MySQL database.  By default,
		the password 'nova' will be used.
	--rootpw <pw> | -r <pw>
		Specify the root MySQL password.  If the script installs
		the MySQL server, it will set the root password to this value
		instead of prompting for a password.  If the MySQL server is
		already installed, this password will be used to connect to the
		database instead of having to prompt for it.
	--yes         | -y
		In cases where the script would normally ask for confirmation
		before doing something, such as installing mysql-server,
		just assume yes.  This is useful if you want to run the script
		non-interactively.
EOF

	exit 0
}

install_mysql_server() {
	if [ -z "${ASSUME_YES}" ] ; then
		yum install mysql-server
	else
		yum install -y mysql-server
	fi
}

start_mysql_server() {
	systemctl start mysqld.service
}

MYSQL_NOVA_PW_DEFAULT="nova"
MYSQL_NOVA_PW=${MYSQL_NOVA_PW_DEFAULT}
NOVA_CONFIG="/etc/nova/nova.conf"
ASSUME_YES=""

while [ $# -gt 0 ]
do
	case "$1" in
		-h|--help)
			usage
			;;
		-n|--novapw)
			shift
			MYSQL_NOVA_PW=${1}
			;;
		-r|--rootpw)
			shift
			MYSQL_ROOT_PW=${1}
			;;
		-y|--yes)
			ASSUME_YES="yes"
			;;
		*)
			# ignore
			shift
			;;
	esac
	shift
done


# Make sure MySQL is installed.

NEW_MYSQL_INSTALL=0
if ! rpm -q mysql-server > /dev/null
then
	if [ -z "${ASSUME_YES}" ] ; then
		printf "mysql-server is not installed.  Would you like to install it now? (y/n): "
		read response
		case "$response" in
			y|Y)
				;;
			n|N)
				echo "mysql-server must be installed.  Please install it before proceeding."
				exit 0
				;;
			*)
				echo "Invalid response."
				exit 1
		esac
	fi

	NEW_MYSQL_INSTALL=1
	install_mysql_server
fi


# Make sure mysqld is running.

if ! systemctl status mysqld.service > /dev/null
then
	if [ -z "${ASSUME_YES}" ] ; then
		printf "mysqld is not running.  Would you like to start it now? (y/n): "
		read response
		case "$response" in
			y|Y)
				;;
			n|N)
				echo "mysqld must be running.  Please start it before proceeding."
				exit 0
				;;
			*)
				echo "Invalid response."
				exit 1
		esac
	fi

	start_mysql_server

	# If we both installed and started, ensure it starts at boot
	[ $NEW_MYSQL_INSTALL -eq 1 ] && chkconfig mysqld on
fi


# Get MySQL root access.

if [ $NEW_MYSQL_INSTALL -eq 1 ]
then
	if [ ! "${MYSQL_ROOT_PW+defined}" ] ; then
		echo "Since this is a fresh installation of MySQL, please set a password for the 'root' mysql user."

		PW_MATCH=0
		while [ $PW_MATCH -eq 0 ]
		do
			printf "Enter new password for 'root' mysql user: "
			read -s MYSQL_ROOT_PW
			echo
			printf "Enter new password again: "
			read -s PW2
			echo
			if [ "${MYSQL_ROOT_PW}" = "${PW2}" ] ; then
				PW_MATCH=1
			else
				echo "Passwords did not match."
			fi
		done
	fi

	echo "UPDATE mysql.user SET password = password('${MYSQL_ROOT_PW}') WHERE user = 'root'; DELETE FROM mysql.user WHERE user = ''; flush privileges;" | mysql -u root
	if ! [ $? -eq 0 ] ; then
		echo "Failed to set password for 'root' MySQL user."
		exit 1
	fi
elif [ ! "${MYSQL_ROOT_PW+defined}" ] ; then
	printf "Please enter the password for the 'root' MySQL user: "
	read -s MYSQL_ROOT_PW
	echo
fi


# Sanity check MySQL credentials.

MYSQL_ROOT_PW_ARG=""
if [ "${MYSQL_ROOT_PW+defined}" ]
then
	MYSQL_ROOT_PW_ARG="--password=${MYSQL_ROOT_PW}"
fi
echo "SELECT 1;" | mysql -u root ${MYSQL_ROOT_PW_ARG} > /dev/null
if ! [ $? -eq 0 ]
then
	echo "Failed to connect to the MySQL server.  Please check your root user credentials."
	exit 1
fi
echo "Verified connectivity to MySQL."


# Now create the db.

echo "Creating 'nova' database."
cat << EOF | mysql -u root ${MYSQL_ROOT_PW_ARG}
CREATE DATABASE nova;
CREATE USER 'nova'@'localhost' IDENTIFIED BY '${MYSQL_NOVA_PW}';
CREATE USER 'nova'@'%' IDENTIFIED BY '${MYSQL_NOVA_PW}';
GRANT ALL ON nova.* TO 'nova'@'localhost';
GRANT ALL ON nova.* TO 'nova'@'%';
flush privileges;
EOF


# Make sure nova configuration has the right MySQL password.

if [ "${MYSQL_NOVA_PW}" != "${MYSQL_NOVA_PW_DEFAULT}" ] ; then
	echo "Updating 'nova' database password in ${NOVA_CONFIG}"
	sed -i -e "s/mysql:\/\/nova:\(.*\)@/mysql:\/\/nova:${MYSQL_NOVA_PW}@/" ${NOVA_CONFIG}
fi


# Ask openstack-nova to sync the db.

echo "Asking openstack-nova to sync the databse."
nova-manage db sync


# Do a final sanity check on the database.

echo "SELECT * FROM migrate_version;" | mysql -u nova --password=${MYSQL_NOVA_PW} nova > /dev/null
if ! [ $? -eq 0 ]
then
	echo "Final sanity check failed.  File a bug report on bugzilla.redhat.com against the openstack-nova package."
	exit 1
fi

echo "Complete!"