devstack/lib/database
Brian Haley 180f5eb652 Add IPv6 support to devstack infrastructure
By default, most Openstack services are bound to 0.0.0.0
and service endpoints are registered as IPv4 addresses.
With this change we introduce two new variables to control
this behavior:

SERVICE_IP_VERSION - can either be "4" or "6".

When set to "4" (default if not set) devstack will operate
as today - most services will open listen sockets on 0.0.0.0
and service endpoints will be registered using HOST_IP as the
address.

When set to "6" devstack services will open listen sockets on ::
and service endpoints will be registered using HOST_IPV6 as the
address.

There is no support for "4+6", more work is required for that.

HOST_IPV6 - if SERVICE_IP_VERSION=6 this must be an IPv6
address configured on the system.

Some existing services, like the Openvswitch agent, will continue
to use IPv4 addresses for things like tunnel endpoints.  This is
a current restriction in the code and can be updated at a later
time.  This change is just a first step to supporting IPv6-only
control and data planes in devstack.

This change is also partly based on two previous patches,
https://review.openstack.org/#/c/140519/ and
https://review.openstack.org/#/c/176898/

Change-Id: I5c0b775490ce54ab104fd5e89b20fb700212ae74
Co-Authored-By: Sean Collins <sean@coreitpro.com>
Co-Authored-By: Baodong Li <baoli@cisco.com>
Co-Authored-By: Sridhar Gaddam <sridhar.gaddam@enovance.com>
Co-Authored-By: Adam Kacmarsky <adam.kacmarsky@hp.com>
Co-Authored-By: Jeremy Alvis <jeremy.alvis@hp.com>
2015-07-02 15:16:34 -06:00

154 lines
4.4 KiB
Bash

#!/bin/bash
#
# 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
DATABASE_BACKENDS=""
# Register a database backend
#
# $1 The name of the database backend
#
# This is required to be defined before the specific database scripts are sourced
function register_database {
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
# ``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 functions
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
# Functions
# ---------
# Get rid of everything enough to cleanly change database backends
function cleanup_database {
cleanup_database_$DATABASE_TYPE
}
# 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:-$SERVICE_LOCAL_HOST}
MYSQL_USER=${MYSQL_USER:-root}
# Set DATABASE_HOST equal to MYSQL_HOST. If SERVICE_IP_VERSION is equal to 6,
# set DATABASE_HOST equal to [MYSQL_HOST]. MYSQL_HOST cannot use brackets due
# to mysql not using bracketing for IPv6 addresses. DATABASE_HOST must have brackets
# due to sqlalchemy only reading IPv6 addresses with brackets.
if [[ "$SERVICE_IP_VERSION" == 6 ]]; then
DATABASE_HOST=${DATABASE_HOST:-[$MYSQL_HOST]}
else
DATABASE_HOST=${DATABASE_HOST:-${MYSQL_HOST}}
fi
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:-$(get_database_type)://$DATABASE_USER:$DATABASE_PASSWORD@$DATABASE_HOST}
return 0
}
# Recreate a given database
# $1 The name of the database
function recreate_database {
local db=$1
recreate_database_$DATABASE_TYPE $db
}
# Install the database
function install_database {
install_database_$DATABASE_TYPE
}
# Install the database Python packages
function install_database_python {
install_database_python_$DATABASE_TYPE
}
# Configure and start the database
function configure_database {
configure_database_$DATABASE_TYPE
}
# Generate an SQLAlchemy connection URL and output it using echo
# $1 The name of the database
function database_connection_url {
local db=$1
database_connection_url_$DATABASE_TYPE $db
}
function get_database_type {
if [[ -n "${SQLALCHEMY_DATABASE_DRIVER}" ]]; then
echo "${DATABASE_TYPE}+${SQLALCHEMY_DATABASE_DRIVER}"
else
echo "${DATABASE_TYPE}"
fi
}
# Restore xtrace
$XTRACE
# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End: