| ... | ... |
@@ -57,6 +57,15 @@ If the EC2 API is your cup-o-tea, you can create credentials and use euca2ools: |
| 57 | 57 |
|
| 58 | 58 |
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. |
| 59 | 59 |
|
| 60 |
+# Database Backend |
|
| 61 |
+ |
|
| 62 |
+Multiple database backends are available. The available databases are defined in the lib/databases directory. |
|
| 63 |
+To choose a database backend, add a line to your `localrc` like: |
|
| 64 |
+ |
|
| 65 |
+ use_database postgresql |
|
| 66 |
+ |
|
| 67 |
+By default, the mysql database backend is used. |
|
| 68 |
+ |
|
| 60 | 69 |
# RPC Backend |
| 61 | 70 |
|
| 62 | 71 |
Multiple RPC backends are available. Currently, this |
| ... | ... |
@@ -836,6 +836,21 @@ function upload_image() {
|
| 836 | 836 |
fi |
| 837 | 837 |
} |
| 838 | 838 |
|
| 839 |
+# Toggle enable/disable_service for services that must run exclusive of each other |
|
| 840 |
+# $1 The name of a variable containing a space-separated list of services |
|
| 841 |
+# $2 The name of a variable in which to store the enabled service's name |
|
| 842 |
+# $3 The name of the service to enable |
|
| 843 |
+function use_exclusive_service {
|
|
| 844 |
+ local options=${!1}
|
|
| 845 |
+ local selection=$3 |
|
| 846 |
+ out=$2 |
|
| 847 |
+ [ -z $selection ] || [[ ! "$options" =~ "$selection" ]] && return 1 |
|
| 848 |
+ for opt in $options;do |
|
| 849 |
+ [[ "$opt" = "$selection" ]] && enable_service $opt || disable_service $opt |
|
| 850 |
+ done |
|
| 851 |
+ eval "$out=$selection" |
|
| 852 |
+ return 0 |
|
| 853 |
+} |
|
| 839 | 854 |
|
| 840 | 855 |
# Wrapper for ``yum`` to set proxy environment variables |
| 841 | 856 |
# Uses globals ``OFFLINE``, ``*_proxy` |
| ... | ... |
@@ -117,7 +117,9 @@ function configure_cinder() {
|
| 117 | 117 |
iniset $CINDER_CONF DEFAULT volume_group $VOLUME_GROUP |
| 118 | 118 |
iniset $CINDER_CONF DEFAULT volume_name_template ${VOLUME_NAME_PREFIX}%s
|
| 119 | 119 |
iniset $CINDER_CONF DEFAULT iscsi_helper tgtadm |
| 120 |
- iniset $CINDER_CONF DEFAULT sql_connection $BASE_SQL_CONN/cinder?charset=utf8 |
|
| 120 |
+ local dburl |
|
| 121 |
+ database_connection_url dburl cinder |
|
| 122 |
+ iniset $CINDER_CONF DEFAULT sql_connection $dburl |
|
| 121 | 123 |
iniset $CINDER_CONF DEFAULT api_paste_config $CINDER_API_PASTE_INI |
| 122 | 124 |
iniset $CINDER_CONF DEFAULT root_helper "sudo ${CINDER_ROOTWRAP}"
|
| 123 | 125 |
iniset $CINDER_CONF DEFAULT osapi_volume_extension cinder.api.openstack.volume.contrib.standard_extensions |
| ... | ... |
@@ -146,10 +148,9 @@ function init_cinder() {
|
| 146 | 146 |
# Force nova volumes off |
| 147 | 147 |
NOVA_ENABLED_APIS=$(echo $NOVA_ENABLED_APIS | sed "s/osapi_volume,//") |
| 148 | 148 |
|
| 149 |
- if is_service_enabled mysql; then |
|
| 149 |
+ if is_service_enabled $DATABASE_BACKENDS; then |
|
| 150 | 150 |
# (re)create cinder database |
| 151 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS cinder;' |
|
| 152 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE cinder;' |
|
| 151 |
+ recreate_database cinder utf8 |
|
| 153 | 152 |
|
| 154 | 153 |
# (re)create cinder database |
| 155 | 154 |
$CINDER_BIN_DIR/cinder-manage db sync |
| 156 | 155 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,103 @@ |
| 0 |
+# lib/database |
|
| 1 |
+# Interface for interacting with different database backends |
|
| 2 |
+ |
|
| 3 |
+# Dependencies: |
|
| 4 |
+# DATABASE_BACKENDS variable must contain a list of available database backends |
|
| 5 |
+# DATABASE_TYPE variable must be set |
|
| 6 |
+ |
|
| 7 |
+# Each database must implement four functions: |
|
| 8 |
+# recreate_database_$DATABASE_TYPE |
|
| 9 |
+# install_database_$DATABASE_TYPE |
|
| 10 |
+# configure_database_$DATABASE_TYPE |
|
| 11 |
+# database_connection_url_$DATABASE_TYPE |
|
| 12 |
+# |
|
| 13 |
+# and call register_database $DATABASE_TYPE |
|
| 14 |
+ |
|
| 15 |
+# Save trace setting |
|
| 16 |
+XTRACE=$(set +o | grep xtrace) |
|
| 17 |
+set +o xtrace |
|
| 18 |
+ |
|
| 19 |
+# Register a database backend |
|
| 20 |
+# $1 The name of the database backend |
|
| 21 |
+function register_database {
|
|
| 22 |
+ [ -z "$DATABASE_BACKENDS" ] && DATABASE_BACKENDS=$1 || DATABASE_BACKENDS+=" $1" |
|
| 23 |
+} |
|
| 24 |
+ |
|
| 25 |
+for f in $TOP_DIR/lib/databases/*; do source $f; done |
|
| 26 |
+ |
|
| 27 |
+# Set the database type based on the configuration |
|
| 28 |
+function initialize_database_backends {
|
|
| 29 |
+ for backend in $DATABASE_BACKENDS; do |
|
| 30 |
+ is_service_enabled $backend && DATABASE_TYPE=$backend |
|
| 31 |
+ done |
|
| 32 |
+ |
|
| 33 |
+ [ -z "$DATABASE_TYPE" ] && return 1 |
|
| 34 |
+ |
|
| 35 |
+ # For backward-compatibility, read in the MYSQL_HOST/USER variables and use |
|
| 36 |
+ # them as the default values for the DATABASE_HOST/USER variables. |
|
| 37 |
+ MYSQL_HOST=${MYSQL_HOST:-localhost}
|
|
| 38 |
+ MYSQL_USER=${MYSQL_USER:-root}
|
|
| 39 |
+ |
|
| 40 |
+ DATABASE_HOST=${DATABASE_HOST:-${MYSQL_HOST}}
|
|
| 41 |
+ DATABASE_USER=${DATABASE_USER:-${MYSQL_USER}}
|
|
| 42 |
+ |
|
| 43 |
+ if [ -n "$MYSQL_PASSWORD" ]; then |
|
| 44 |
+ DATABASE_PASSWORD=$MYSQL_PASSWORD |
|
| 45 |
+ else |
|
| 46 |
+ read_password DATABASE_PASSWORD "ENTER A PASSWORD TO USE FOR THE DATABASE." |
|
| 47 |
+ fi |
|
| 48 |
+ |
|
| 49 |
+ # We configure Nova, Horizon, Glance and Keystone to use MySQL as their |
|
| 50 |
+ # database server. While they share a single server, each has their own |
|
| 51 |
+ # database and tables. |
|
| 52 |
+ |
|
| 53 |
+ # By default this script will install and configure MySQL. If you want to |
|
| 54 |
+ # use an existing server, you can pass in the user/password/host parameters. |
|
| 55 |
+ # You will need to send the same ``DATABASE_PASSWORD`` to every host if you are doing |
|
| 56 |
+ # a multi-node DevStack installation. |
|
| 57 |
+ |
|
| 58 |
+ # NOTE: Don't specify ``/db`` in this string so we can use it for multiple services |
|
| 59 |
+ BASE_SQL_CONN=${BASE_SQL_CONN:-${DATABASE_TYPE}://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST}
|
|
| 60 |
+ |
|
| 61 |
+ return 0 |
|
| 62 |
+} |
|
| 63 |
+ |
|
| 64 |
+# Set the database backend to use |
|
| 65 |
+# $1 The name of the database backend to use (mysql, postgresql, ...) |
|
| 66 |
+function use_database {
|
|
| 67 |
+ use_exclusive_service DATABASE_BACKENDS DATABASE_TYPE $1 && return 0 |
|
| 68 |
+ ret=$? |
|
| 69 |
+ echo "Invalid database '$1'" |
|
| 70 |
+ return $ret |
|
| 71 |
+} |
|
| 72 |
+ |
|
| 73 |
+# Recreate a given database |
|
| 74 |
+# $1 The name of the database |
|
| 75 |
+# $2 The character set/encoding of the database |
|
| 76 |
+function recreate_database {
|
|
| 77 |
+ local db=$1 |
|
| 78 |
+ local charset=$2 |
|
| 79 |
+ recreate_database_$DATABASE_TYPE $db $charset |
|
| 80 |
+} |
|
| 81 |
+ |
|
| 82 |
+# Install the database |
|
| 83 |
+function install_database {
|
|
| 84 |
+ install_database_$DATABASE_TYPE |
|
| 85 |
+} |
|
| 86 |
+ |
|
| 87 |
+# Configure and start the database |
|
| 88 |
+function configure_database {
|
|
| 89 |
+ configure_database_$DATABASE_TYPE |
|
| 90 |
+} |
|
| 91 |
+ |
|
| 92 |
+# Generate an SQLAlchemy connection URL and store it in a variable |
|
| 93 |
+# $1 The variable name in which to store the connection URL |
|
| 94 |
+# $2 The name of the database |
|
| 95 |
+function database_connection_url {
|
|
| 96 |
+ local var=$1 |
|
| 97 |
+ local db=$2 |
|
| 98 |
+ database_connection_url_$DATABASE_TYPE $var $db |
|
| 99 |
+} |
|
| 100 |
+ |
|
| 101 |
+# Restore xtrace |
|
| 102 |
+$XTRACE |
| 0 | 103 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,93 @@ |
| 0 |
+# lib/mysql |
|
| 1 |
+# Functions to control the configuration and operation of the MySQL database backend |
|
| 2 |
+ |
|
| 3 |
+# Dependencies: |
|
| 4 |
+# DATABASE_{HOST,USER,PASSWORD} must be defined
|
|
| 5 |
+ |
|
| 6 |
+# Save trace setting |
|
| 7 |
+XTRACE=$(set +o | grep xtrace) |
|
| 8 |
+set +o xtrace |
|
| 9 |
+ |
|
| 10 |
+register_database mysql |
|
| 11 |
+ |
|
| 12 |
+function recreate_database_mysql {
|
|
| 13 |
+ local db=$1 |
|
| 14 |
+ local charset=$2 |
|
| 15 |
+ mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -e "DROP DATABASE IF EXISTS $db;" |
|
| 16 |
+ mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -e "CREATE DATABASE $db CHARACTER SET $charset;" |
|
| 17 |
+} |
|
| 18 |
+ |
|
| 19 |
+function configure_database_mysql {
|
|
| 20 |
+ echo_summary "Configuring and starting MySQL" |
|
| 21 |
+ |
|
| 22 |
+ if [[ "$os_PACKAGE" = "deb" ]]; then |
|
| 23 |
+ MY_CONF=/etc/mysql/my.cnf |
|
| 24 |
+ MYSQL=mysql |
|
| 25 |
+ else |
|
| 26 |
+ MY_CONF=/etc/my.cnf |
|
| 27 |
+ MYSQL=mysqld |
|
| 28 |
+ fi |
|
| 29 |
+ |
|
| 30 |
+ # Start mysql-server |
|
| 31 |
+ if [[ "$os_PACKAGE" = "rpm" ]]; then |
|
| 32 |
+ # RPM doesn't start the service |
|
| 33 |
+ start_service $MYSQL |
|
| 34 |
+ # Set the root password - only works the first time |
|
| 35 |
+ sudo mysqladmin -u root password $DATABASE_PASSWORD || true |
|
| 36 |
+ fi |
|
| 37 |
+ # Update the DB to give user ‘$DATABASE_USER’@’%’ full control of the all databases: |
|
| 38 |
+ sudo mysql -uroot -p$DATABASE_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$DATABASE_USER'@'%' identified by '$DATABASE_PASSWORD';" |
|
| 39 |
+ |
|
| 40 |
+ # Now update ``my.cnf`` for some local needs and restart the mysql service |
|
| 41 |
+ |
|
| 42 |
+ # Change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) |
|
| 43 |
+ sudo sed -i '/^bind-address/s/127.0.0.1/0.0.0.0/g' $MY_CONF |
|
| 44 |
+ |
|
| 45 |
+ # Set default db type to InnoDB |
|
| 46 |
+ if sudo grep -q "default-storage-engine" $MY_CONF; then |
|
| 47 |
+ # Change it |
|
| 48 |
+ sudo bash -c "source $TOP_DIR/functions; iniset $MY_CONF mysqld default-storage-engine InnoDB" |
|
| 49 |
+ else |
|
| 50 |
+ # Add it |
|
| 51 |
+ sudo sed -i -e "/^\[mysqld\]/ a \ |
|
| 52 |
+default-storage-engine = InnoDB" $MY_CONF |
|
| 53 |
+ fi |
|
| 54 |
+ |
|
| 55 |
+ restart_service $MYSQL |
|
| 56 |
+} |
|
| 57 |
+ |
|
| 58 |
+function install_database_mysql {
|
|
| 59 |
+ if [[ "$os_PACKAGE" = "deb" ]]; then |
|
| 60 |
+ # Seed configuration with mysql password so that apt-get install doesn't |
|
| 61 |
+ # prompt us for a password upon install. |
|
| 62 |
+ cat <<MYSQL_PRESEED | sudo debconf-set-selections |
|
| 63 |
+mysql-server-5.1 mysql-server/root_password password $DATABASE_PASSWORD |
|
| 64 |
+mysql-server-5.1 mysql-server/root_password_again password $DATABASE_PASSWORD |
|
| 65 |
+mysql-server-5.1 mysql-server/start_on_boot boolean true |
|
| 66 |
+MYSQL_PRESEED |
|
| 67 |
+ fi |
|
| 68 |
+ |
|
| 69 |
+ # while ``.my.cnf`` is not needed for OpenStack to function, it is useful |
|
| 70 |
+ # as it allows you to access the mysql databases via ``mysql nova`` instead |
|
| 71 |
+ # of having to specify the username/password each time. |
|
| 72 |
+ if [[ ! -e $HOME/.my.cnf ]]; then |
|
| 73 |
+ cat <<EOF >$HOME/.my.cnf |
|
| 74 |
+[client] |
|
| 75 |
+user=$DATABASE_USER |
|
| 76 |
+password=$DATABASE_PASSWORD |
|
| 77 |
+host=$DATABASE_HOST |
|
| 78 |
+EOF |
|
| 79 |
+ chmod 0600 $HOME/.my.cnf |
|
| 80 |
+ fi |
|
| 81 |
+ # Install mysql-server |
|
| 82 |
+ install_package mysql-server |
|
| 83 |
+} |
|
| 84 |
+ |
|
| 85 |
+function database_connection_url_mysql {
|
|
| 86 |
+ local output=$1 |
|
| 87 |
+ local db=$2 |
|
| 88 |
+ eval "$output=$BASE_SQL_CONN/$db?charset=utf8" |
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+# Restore xtrace |
|
| 92 |
+$XTRACE |
| 0 | 93 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,70 @@ |
| 0 |
+# lib/postgresql |
|
| 1 |
+# Functions to control the configuration and operation of the PostgreSQL database backend |
|
| 2 |
+ |
|
| 3 |
+# Dependencies: |
|
| 4 |
+# DATABASE_{HOST,USER,PASSWORD} must be defined
|
|
| 5 |
+ |
|
| 6 |
+# Save trace setting |
|
| 7 |
+XTRACE=$(set +o | grep xtrace) |
|
| 8 |
+set +o xtrace |
|
| 9 |
+ |
|
| 10 |
+register_database postgresql |
|
| 11 |
+ |
|
| 12 |
+function recreate_database_postgresql {
|
|
| 13 |
+ local db=$1 |
|
| 14 |
+ local charset=$2 |
|
| 15 |
+ # Avoid unsightly error when calling dropdb when the database doesn't exist |
|
| 16 |
+ psql -h$DATABASE_HOST -U$DATABASE_USER -dtemplate1 -c "DROP DATABASE IF EXISTS $db" |
|
| 17 |
+ createdb -h $DATABASE_HOST -U$DATABASE_USER -l C -T template0 -E $charset $db |
|
| 18 |
+} |
|
| 19 |
+ |
|
| 20 |
+function configure_database_postgresql {
|
|
| 21 |
+ echo_summary "Configuring and starting PostgreSQL" |
|
| 22 |
+ if [[ "$os_PACKAGE" = "rpm" ]]; then |
|
| 23 |
+ PG_HBA=/var/lib/pgsql/data/pg_hba.conf |
|
| 24 |
+ PG_CONF=/var/lib/pgsql/data/postgresql.conf |
|
| 25 |
+ else |
|
| 26 |
+ PG_DIR=`find /etc/postgresql -name pg_hba.conf|xargs dirname` |
|
| 27 |
+ PG_HBA=$PG_DIR/pg_hba.conf |
|
| 28 |
+ PG_CONF=$PG_DIR/postgresql.conf |
|
| 29 |
+ fi |
|
| 30 |
+ sudo [ -e /var/lib/pgsql/data ] || sudo postgresql-setup initdb |
|
| 31 |
+ # Listen on all addresses |
|
| 32 |
+ sudo sed -i "/listen_addresses/s/.*/listen_addresses = '*'/" $PG_CONF |
|
| 33 |
+ # Do password auth from all IPv4 clients |
|
| 34 |
+ sudo sed -i "/^host/s/all\s\+127.0.0.1\/32\s\+ident/$DATABASE_USER\t0.0.0.0\/0\tpassword/" $PG_HBA |
|
| 35 |
+ # Do password auth for all IPv6 clients |
|
| 36 |
+ sudo sed -i "/^host/s/all\s\+::1\/128\s\+ident/$DATABASE_USER\t::0\/0\tpassword/" $PG_HBA |
|
| 37 |
+ start_service postgresql |
|
| 38 |
+ |
|
| 39 |
+ # If creating the role fails, chances are it already existed. Try to alter it. |
|
| 40 |
+ sudo -u postgres -i psql -c "CREATE ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" || \ |
|
| 41 |
+ sudo -u postgres -i psql -c "ALTER ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" |
|
| 42 |
+} |
|
| 43 |
+ |
|
| 44 |
+function install_database_postgresql {
|
|
| 45 |
+ echo_summary "Installing postgresql" |
|
| 46 |
+ PGPASS=$HOME/.pgpass |
|
| 47 |
+ if [[ ! -e $PGPASS ]]; then |
|
| 48 |
+ cat <<EOF > $PGPASS |
|
| 49 |
+*:*:*:$DATABASE_USER:$DATABASE_PASSWORD |
|
| 50 |
+EOF |
|
| 51 |
+ chmod 0600 $PGPASS |
|
| 52 |
+ else |
|
| 53 |
+ sed -i "s/:root:\w\+/:root:$DATABASE_PASSWORD/" $PGPASS |
|
| 54 |
+ fi |
|
| 55 |
+ if [[ "$os_PACKAGE" = "rpm" ]]; then |
|
| 56 |
+ install_package postgresql-server |
|
| 57 |
+ else |
|
| 58 |
+ install_package postgresql |
|
| 59 |
+ fi |
|
| 60 |
+} |
|
| 61 |
+ |
|
| 62 |
+function database_connection_url_postgresql {
|
|
| 63 |
+ local output=$1 |
|
| 64 |
+ local db=$2 |
|
| 65 |
+ eval "$output=$BASE_SQL_CONN/$db?client_encoding=utf8" |
|
| 66 |
+} |
|
| 67 |
+ |
|
| 68 |
+# Restore xtrace |
|
| 69 |
+$XTRACE |
| ... | ... |
@@ -83,7 +83,9 @@ function configure_glance() {
|
| 83 | 83 |
cp $GLANCE_DIR/etc/glance-registry.conf $GLANCE_REGISTRY_CONF |
| 84 | 84 |
iniset $GLANCE_REGISTRY_CONF DEFAULT debug True |
| 85 | 85 |
inicomment $GLANCE_REGISTRY_CONF DEFAULT log_file |
| 86 |
- iniset $GLANCE_REGISTRY_CONF DEFAULT sql_connection $BASE_SQL_CONN/glance?charset=utf8 |
|
| 86 |
+ local dburl |
|
| 87 |
+ database_connection_url dburl glance |
|
| 88 |
+ iniset $GLANCE_REGISTRY_CONF DEFAULT sql_connection $dburl |
|
| 87 | 89 |
iniset $GLANCE_REGISTRY_CONF DEFAULT use_syslog $SYSLOG |
| 88 | 90 |
iniset $GLANCE_REGISTRY_CONF paste_deploy flavor keystone |
| 89 | 91 |
iniset $GLANCE_REGISTRY_CONF keystone_authtoken auth_host $KEYSTONE_AUTH_HOST |
| ... | ... |
@@ -100,7 +102,7 @@ function configure_glance() {
|
| 100 | 100 |
cp $GLANCE_DIR/etc/glance-api.conf $GLANCE_API_CONF |
| 101 | 101 |
iniset $GLANCE_API_CONF DEFAULT debug True |
| 102 | 102 |
inicomment $GLANCE_API_CONF DEFAULT log_file |
| 103 |
- iniset $GLANCE_API_CONF DEFAULT sql_connection $BASE_SQL_CONN/glance?charset=utf8 |
|
| 103 |
+ iniset $GLANCE_API_CONF DEFAULT sql_connection $dburl |
|
| 104 | 104 |
iniset $GLANCE_API_CONF DEFAULT use_syslog $SYSLOG |
| 105 | 105 |
iniset $GLANCE_API_CONF DEFAULT filesystem_store_datadir $GLANCE_IMAGE_DIR/ |
| 106 | 106 |
iniset $GLANCE_API_CONF DEFAULT image_cache_dir $GLANCE_CACHE_DIR/ |
| ... | ... |
@@ -157,8 +159,7 @@ function init_glance() {
|
| 157 | 157 |
mkdir -p $GLANCE_CACHE_DIR |
| 158 | 158 |
|
| 159 | 159 |
# (re)create glance database |
| 160 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS glance;' |
|
| 161 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE glance CHARACTER SET utf8;' |
|
| 160 |
+ recreate_database glance utf8 |
|
| 162 | 161 |
|
| 163 | 162 |
$GLANCE_BIN_DIR/glance-manage db_sync |
| 164 | 163 |
|
| ... | ... |
@@ -120,7 +120,9 @@ function configure_heat() {
|
| 120 | 120 |
iniset $HEAT_ENGINE_CONF DEFAULT use_syslog $SYSLOG |
| 121 | 121 |
iniset $HEAT_ENGINE_CONF DEFAULT bind_host $HEAT_ENGINE_HOST |
| 122 | 122 |
iniset $HEAT_ENGINE_CONF DEFAULT bind_port $HEAT_ENGINE_PORT |
| 123 |
- iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $BASE_SQL_CONN/heat?charset=utf8 |
|
| 123 |
+ local dburl |
|
| 124 |
+ database_connection_url dburl heat |
|
| 125 |
+ iniset $HEAT_ENGINE_CONF DEFAULT sql_connection $dburl |
|
| 124 | 126 |
iniset $HEAT_ENGINE_CONF DEFAULT auth_encryption_key `hexdump -n 16 -v -e '/1 "%02x"' /dev/random` |
| 125 | 127 |
|
| 126 | 128 |
if is_service_enabled rabbit; then |
| ... | ... |
@@ -185,8 +187,7 @@ function configure_heat() {
|
| 185 | 185 |
function init_heat() {
|
| 186 | 186 |
|
| 187 | 187 |
# (re)create heat database |
| 188 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS heat;' |
|
| 189 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE heat CHARACTER SET utf8;' |
|
| 188 |
+ recreate_database heat utf8 |
|
| 190 | 189 |
|
| 191 | 190 |
$HEAT_DIR/bin/heat-db-setup $os_PACKAGE -r $MYSQL_PASSWORD |
| 192 | 191 |
$HEAT_DIR/tools/nova_create_flavors.sh |
| ... | ... |
@@ -86,9 +86,11 @@ function configure_keystone() {
|
| 86 | 86 |
fi |
| 87 | 87 |
|
| 88 | 88 |
# Rewrite stock ``keystone.conf`` |
| 89 |
+ local dburl |
|
| 90 |
+ database_connection_url dburl keystone |
|
| 89 | 91 |
iniset $KEYSTONE_CONF DEFAULT admin_token "$SERVICE_TOKEN" |
| 90 | 92 |
iniset $KEYSTONE_CONF signing token_format "$KEYSTONE_TOKEN_FORMAT" |
| 91 |
- iniset $KEYSTONE_CONF sql connection "$BASE_SQL_CONN/keystone?charset=utf8" |
|
| 93 |
+ iniset $KEYSTONE_CONF sql connection $dburl |
|
| 92 | 94 |
iniset $KEYSTONE_CONF ec2 driver "keystone.contrib.ec2.backends.sql.Ec2" |
| 93 | 95 |
sed -e " |
| 94 | 96 |
/^pipeline.*ec2_extension crud_/s|ec2_extension crud_extension|ec2_extension s3_extension crud_extension|; |
| ... | ... |
@@ -145,8 +147,7 @@ function configure_keystone() {
|
| 145 | 145 |
# init_keystone() - Initialize databases, etc. |
| 146 | 146 |
function init_keystone() {
|
| 147 | 147 |
# (Re)create keystone database |
| 148 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS keystone;' |
|
| 149 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE keystone CHARACTER SET utf8;' |
|
| 148 |
+ recreate_database keystone utf8 |
|
| 150 | 149 |
|
| 151 | 150 |
# Initialize keystone database |
| 152 | 151 |
$KEYSTONE_DIR/bin/keystone-manage db_sync |
| ... | ... |
@@ -302,7 +302,9 @@ function create_nova_conf() {
|
| 302 | 302 |
add_nova_opt "s3_port=$S3_SERVICE_PORT" |
| 303 | 303 |
add_nova_opt "osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions" |
| 304 | 304 |
add_nova_opt "my_ip=$HOST_IP" |
| 305 |
- add_nova_opt "sql_connection=$BASE_SQL_CONN/nova?charset=utf8" |
|
| 305 |
+ local dburl |
|
| 306 |
+ database_connection_url dburl nova |
|
| 307 |
+ add_nova_opt "sql_connection=$dburl" |
|
| 306 | 308 |
add_nova_opt "libvirt_type=$LIBVIRT_TYPE" |
| 307 | 309 |
add_nova_opt "libvirt_cpu_mode=none" |
| 308 | 310 |
add_nova_opt "instance_name_template=${INSTANCE_NAME_PREFIX}%08x"
|
| ... | ... |
@@ -378,14 +380,12 @@ function init_nova() {
|
| 378 | 378 |
# All nova components talk to a central database. We will need to do this step |
| 379 | 379 |
# only once for an entire cluster. |
| 380 | 380 |
|
| 381 |
- if is_service_enabled mysql && is_service_enabled nova; then |
|
| 381 |
+ if is_service_enabled $DATABASE_BACKENDS && is_service_enabled nova; then |
|
| 382 | 382 |
# (Re)create nova database |
| 383 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'DROP DATABASE IF EXISTS nova;' |
|
| 384 |
- |
|
| 385 | 383 |
# Explicitly use latin1: to avoid lp#829209, nova expects the database to |
| 386 | 384 |
# use latin1 by default, and then upgrades the database to utf8 (see the |
| 387 | 385 |
# 082_essex.py in nova) |
| 388 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e 'CREATE DATABASE nova CHARACTER SET latin1;' |
|
| 386 |
+ recreate_database nova latin1 |
|
| 389 | 387 |
|
| 390 | 388 |
# (Re)create nova database |
| 391 | 389 |
$NOVA_BIN_DIR/nova-manage db sync |
| ... | ... |
@@ -30,6 +30,8 @@ source $TOP_DIR/functions |
| 30 | 30 |
# and ``DISTRO`` |
| 31 | 31 |
GetDistro |
| 32 | 32 |
|
| 33 |
+# Import database library (must be loaded before stackrc which sources localrc) |
|
| 34 |
+source $TOP_DIR/lib/database |
|
| 33 | 35 |
|
| 34 | 36 |
# Settings |
| 35 | 37 |
# ======== |
| ... | ... |
@@ -37,15 +39,15 @@ GetDistro |
| 37 | 37 |
# ``stack.sh`` is customizable through setting environment variables. If you |
| 38 | 38 |
# want to override a setting you can set and export it:: |
| 39 | 39 |
# |
| 40 |
-# export MYSQL_PASSWORD=anothersecret |
|
| 40 |
+# export DATABASE_PASSWORD=anothersecret |
|
| 41 | 41 |
# ./stack.sh |
| 42 | 42 |
# |
| 43 |
-# You can also pass options on a single line ``MYSQL_PASSWORD=simple ./stack.sh`` |
|
| 43 |
+# You can also pass options on a single line ``DATABASE_PASSWORD=simple ./stack.sh`` |
|
| 44 | 44 |
# |
| 45 | 45 |
# Additionally, you can put any local variables into a ``localrc`` file:: |
| 46 | 46 |
# |
| 47 |
-# MYSQL_PASSWORD=anothersecret |
|
| 48 |
-# MYSQL_USER=hellaroot |
|
| 47 |
+# DATABASE_PASSWORD=anothersecret |
|
| 48 |
+# DATABASE_USER=hellaroot |
|
| 49 | 49 |
# |
| 50 | 50 |
# We try to have sensible defaults, so you should be able to run ``./stack.sh`` |
| 51 | 51 |
# in most cases. ``localrc`` is not distributed with DevStack and will never |
| ... | ... |
@@ -471,23 +473,20 @@ FLAT_INTERFACE=${FLAT_INTERFACE-$GUEST_INTERFACE_DEFAULT}
|
| 471 | 471 |
# With Quantum networking the NET_MAN variable is ignored. |
| 472 | 472 |
|
| 473 | 473 |
|
| 474 |
-# MySQL & (RabbitMQ or Qpid) |
|
| 475 |
-# -------------------------- |
|
| 476 |
- |
|
| 477 |
-# We configure Nova, Horizon, Glance and Keystone to use MySQL as their |
|
| 478 |
-# database server. While they share a single server, each has their own |
|
| 479 |
-# database and tables. |
|
| 474 |
+# Database configuration |
|
| 475 |
+# ---------------------- |
|
| 476 |
+# To select between database backends, add a line to localrc like: |
|
| 477 |
+# |
|
| 478 |
+# use_database postgresql |
|
| 479 |
+# |
|
| 480 |
+# The available database backends are defined in the DATABASE_BACKENDS |
|
| 481 |
+# variable defined in stackrc. By default, MySQL is enabled as the database |
|
| 482 |
+# backend. |
|
| 480 | 483 |
|
| 481 |
-# By default this script will install and configure MySQL. If you want to |
|
| 482 |
-# use an existing server, you can pass in the user/password/host parameters. |
|
| 483 |
-# You will need to send the same ``MYSQL_PASSWORD`` to every host if you are doing |
|
| 484 |
-# a multi-node DevStack installation. |
|
| 485 |
-MYSQL_HOST=${MYSQL_HOST:-localhost}
|
|
| 486 |
-MYSQL_USER=${MYSQL_USER:-root}
|
|
| 487 |
-read_password MYSQL_PASSWORD "ENTER A PASSWORD TO USE FOR MYSQL." |
|
| 484 |
+initialize_database_backends && echo "Using $DATABASE_TYPE database backend" || echo "No database enabled" |
|
| 488 | 485 |
|
| 489 |
-# NOTE: Don't specify ``/db`` in this string so we can use it for multiple services |
|
| 490 |
-BASE_SQL_CONN=${BASE_SQL_CONN:-mysql://$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST}
|
|
| 486 |
+# RabbitMQ or Qpid |
|
| 487 |
+# -------------------------- |
|
| 491 | 488 |
|
| 492 | 489 |
# Rabbit connection info |
| 493 | 490 |
if is_service_enabled rabbit; then |
| ... | ... |
@@ -746,32 +745,8 @@ elif is_service_enabled zeromq; then |
| 746 | 746 |
fi |
| 747 | 747 |
fi |
| 748 | 748 |
|
| 749 |
-if is_service_enabled mysql; then |
|
| 750 |
- |
|
| 751 |
- if [[ "$os_PACKAGE" = "deb" ]]; then |
|
| 752 |
- # Seed configuration with mysql password so that apt-get install doesn't |
|
| 753 |
- # prompt us for a password upon install. |
|
| 754 |
- cat <<MYSQL_PRESEED | sudo debconf-set-selections |
|
| 755 |
-mysql-server-5.1 mysql-server/root_password password $MYSQL_PASSWORD |
|
| 756 |
-mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASSWORD |
|
| 757 |
-mysql-server-5.1 mysql-server/start_on_boot boolean true |
|
| 758 |
-MYSQL_PRESEED |
|
| 759 |
- fi |
|
| 760 |
- |
|
| 761 |
- # while ``.my.cnf`` is not needed for OpenStack to function, it is useful |
|
| 762 |
- # as it allows you to access the mysql databases via ``mysql nova`` instead |
|
| 763 |
- # of having to specify the username/password each time. |
|
| 764 |
- if [[ ! -e $HOME/.my.cnf ]]; then |
|
| 765 |
- cat <<EOF >$HOME/.my.cnf |
|
| 766 |
-[client] |
|
| 767 |
-user=$MYSQL_USER |
|
| 768 |
-password=$MYSQL_PASSWORD |
|
| 769 |
-host=$MYSQL_HOST |
|
| 770 |
-EOF |
|
| 771 |
- chmod 0600 $HOME/.my.cnf |
|
| 772 |
- fi |
|
| 773 |
- # Install mysql-server |
|
| 774 |
- install_package mysql-server |
|
| 749 |
+if is_service_enabled $DATABASE_BACKENDS; then |
|
| 750 |
+ install_database |
|
| 775 | 751 |
fi |
| 776 | 752 |
|
| 777 | 753 |
if is_service_enabled horizon; then |
| ... | ... |
@@ -990,46 +965,10 @@ elif is_service_enabled qpid; then |
| 990 | 990 |
fi |
| 991 | 991 |
|
| 992 | 992 |
|
| 993 |
-# Mysql |
|
| 994 |
-# ----- |
|
| 995 |
- |
|
| 996 |
-if is_service_enabled mysql; then |
|
| 997 |
- echo_summary "Configuring and starting MySQL" |
|
| 998 |
- |
|
| 999 |
- if [[ "$os_PACKAGE" = "deb" ]]; then |
|
| 1000 |
- MY_CONF=/etc/mysql/my.cnf |
|
| 1001 |
- MYSQL=mysql |
|
| 1002 |
- else |
|
| 1003 |
- MY_CONF=/etc/my.cnf |
|
| 1004 |
- MYSQL=mysqld |
|
| 1005 |
- fi |
|
| 1006 |
- |
|
| 1007 |
- # Start mysql-server |
|
| 1008 |
- if [[ "$os_PACKAGE" = "rpm" ]]; then |
|
| 1009 |
- # RPM doesn't start the service |
|
| 1010 |
- start_service $MYSQL |
|
| 1011 |
- # Set the root password - only works the first time |
|
| 1012 |
- sudo mysqladmin -u root password $MYSQL_PASSWORD || true |
|
| 1013 |
- fi |
|
| 1014 |
- # Update the DB to give user ‘$MYSQL_USER’@’%’ full control of the all databases: |
|
| 1015 |
- sudo mysql -uroot -p$MYSQL_PASSWORD -h127.0.0.1 -e "GRANT ALL PRIVILEGES ON *.* TO '$MYSQL_USER'@'%' identified by '$MYSQL_PASSWORD';" |
|
| 1016 |
- |
|
| 1017 |
- # Now update ``my.cnf`` for some local needs and restart the mysql service |
|
| 1018 |
- |
|
| 1019 |
- # Change ‘bind-address’ from localhost (127.0.0.1) to any (0.0.0.0) |
|
| 1020 |
- sudo sed -i '/^bind-address/s/127.0.0.1/0.0.0.0/g' $MY_CONF |
|
| 1021 |
- |
|
| 1022 |
- # Set default db type to InnoDB |
|
| 1023 |
- if sudo grep -q "default-storage-engine" $MY_CONF; then |
|
| 1024 |
- # Change it |
|
| 1025 |
- sudo bash -c "source $TOP_DIR/functions; iniset $MY_CONF mysqld default-storage-engine InnoDB" |
|
| 1026 |
- else |
|
| 1027 |
- # Add it |
|
| 1028 |
- sudo sed -i -e "/^\[mysqld\]/ a \ |
|
| 1029 |
-default-storage-engine = InnoDB" $MY_CONF |
|
| 1030 |
- fi |
|
| 1031 |
- |
|
| 1032 |
- restart_service $MYSQL |
|
| 993 |
+# Configure database |
|
| 994 |
+# ------------------ |
|
| 995 |
+if is_service_enabled $DATABASE_BACKENDS; then |
|
| 996 |
+ configure_database |
|
| 1033 | 997 |
fi |
| 1034 | 998 |
|
| 1035 | 999 |
if [ -z "$SCREEN_HARDSTATUS" ]; then |
| ... | ... |
@@ -1280,7 +1219,9 @@ if is_service_enabled quantum; then |
| 1280 | 1280 |
Q_PLUGIN_CONF_FILE=$Q_PLUGIN_CONF_PATH/$Q_PLUGIN_CONF_FILENAME |
| 1281 | 1281 |
cp $QUANTUM_DIR/$Q_PLUGIN_CONF_FILE /$Q_PLUGIN_CONF_FILE |
| 1282 | 1282 |
|
| 1283 |
- iniset /$Q_PLUGIN_CONF_FILE DATABASE sql_connection mysql:\/\/$MYSQL_USER:$MYSQL_PASSWORD@$MYSQL_HOST\/$Q_DB_NAME?charset=utf8 |
|
| 1283 |
+ database_connection_url dburl $Q_DB_NAME |
|
| 1284 |
+ iniset /$Q_PLUGIN_CONF_FILE DATABASE sql_connection $dburl |
|
| 1285 |
+ unset dburl |
|
| 1284 | 1286 |
|
| 1285 | 1287 |
Q_CONF_FILE=/etc/quantum/quantum.conf |
| 1286 | 1288 |
cp $QUANTUM_DIR/etc/quantum.conf $Q_CONF_FILE |
| ... | ... |
@@ -1306,12 +1247,11 @@ if is_service_enabled q-svc; then |
| 1306 | 1306 |
cp $QUANTUM_DIR/etc/api-paste.ini $Q_API_PASTE_FILE |
| 1307 | 1307 |
cp $QUANTUM_DIR/etc/policy.json $Q_POLICY_FILE |
| 1308 | 1308 |
|
| 1309 |
- if is_service_enabled mysql; then |
|
| 1310 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "DROP DATABASE IF EXISTS $Q_DB_NAME;" |
|
| 1311 |
- mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $Q_DB_NAME CHARACTER SET utf8;" |
|
| 1312 |
- else |
|
| 1313 |
- echo "mysql must be enabled in order to use the $Q_PLUGIN Quantum plugin." |
|
| 1314 |
- exit 1 |
|
| 1309 |
+ if is_service_enabled $DATABASE_BACKENDS; then |
|
| 1310 |
+ recreate_database $Q_DB_NAME utf8 |
|
| 1311 |
+ else |
|
| 1312 |
+ echo "A database must be enabled in order to use the $Q_PLUGIN Quantum plugin." |
|
| 1313 |
+ exit 1 |
|
| 1315 | 1314 |
fi |
| 1316 | 1315 |
|
| 1317 | 1316 |
# Update either configuration file with plugin |
| ... | ... |
@@ -1971,7 +1911,7 @@ if is_service_enabled q-svc; then |
| 1971 | 1971 |
fi |
| 1972 | 1972 |
fi |
| 1973 | 1973 |
|
| 1974 |
-elif is_service_enabled mysql && is_service_enabled nova; then |
|
| 1974 |
+elif is_service_enabled $DATABASE_BACKENDS && is_service_enabled nova; then |
|
| 1975 | 1975 |
# Create a small network |
| 1976 | 1976 |
$NOVA_BIN_DIR/nova-manage network create "$PRIVATE_NETWORK_NAME" $FIXED_RANGE 1 $FIXED_NETWORK_SIZE $NETWORK_CREATE_ARGS |
| 1977 | 1977 |
|
| ... | ... |
@@ -15,6 +15,9 @@ TOP_DIR=$(cd $(dirname "$0") && pwd) |
| 15 | 15 |
# Import common functions |
| 16 | 16 |
source $TOP_DIR/functions |
| 17 | 17 |
|
| 18 |
+# Import database library |
|
| 19 |
+source $TOP_DIR/lib/database |
|
| 20 |
+ |
|
| 18 | 21 |
# Load local configuration |
| 19 | 22 |
source $TOP_DIR/stackrc |
| 20 | 23 |
|
| ... | ... |
@@ -102,6 +105,10 @@ if [[ -n "$UNSTACK_ALL" ]]; then |
| 102 | 102 |
stop_service mysql |
| 103 | 103 |
fi |
| 104 | 104 |
|
| 105 |
+ if is_service_enabled postgresql; then |
|
| 106 |
+ stop_service postgresql |
|
| 107 |
+ fi |
|
| 108 |
+ |
|
| 105 | 109 |
# Stop rabbitmq-server |
| 106 | 110 |
if is_service_enabled rabbit; then |
| 107 | 111 |
stop_service rabbitmq-server |