# 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