From 428af5a257310dbbae9bd7d3b9cd81f92ef7ba9a Mon Sep 17 00:00:00 2001 From: Terry Wilson Date: Thu, 1 Nov 2012 16:12:39 -0400 Subject: [PATCH] Add PostgreSQL support to devstack This patch adds an interface for supporting multiple database backend types and implemnts support for PostgreSQL. It also adds a function, use_exclusive_service, which serves as a base for enabling a service that conflicts with other services. The use_database function uses it, and it might also be useful for selecting messaging backends. MySQL is still selected by default. Tested on Fedora 17 and Ubuntu 12.04 with MySQL and PostgreSQL. Implements blueprint postgresql-support Change-Id: I4b1373e25676fd9a9809fe70cb4a6450a2479174 --- README.md | 9 +++ files/apts/postgresql | 1 + files/rpms/postgresql | 1 + functions | 15 +++++ lib/cinder | 9 +-- lib/database | 103 +++++++++++++++++++++++++++++++ lib/databases/mysql | 93 ++++++++++++++++++++++++++++ lib/databases/postgresql | 70 +++++++++++++++++++++ lib/glance | 9 +-- lib/heat | 7 ++- lib/keystone | 7 ++- lib/nova | 10 +-- stack.sh | 128 +++++++++++---------------------------- unstack.sh | 7 +++ 14 files changed, 356 insertions(+), 113 deletions(-) create mode 100644 files/apts/postgresql create mode 100644 files/rpms/postgresql create mode 100644 lib/database create mode 100644 lib/databases/mysql create mode 100644 lib/databases/postgresql diff --git a/README.md b/README.md index 872b16b82e..931075887a 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,15 @@ If the EC2 API is your cup-o-tea, you can create credentials and use euca2ools: You can override environment variables used in `stack.sh` by creating file name `localrc`. It is likely that you will need to do this to tweak your networking configuration should you need to access your cloud from a different host. +# Database Backend + +Multiple database backends are available. The available databases are defined in the lib/databases directory. +To choose a database backend, add a line to your `localrc` like: + + use_database postgresql + +By default, the mysql database backend is used. + # RPC Backend Multiple RPC backends are available. Currently, this diff --git a/files/apts/postgresql b/files/apts/postgresql new file mode 100644 index 0000000000..bf19d397cb --- /dev/null +++ b/files/apts/postgresql @@ -0,0 +1 @@ +python-psycopg2 diff --git a/files/rpms/postgresql b/files/rpms/postgresql new file mode 100644 index 0000000000..bf19d397cb --- /dev/null +++ b/files/rpms/postgresql @@ -0,0 +1 @@ +python-psycopg2 diff --git a/functions b/functions index dbe9d30a68..917727d754 100644 --- a/functions +++ b/functions @@ -836,6 +836,21 @@ function upload_image() { fi } +# Toggle enable/disable_service for services that must run exclusive of each other +# $1 The name of a variable containing a space-separated list of services +# $2 The name of a variable in which to store the enabled service's name +# $3 The name of the service to enable +function use_exclusive_service { + local options=${!1} + local selection=$3 + out=$2 + [ -z $selection ] || [[ ! "$options" =~ "$selection" ]] && return 1 + for opt in $options;do + [[ "$opt" = "$selection" ]] && enable_service $opt || disable_service $opt + done + eval "$out=$selection" + return 0 +} # Wrapper for ``yum`` to set proxy environment variables # Uses globals ``OFFLINE``, ``*_proxy` diff --git a/lib/cinder b/lib/cinder index 08c840e8dc..51acfa5679 100644 --- a/lib/cinder +++ b/lib/cinder @@ -112,7 +112,9 @@ function configure_cinder() { iniset $CINDER_CONF DEFAULT volume_group $VOLUME_GROUP iniset $CINDER_CONF DEFAULT volume_name_template ${VOLUME_NAME_PREFIX}%s iniset $CINDER_CONF DEFAULT iscsi_helper tgtadm - iniset $CINDER_CONF DEFAULT sql_connection $BASE_SQL_CONN/cinder?charset=utf8 + local dburl + database_connection_url dburl cinder + iniset $CINDER_CONF DEFAULT sql_connection $dburl iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI iniset $CINDER_CONF DEFAULT root_helper "sudo ${CINDER_ROOTWRAP}" iniset $CINDER_CONF DEFAULT osapi_volume_extension cinder.api.openstack.volume.contrib.standard_extensions @@ -141,10 +143,9 @@ function init_cinder() { # Force nova volumes off NOVA_ENABLED_APIS=$(echo $NOVA_ENABLED_APIS | sed "s/osapi_volume,//") - if is_service_enabled mysql; then + if is_service_enabled $DATABASE_BACKENDS; then # (re)create cinder database - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS cinder;' - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE cinder;' + recreate_database cinder utf8 # (re)create cinder database $CINDER_BIN_DIR/cinder-manage db sync diff --git a/lib/database b/lib/database new file mode 100644 index 0000000000..66fb36fb45 --- /dev/null +++ b/lib/database @@ -0,0 +1,103 @@ +# lib/database +# Interface for interacting with different database backends + +# Dependencies: +# DATABASE_BACKENDS variable must contain a list of available database backends +# DATABASE_TYPE variable must be set + +# Each database must implement four functions: +# recreate_database_$DATABASE_TYPE +# install_database_$DATABASE_TYPE +# configure_database_$DATABASE_TYPE +# database_connection_url_$DATABASE_TYPE +# +# and call register_database $DATABASE_TYPE + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set +o xtrace + +# Register a database backend +# $1 The name of the database backend +function register_database { + [ -z "$DATABASE_BACKENDS" ] && DATABASE_BACKENDS=$1 || DATABASE_BACKENDS+=" $1" +} + +for f in $TOP_DIR/lib/databases/*; do source $f; done + +# Set the database type based on the configuration +function initialize_database_backends { + for backend in $DATABASE_BACKENDS; do + is_service_enabled $backend && DATABASE_TYPE=$backend + done + + [ -z "$DATABASE_TYPE" ] && return 1 + + # For backward-compatibility, read in the MYSQL_HOST/USER variables and use + # them as the default values for the DATABASE_HOST/USER variables. + MYSQL_HOST=${MYSQL_HOST:-localhost} + MYSQL_USER=${MYSQL_USER:-root} + + DATABASE_HOST=${DATABASE_HOST:-${MYSQL_HOST}} + DATABASE_USER=${DATABASE_USER:-${MYSQL_USER}} + + if [ -n "$MYSQL_PASSWORD" ]; then + DATABASE_PASSWORD=$MYSQL_PASSWORD + else + read_password DATABASE_PASSWORD "ENTER A PASSWORD TO USE FOR THE DATABASE." + fi + + # We configure Nova, Horizon, Glance and Keystone to use MySQL as their + # database server. While they share a single server, each has their own + # database and tables. + + # By default this script will install and configure MySQL. If you want to + # use an existing server, you can pass in the user/password/host parameters. + # You will need to send the same ``DATABASE_PASSWORD`` to every host if you are doing + # a multi-node DevStack installation. + + # NOTE: Don't specify ``/db`` in this string so we can use it for multiple services + BASE_SQL_CONN=${BASE_SQL_CONN:-${DATABASE_TYPE}://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST} + + return 0 +} + +# Set the database backend to use +# $1 The name of the database backend to use (mysql, postgresql, ...) +function use_database { + use_exclusive_service DATABASE_BACKENDS DATABASE_TYPE $1 && return 0 + ret=$? + echo "Invalid database '$1'" + return $ret +} + +# Recreate a given database +# $1 The name of the database +# $2 The character set/encoding of the database +function recreate_database { + local db=$1 + local charset=$2 + recreate_database_$DATABASE_TYPE $db $charset +} + +# Install the database +function install_database { + install_database_$DATABASE_TYPE +} + +# Configure and start the database +function configure_database { + configure_database_$DATABASE_TYPE +} + +# Generate an SQLAlchemy connection URL and store it in a variable +# $1 The variable name in which to store the connection URL +# $2 The name of the database +function database_connection_url { + local var=$1 + local db=$2 + database_connection_url_$DATABASE_TYPE $var $db +} + +# Restore xtrace +$XTRACE diff --git a/lib/databases/mysql b/lib/databases/mysql new file mode 100644 index 0000000000..ed59290ab5 --- /dev/null +++ b/lib/databases/mysql @@ -0,0 +1,93 @@ +# lib/mysql +# Functions to control the configuration and operation of the MySQL database backend + +# Dependencies: +# DATABASE_{HOST,USER,PASSWORD} must be defined + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set +o xtrace + +register_database mysql + +function recreate_database_mysql { + local db=$1 + local charset=$2 + mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -e "DROP DATABASE IF EXISTS $db;" + mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -e "CREATE DATABASE $db CHARACTER SET $charset;" +} + +function configure_database_mysql { + echo_summary "Configuring and starting MySQL" + + if [[ "$os_PACKAGE" = "deb" ]]; then + MY_CONF=/etc/mysql/my.cnf + MYSQL=mysql + else + MY_CONF=/etc/my.cnf + MYSQL=mysqld + fi + + # Start mysql-server + if [[ "$os_PACKAGE" = "rpm" ]]; then + # RPM doesn't start the service + start_service $MYSQL + # Set the root password - only works the first time + sudo mysqladmin -u root password $DATABASE_PASSWORD || true + fi + # Update the DB to give user ‘$DATABASE_USER’@’%’ full control of the all databases: + sudo mysql -uroot -p$DATABASE_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';" + + # Now update ``my.cnf`` for some local needs and restart the mysql service + + # Change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) + sudo sed -i '/^bind-address/s/127.0.0.1/0.0.0.0/g' $MY_CONF + + # Set default db type to InnoDB + if sudo grep -q "default-storage-engine" $MY_CONF; then + # Change it + sudo bash -c "source $TOP_DIR/functions; iniset $MY_CONF mysqld default-storage-engine InnoDB" + else + # Add it + sudo sed -i -e "/^\[mysqld\]/ a \ +default-storage-engine = InnoDB" $MY_CONF + fi + + restart_service $MYSQL +} + +function install_database_mysql { + if [[ "$os_PACKAGE" = "deb" ]]; then + # Seed configuration with mysql password so that apt-get install doesn't + # prompt us for a password upon install. + cat <$HOME/.my.cnf +[client] +user=$DATABASE_USER +password=$DATABASE_PASSWORD +host=$DATABASE_HOST +EOF + chmod 0600 $HOME/.my.cnf + fi + # Install mysql-server + install_package mysql-server +} + +function database_connection_url_mysql { + local output=$1 + local db=$2 + eval "$output=$BASE_SQL_CONN/$db?charset=utf8" +} + +# Restore xtrace +$XTRACE diff --git a/lib/databases/postgresql b/lib/databases/postgresql new file mode 100644 index 0000000000..81989f2e07 --- /dev/null +++ b/lib/databases/postgresql @@ -0,0 +1,70 @@ +# lib/postgresql +# Functions to control the configuration and operation of the PostgreSQL database backend + +# Dependencies: +# DATABASE_{HOST,USER,PASSWORD} must be defined + +# Save trace setting +XTRACE=$(set +o | grep xtrace) +set +o xtrace + +register_database postgresql + +function recreate_database_postgresql { + local db=$1 + local charset=$2 + # Avoid unsightly error when calling dropdb when the database doesn't exist + psql -h$DATABASE_HOST -U$DATABASE_USER -dtemplate1 -c "DROP DATABASE IF EXISTS $db" + createdb -h $DATABASE_HOST -U$DATABASE_USER -l C -T template0 -E $charset $db +} + +function configure_database_postgresql { + echo_summary "Configuring and starting PostgreSQL" + if [[ "$os_PACKAGE" = "rpm" ]]; then + PG_HBA=/var/lib/pgsql/data/pg_hba.conf + PG_CONF=/var/lib/pgsql/data/postgresql.conf + else + PG_DIR=`find /etc/postgresql -name pg_hba.conf|xargs dirname` + PG_HBA=$PG_DIR/pg_hba.conf + PG_CONF=$PG_DIR/postgresql.conf + fi + sudo [ -e /var/lib/pgsql/data ] || sudo postgresql-setup initdb + # Listen on all addresses + sudo sed -i "/listen_addresses/s/.*/listen_addresses = '*'/" $PG_CONF + # Do password auth from all IPv4 clients + sudo sed -i "/^host/s/all\s\+127.0.0.1\/32\s\+ident/$DATABASE_USER\t0.0.0.0\/0\tpassword/" $PG_HBA + # Do password auth for all IPv6 clients + sudo sed -i "/^host/s/all\s\+::1\/128\s\+ident/$DATABASE_USER\t::0\/0\tpassword/" $PG_HBA + start_service postgresql + + # If creating the role fails, chances are it already existed. Try to alter it. + sudo -u postgres -i psql -c "CREATE ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" || \ + sudo -u postgres -i psql -c "ALTER ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" +} + +function install_database_postgresql { + echo_summary "Installing postgresql" + PGPASS=$HOME/.pgpass + if [[ ! -e $PGPASS ]]; then + cat < $PGPASS +*:*:*:$DATABASE_USER:$DATABASE_PASSWORD +EOF + chmod 0600 $PGPASS + else + sed -i "s/:root:\w\+/:root:$DATABASE_PASSWORD/" $PGPASS + fi + if [[ "$os_PACKAGE" = "rpm" ]]; then + install_package postgresql-server + else + install_package postgresql + fi +} + +function database_connection_url_postgresql { + local output=$1 + local db=$2 + eval "$output=$BASE_SQL_CONN/$db?client_encoding=utf8" +} + +# Restore xtrace +$XTRACE diff --git a/lib/glance b/lib/glance index 070c80d1ab..afddcd217d 100644 --- a/lib/glance +++ b/lib/glance @@ -81,7 +81,9 @@ function configure_glance() { cp $GLANCE_DIR/etc/glance-registry.conf $GLANCE_REGISTRY_CONF iniset $GLANCE_REGISTRY_CONF DEFAULT debug True inicomment $GLANCE_REGISTRY_CONF DEFAULT log_file - iniset $GLANCE_REGISTRY_CONF DEFAULT sql_connection $BASE_SQL_CONN/glance?charset=utf8 + local dburl + database_connection_url dburl glance + iniset $GLANCE_REGISTRY_CONF DEFAULT sql_connection $dburl iniset $GLANCE_REGISTRY_CONF DEFAULT use_syslog $SYSLOG iniset $GLANCE_REGISTRY_CONF paste_deploy flavor keystone iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST @@ -95,7 +97,7 @@ function configure_glance() { cp $GLANCE_DIR/etc/glance-api.conf $GLANCE_API_CONF iniset $GLANCE_API_CONF DEFAULT debug True inicomment $GLANCE_API_CONF DEFAULT log_file - iniset $GLANCE_API_CONF DEFAULT sql_connection $BASE_SQL_CONN/glance?charset=utf8 + iniset $GLANCE_API_CONF DEFAULT sql_connection $dburl iniset $GLANCE_API_CONF DEFAULT use_syslog $SYSLOG iniset $GLANCE_API_CONF DEFAULT filesystem_store_datadir $GLANCE_IMAGE_DIR/ iniset $GLANCE_API_CONF DEFAULT image_cache_dir $GLANCE_CACHE_DIR/ @@ -149,8 +151,7 @@ function init_glance() { mkdir -p $GLANCE_CACHE_DIR # (re)create glance database - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS glance;' - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE glance CHARACTER SET utf8;' + recreate_database glance utf8 $GLANCE_BIN_DIR/glance-manage db_sync } diff --git a/lib/heat b/lib/heat index 7fb5fcc5ae..d1f1c7cf31 100644 --- a/lib/heat +++ b/lib/heat @@ -120,7 +120,9 @@ function configure_heat() { iniset $HEAT_ENGINE_CONF DEFAULT use_syslog $SYSLOG iniset $HEAT_ENGINE_CONF DEFAULT bind_host $HEAT_ENGINE_HOST iniset $HEAT_ENGINE_CONF DEFAULT bind_port $HEAT_ENGINE_PORT - iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $BASE_SQL_CONN/heat?charset=utf8 + local dburl + database_connection_url dburl heat + iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $dburl iniset $HEAT_ENGINE_CONF DEFAULT auth_encryption_key `hexdump -n 16 -v -e '/1 "%02x"' /dev/random` if is_service_enabled rabbit; then @@ -185,8 +187,7 @@ function configure_heat() { function init_heat() { # (re)create heat database - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS heat;' - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE heat CHARACTER SET utf8;' + recreate_database heat utf8 $HEAT_DIR/bin/heat-db-setup $os_PACKAGE -r $MYSQL_PASSWORD $HEAT_DIR/tools/nova_create_flavors.sh diff --git a/lib/keystone b/lib/keystone index 73d82c58bf..ac15cbd00a 100644 --- a/lib/keystone +++ b/lib/keystone @@ -82,9 +82,11 @@ function configure_keystone() { fi # Rewrite stock ``keystone.conf`` + local dburl + database_connection_url dburl keystone iniset $KEYSTONE_CONF DEFAULT admin_token "$SERVICE_TOKEN" iniset $KEYSTONE_CONF signing token_format "$KEYSTONE_TOKEN_FORMAT" - iniset $KEYSTONE_CONF sql connection "$BASE_SQL_CONN/keystone?charset=utf8" + iniset $KEYSTONE_CONF sql connection $dburl iniset $KEYSTONE_CONF ec2 driver "keystone.contrib.ec2.backends.sql.Ec2" sed -e " /^pipeline.*ec2_extension crud_/s|ec2_extension crud_extension|ec2_extension s3_extension crud_extension|; @@ -141,8 +143,7 @@ function configure_keystone() { # init_keystone() - Initialize databases, etc. function init_keystone() { # (Re)create keystone database - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS keystone;' - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE keystone CHARACTER SET utf8;' + recreate_database keystone utf8 # Initialize keystone database $KEYSTONE_DIR/bin/keystone-manage db_sync diff --git a/lib/nova b/lib/nova index 77979276b3..4997175420 100644 --- a/lib/nova +++ b/lib/nova @@ -296,7 +296,9 @@ function create_nova_conf() { add_nova_opt "s3_port=$S3_SERVICE_PORT" add_nova_opt "osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions" add_nova_opt "my_ip=$HOST_IP" - add_nova_opt "sql_connection=$BASE_SQL_CONN/nova?charset=utf8" + local dburl + database_connection_url dburl nova + add_nova_opt "sql_connection=$dburl" add_nova_opt "libvirt_type=$LIBVIRT_TYPE" add_nova_opt "libvirt_cpu_mode=none" add_nova_opt "instance_name_template=${INSTANCE_NAME_PREFIX}%08x" @@ -372,14 +374,12 @@ function init_nova() { # All nova components talk to a central database. We will need to do this step # only once for an entire cluster. - if is_service_enabled mysql && is_service_enabled nova; then + if is_service_enabled $DATABASE_BACKENDS && is_service_enabled nova; then # (Re)create nova database - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS nova;' - # Explicitly use latin1: to avoid lp#829209, nova expects the database to # use latin1 by default, and then upgrades the database to utf8 (see the # 082_essex.py in nova) - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE nova CHARACTER SET latin1;' + recreate_database nova latin1 # (Re)create nova database $NOVA_BIN_DIR/nova-manage db sync diff --git a/stack.sh b/stack.sh index 29e495378b..b140385e8e 100755 --- a/stack.sh +++ b/stack.sh @@ -30,6 +30,8 @@ source $TOP_DIR/functions # and ``DISTRO`` GetDistro +# Import database library (must be loaded before stackrc which sources localrc) +source $TOP_DIR/lib/database # Settings # ======== @@ -37,15 +39,15 @@ GetDistro # ``stack.sh`` is customizable through setting environment variables. If you # want to override a setting you can set and export it:: # -# export MYSQL_PASSWORD=anothersecret +# export DATABASE_PASSWORD=anothersecret # ./stack.sh # -# You can also pass options on a single line ``MYSQL_PASSWORD=simple ./stack.sh`` +# You can also pass options on a single line ``DATABASE_PASSWORD=simple ./stack.sh`` # # Additionally, you can put any local variables into a ``localrc`` file:: # -# MYSQL_PASSWORD=anothersecret -# MYSQL_USER=hellaroot +# DATABASE_PASSWORD=anothersecret +# DATABASE_USER=hellaroot # # We try to have sensible defaults, so you should be able to run ``./stack.sh`` # in most cases. ``localrc`` is not distributed with DevStack and will never @@ -471,24 +473,21 @@ FLAT_INTERFACE=${FLAT_INTERFACE-$GUEST_INTERFACE_DEFAULT} # With Quantum networking the NET_MAN variable is ignored. -# MySQL & (RabbitMQ or Qpid) +# Database configuration +# ---------------------- +# To select between database backends, add a line to localrc like: +# +# use_database postgresql +# +# The available database backends are defined in the DATABASE_BACKENDS +# variable defined in stackrc. By default, MySQL is enabled as the database +# backend. + +initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || echo "No database enabled" + +# RabbitMQ or Qpid # -------------------------- -# We configure Nova, Horizon, Glance and Keystone to use MySQL as their -# database server. While they share a single server, each has their own -# database and tables. - -# By default this script will install and configure MySQL. If you want to -# use an existing server, you can pass in the user/password/host parameters. -# You will need to send the same ``MYSQL_PASSWORD`` to every host if you are doing -# a multi-node DevStack installation. -MYSQL_HOST=${MYSQL_HOST:-localhost} -MYSQL_USER=${MYSQL_USER:-root} -read_password MYSQL_PASSWORD "ENTER A PASSWORD TO USE FOR MYSQL." - -# NOTE: Don't specify ``/db`` in this string so we can use it for multiple services -BASE_SQL_CONN=${BASE_SQL_CONN:-mysql://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST} - # Rabbit connection info if is_service_enabled rabbit; then RABBIT_HOST=${RABBIT_HOST:-localhost} @@ -746,32 +745,8 @@ elif is_service_enabled zeromq; then fi fi -if is_service_enabled mysql; then - - if [[ "$os_PACKAGE" = "deb" ]]; then - # Seed configuration with mysql password so that apt-get install doesn't - # prompt us for a password upon install. - cat <$HOME/.my.cnf -[client] -user=$MYSQL_USER -password=$MYSQL_PASSWORD -host=$MYSQL_HOST -EOF - chmod 0600 $HOME/.my.cnf - fi - # Install mysql-server - install_package mysql-server +if is_service_enabled $DATABASE_BACKENDS; then + install_database fi if is_service_enabled horizon; then @@ -993,46 +968,10 @@ elif is_service_enabled qpid; then fi -# Mysql -# ----- - -if is_service_enabled mysql; then - echo_summary "Configuring and starting MySQL" - - if [[ "$os_PACKAGE" = "deb" ]]; then - MY_CONF=/etc/mysql/my.cnf - MYSQL=mysql - else - MY_CONF=/etc/my.cnf - MYSQL=mysqld - fi - - # Start mysql-server - if [[ "$os_PACKAGE" = "rpm" ]]; then - # RPM doesn't start the service - start_service $MYSQL - # Set the root password - only works the first time - sudo mysqladmin -u root password $MYSQL_PASSWORD || true - fi - # Update the DB to give user ‘$MYSQL_USER’@’%’ full control of the all databases: - sudo mysql -uroot -p$MYSQL_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'%' identified by '$MYSQL_PASSWORD';" - - # Now update ``my.cnf`` for some local needs and restart the mysql service - - # Change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) - sudo sed -i '/^bind-address/s/127.0.0.1/0.0.0.0/g' $MY_CONF - - # Set default db type to InnoDB - if sudo grep -q "default-storage-engine" $MY_CONF; then - # Change it - sudo bash -c "source $TOP_DIR/functions; iniset $MY_CONF mysqld default-storage-engine InnoDB" - else - # Add it - sudo sed -i -e "/^\[mysqld\]/ a \ -default-storage-engine = InnoDB" $MY_CONF - fi - - restart_service $MYSQL +# Configure database +# ------------------ +if is_service_enabled $DATABASE_BACKENDS; then + configure_database fi if [ -z "$SCREEN_HARDSTATUS" ]; then @@ -1283,7 +1222,9 @@ if is_service_enabled quantum; then Q_PLUGIN_CONF_FILE=$Q_PLUGIN_CONF_PATH/$Q_PLUGIN_CONF_FILENAME cp $QUANTUM_DIR/$Q_PLUGIN_CONF_FILE /$Q_PLUGIN_CONF_FILE - iniset /$Q_PLUGIN_CONF_FILE DATABASE sql_connection mysql:\/\/$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST\/$Q_DB_NAME?charset=utf8 + database_connection_url dburl $Q_DB_NAME + iniset /$Q_PLUGIN_CONF_FILE DATABASE sql_connection $dburl + unset dburl Q_CONF_FILE=/etc/quantum/quantum.conf cp $QUANTUM_DIR/etc/quantum.conf $Q_CONF_FILE @@ -1309,12 +1250,11 @@ if is_service_enabled q-svc; then cp $QUANTUM_DIR/etc/api-paste.ini $Q_API_PASTE_FILE cp $QUANTUM_DIR/etc/policy.json $Q_POLICY_FILE - if is_service_enabled mysql; then - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "DROP DATABASE IF EXISTS $Q_DB_NAME;" - mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $Q_DB_NAME CHARACTER SET utf8;" - else - echo "mysql must be enabled in order to use the $Q_PLUGIN Quantum plugin." - exit 1 + if is_service_enabled $DATABASE_BACKENDS; then + recreate_database $Q_DB_NAME utf8 + else + echo "A database must be enabled in order to use the $Q_PLUGIN Quantum plugin." + exit 1 fi # Update either configuration file with plugin @@ -1974,7 +1914,7 @@ if is_service_enabled q-svc; then fi fi -elif is_service_enabled mysql && is_service_enabled nova; then +elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled nova; then # Create a small network $NOVA_BIN_DIR/nova-manage network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS diff --git a/unstack.sh b/unstack.sh index 42cb7aff0d..6b34aa3aa7 100755 --- a/unstack.sh +++ b/unstack.sh @@ -15,6 +15,9 @@ TOP_DIR=$(cd $(dirname "$0") && pwd) # Import common functions source $TOP_DIR/functions +# Import database library +source $TOP_DIR/lib/database + # Load local configuration source $TOP_DIR/stackrc @@ -102,6 +105,10 @@ if [[ -n "$UNSTACK_ALL" ]]; then stop_service mysql fi + if is_service_enabled postgresql; then + stop_service postgresql + fi + # Stop rabbitmq-server if is_service_enabled rabbit; then stop_service rabbitmq-server