| # lib/database |
| # Interface for interacting with different database backends |
| |
| # Dependencies: |
| # ``ENABLED_SERVICES`` must be defined |
| |
| # ``DATABASE_BACKENDS`` will contain a list of available database backends |
| # after sourcing this file. |
| |
| # This is a wrapper for the specific database backends available. |
| # 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" |
| } |
| |
| # Sourcing the database libs sets DATABASE_BACKENDS with the available list |
| for f in $TOP_DIR/lib/databases/*; do source $f; done |
| |
| # If ``DATABASE_TYPE`` is defined here it's because the user has it in ``localrc`` |
| # or has called ``use_database``. Both are deprecated so let's fix it up for now. |
| if [[ -n $DATABASE_TYPE ]]; then |
| # This is now deprecated usage, set up a warning and try to be |
| # somewhat backward compatible for now. |
| DEPRECATED_TEXT="$DEPRECATED_TEXT\nThe database backend needs to be properly set in ENABLED_SERVICES; DATABASE_TYPE or use_database is deprecated localrc\n" |
| if [[ ! $ENABLED_SERVICES =~ $DATABASE_TYPE ]]; then |
| # It's not in enabled services but user has attempted to select a |
| # database, so just add it now |
| ENABLED_SERVICES+=,$DATABASE_TYPE |
| unset DATABASE_TYPE |
| fi |
| fi |
| |
| # ``DATABASE_BACKENDS`` now contains a list of the supported databases |
| # Look in ``ENABLED_SERVICES`` to see if one has been selected |
| for db in $DATABASE_BACKENDS; do |
| # Set the type for the rest of the backend to use |
| if is_service_enabled $db; then |
| # Set this now for the rest of the database funtions |
| DATABASE_TYPE=$db |
| fi |
| done |
| # If ``DATABASE_TYPE`` is unset here no database was selected |
| # This is not an error as multi-node installs will do this on the compute nodes |
| |
| |
| # 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 |
| } |
| |
| # 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 |