diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index 62571e0760..45f4ffe6e9 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -326,23 +326,29 @@ a file, keep service logs and disable color in the stored files. Database Backend ---------------- -Support for the MySQL database backend is included. Addition database backends -may be available via external plugins. Enabling of disabling MySQL is handled -via the usual service functions and ``ENABLED_SERVICES``. For example, to -disable MySQL in ``local.conf``:: +Multiple database backends are available. The available databases are defined +in the lib/databases directory. +``mysql`` is the default database, choose a different one by putting the +following in the ``localrc`` section:: disable_service mysql + enable_service postgresql + +``mysql`` is the default database. RPC Backend ----------- -Support for a RabbitMQ RPC backend is included. Additional RPC backends may be -available via external plugins. Enabling or disabling RabbitMQ is handled via -the usual service functions and ``ENABLED_SERVICES``. For example, to disable -RabbitMQ in ``local.conf``:: +Support for a RabbitMQ RPC backend is included. Additional RPC +backends may be available via external plugins. Enabling or disabling +RabbitMQ is handled via the usual service functions and +``ENABLED_SERVICES``. + +Example disabling RabbitMQ in ``local.conf``:: disable_service rabbit + Apache Frontend --------------- diff --git a/doc/source/zuul_ci_jobs_migration.rst b/doc/source/zuul_ci_jobs_migration.rst index 66f8251039..17e7e16fb7 100644 --- a/doc/source/zuul_ci_jobs_migration.rst +++ b/doc/source/zuul_ci_jobs_migration.rst @@ -302,7 +302,10 @@ migrated at all. - This will probably be implemented on ironic side. * - DEVSTACK_GATE_POSTGRES - Legacy - - This has no effect in d-g. + - This flag exists in d-g but the only thing that it does is + capture postgres logs. This is already supported by the roles + in post, so the flag is useless in the new jobs. postgres + itself can be enabled via the devstack_service job variable. * - DEVSTACK_GATE_ZEROMQ - Legacy - This has no effect in d-g. diff --git a/functions b/functions index 8eeb03203e..f33fd25fee 100644 --- a/functions +++ b/functions @@ -400,8 +400,7 @@ function upload_image { # initialized yet, just save the configuration selection and call back later # to validate it. # -# ``$1`` - the name of the database backend to use (only mysql is currently -# supported) +# ``$1`` - the name of the database backend to use (mysql, postgresql, ...) function use_database { if [[ -z "$DATABASE_BACKENDS" ]]; then # No backends registered means this is likely called from ``localrc`` diff --git a/lib/databases/postgresql b/lib/databases/postgresql new file mode 100644 index 0000000000..618834b550 --- /dev/null +++ b/lib/databases/postgresql @@ -0,0 +1,137 @@ +#!/bin/bash +# +# lib/databases/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_PG=$(set +o | grep xtrace) +set +o xtrace + + +MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-200} + + +register_database postgresql + + +# Functions +# --------- + +function get_database_type_postgresql { + echo postgresql +} + +# Get rid of everything enough to cleanly change database backends +function cleanup_database_postgresql { + stop_service postgresql + if is_ubuntu; then + # Get ruthless with mysql + apt_get purge -y postgresql* + return + elif is_fedora || is_suse; then + uninstall_package postgresql-server + else + return + fi +} + +function recreate_database_postgresql { + local db=$1 + # 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 utf8 $db +} + +function configure_database_postgresql { + local pg_conf pg_dir pg_hba check_role version + echo_summary "Configuring and starting PostgreSQL" + if is_fedora; then + pg_hba=/var/lib/pgsql/data/pg_hba.conf + pg_conf=/var/lib/pgsql/data/postgresql.conf + if ! sudo [ -e $pg_hba ]; then + sudo postgresql-setup initdb + fi + elif is_ubuntu; then + version=`psql --version | cut -d ' ' -f3 | cut -d. -f1-2` + if vercmp $version '>=' 9.3; then + if [ -z "`pg_lsclusters -h`" ]; then + echo 'No PostgreSQL clusters exist; will create one' + sudo pg_createcluster $version main --start + fi + fi + pg_dir=`find /etc/postgresql -name pg_hba.conf|xargs dirname` + pg_hba=$pg_dir/pg_hba.conf + pg_conf=$pg_dir/postgresql.conf + elif is_suse; then + pg_hba=/var/lib/pgsql/data/pg_hba.conf + pg_conf=/var/lib/pgsql/data/postgresql.conf + # initdb is called when postgresql is first started + sudo [ -e $pg_hba ] || start_service postgresql + else + exit_distro_not_supported "postgresql configuration" + fi + # Listen on all addresses + sudo sed -i "/listen_addresses/s/.*/listen_addresses = '*'/" $pg_conf + # Set max_connections + sudo sed -i "/max_connections/s/.*/max_connections = $MAX_DB_CONNECTIONS/" $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 + restart_service postgresql + + # Create the role if it's not here or else alter it. + check_role=$(sudo -u root sudo -u postgres -i psql -t -c "SELECT 'HERE' from pg_roles where rolname='$DATABASE_USER'") + if [[ ${check_role} == *HERE ]];then + sudo -u root sudo -u postgres -i psql -c "ALTER ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" + else + sudo -u root sudo -u postgres -i psql -c "CREATE ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" + fi +} + +function install_database_postgresql { + echo_summary "Installing postgresql" + deprecated "Use of postgresql in devstack is deprecated, and will be removed during the Pike cycle" + local 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 is_ubuntu; then + install_package postgresql + elif is_fedora || is_suse; then + install_package postgresql-server + if is_fedora; then + sudo systemctl enable postgresql + fi + else + exit_distro_not_supported "postgresql installation" + fi +} + +function install_database_python_postgresql { + # Install Python client module + pip_install_gr psycopg2 + ADDITIONAL_VENV_PACKAGES+=",psycopg2" +} + +function database_connection_url_postgresql { + local db=$1 + echo "$BASE_SQL_CONN/$db?client_encoding=utf8" +} + + +# Restore xtrace +$_XTRACE_PG + +# Local variables: +# mode: shell-script +# End: diff --git a/stack.sh b/stack.sh index c652f65403..b7b37e2cf6 100755 --- a/stack.sh +++ b/stack.sh @@ -695,11 +695,14 @@ function read_password { # Database Configuration # ---------------------- -# DevStack provides a MySQL database backend. Additional backends may be -# provided by external plugins and can be enabled using the usual service -# functions and ``ENABLED_SERVICES``. For example, to disable MySQL: +# To select between database backends, add the following to ``local.conf``: # # disable_service mysql +# enable_service postgresql +# +# The available database backends are listed in ``DATABASE_BACKENDS`` after +# ``lib/database`` is sourced. ``mysql`` is the default. + if initialize_database_backends; then echo "Using $DATABASE_TYPE database backend" # Last chance for the database password. This must be handled here diff --git a/unstack.sh b/unstack.sh index 07dc2b1418..ccea0ef585 100755 --- a/unstack.sh +++ b/unstack.sh @@ -147,6 +147,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