aodh/devstack/plugin.sh
liusheng c07b0ca9ef Clean deprecations from old "alarm" group
These options were inherited from ceilometer and for compatibility,
they have been marked being deprecated in group "alarm". We are in Aodh
3.0 now, it is time to remove them.

Change-Id: I41ef467750a403841ad96bfa7607ad63bd55702d
2016-03-26 09:10:19 +08:00

388 lines
13 KiB
Bash

# Install and start **Aodh** service in devstack
#
# To enable Aodh in devstack add an entry to local.conf that
# looks like
#
# [[local|localrc]]
# enable_plugin aodh git://git.openstack.org/openstack/aodh
#
# By default all aodh services are started (see
# devstack/settings).
#
# AODH_BACKEND: Database backend (e.g. 'mysql', 'mongodb')
# AODH_COORDINATION_URL: URL for group membership service provided by tooz.
# Support potential entry-points console scripts in VENV or not
if [[ ${USE_VENV} = True ]]; then
PROJECT_VENV["aodh"]=${AODH_DIR}.venv
AODH_BIN_DIR=${PROJECT_VENV["aodh"]}/bin
else
AODH_BIN_DIR=$(get_python_exec_prefix)
fi
if [ -z "$AODH_DEPLOY" ]; then
# Default
AODH_DEPLOY=werkzeug
# Fallback to common wsgi devstack configuration
if [ "$ENABLE_HTTPD_MOD_WSGI_SERVICES" == "True" ]; then
AODH_DEPLOY=mod_wsgi
# Deprecated config
elif [ -n "$AODH_USE_MOD_WSGI" ] ; then
echo_summary "AODH_USE_MOD_WSGI is deprecated, use AODH_DEPLOY instead"
if [ "$AODH_USE_MOD_WSGI" == True ]; then
AODH_DEPLOY=mod_wsgi
fi
fi
fi
# Test if any Aodh services are enabled
# is_aodh_enabled
function is_aodh_enabled {
[[ ,${ENABLED_SERVICES} =~ ,"aodh-" ]] && return 0
return 1
}
function aodh_service_url {
echo "$AODH_SERVICE_PROTOCOL://$AODH_SERVICE_HOST:$AODH_SERVICE_PORT"
}
# _install_mongdb - Install mongodb and python lib.
function _aodh_install_mongodb {
# Server package is the same on all
local packages=mongodb-server
if is_fedora; then
# mongodb client
packages="${packages} mongodb"
fi
install_package ${packages}
if is_fedora; then
restart_service mongod
else
restart_service mongodb
fi
# give time for service to restart
sleep 5
}
# _install_redis() - Install the redis server and python lib.
function _aodh_install_redis {
if is_ubuntu; then
install_package redis-server
restart_service redis-server
else
# This will fail (correctly) where a redis package is unavailable
install_package redis
restart_service redis
fi
pip_install_gr redis
}
# Configure mod_wsgi
function _aodh_config_apache_wsgi {
sudo mkdir -p $AODH_WSGI_DIR
local aodh_apache_conf=$(apache_site_config_for aodh)
local apache_version=$(get_apache_version)
local venv_path=""
# Copy proxy vhost and wsgi file
sudo cp $AODH_DIR/aodh/api/app.wsgi $AODH_WSGI_DIR/app
if [[ ${USE_VENV} = True ]]; then
venv_path="python-path=${PROJECT_VENV["aodh"]}/lib/$(python_version)/site-packages"
fi
sudo cp $AODH_DIR/devstack/apache-aodh.template $aodh_apache_conf
if [ "$AODH_BACKEND" = 'hbase' ] ; then
# Use one process to have single in-memory DB instance for data consistency
AODH_API_WORKERS=1
else
AODH_API_WORKERS=$API_WORKERS
fi
sudo sed -e "
s|%PORT%|$AODH_SERVICE_PORT|g;
s|%APACHE_NAME%|$APACHE_NAME|g;
s|%WSGIAPP%|$AODH_WSGI_DIR/app|g;
s|%USER%|$STACK_USER|g;
s|%APIWORKERS%|$AODH_API_WORKERS|g;
s|%VIRTUALENV%|$venv_path|g
" -i $aodh_apache_conf
}
# Install required services for coordination
function _aodh_prepare_coordination {
if echo $AODH_COORDINATION_URL | grep -q '^memcached:'; then
install_package memcached
elif echo $AODH_COORDINATION_URL | grep -q '^redis:'; then
_aodh_install_redis
fi
}
# Install required services for storage backends
function _aodh_prepare_storage_backend {
if [ "$AODH_BACKEND" = 'mongodb' ] ; then
pip_install_gr pymongo
_aodh_install_mongodb
fi
}
# Create aodh related accounts in Keystone
function _aodh_create_accounts {
if is_service_enabled aodh-api; then
create_service_user "aodh" "admin"
local aodh_service=$(get_or_create_service "aodh" \
"alarming" "OpenStack Alarming Service")
get_or_create_endpoint $aodh_service \
"$REGION_NAME" \
"$(aodh_service_url)" \
"$(aodh_service_url)" \
"$(aodh_service_url)"
fi
}
# Activities to do before aodh has been installed.
function preinstall_aodh {
# Needed to build psycopg2
if is_ubuntu; then
install_package libpq-dev
else
install_package postgresql-devel
fi
}
# Remove WSGI files, disable and remove Apache vhost file
function _aodh_cleanup_apache_wsgi {
sudo rm -f $AODH_WSGI_DIR/*
sudo rm -f $(apache_site_config_for aodh)
}
# cleanup_aodh() - Remove residual data files, anything left over
# from previous runs that a clean run would need to clean up
function cleanup_aodh {
if [ "$AODH_BACKEND" = 'mongodb' ] ; then
mongo aodh --eval "db.dropDatabase();"
fi
if [ "$AODH_DEPLOY" == "mod_wsgi" ]; then
_aodh_cleanup_apache_wsgi
fi
}
# Set configuration for storage backend.
function _aodh_configure_storage_backend {
if [ "$AODH_BACKEND" = 'mysql' ] || [ "$AODH_BACKEND" = 'postgresql' ] ; then
iniset $AODH_CONF database connection $(database_connection_url aodh)
elif [ "$AODH_BACKEND" = 'mongodb' ] ; then
iniset $AODH_CONF database connection mongodb://localhost:27017/aodh
cleanup_aodh
elif [ "$AODH_BACKEND" = 'hbase' ] ; then
iniset $AODH_CONF database connection hbase://__test__
else
die $LINENO "Unable to configure unknown AODH_BACKEND $AODH_BACKEND"
fi
}
# Configure Aodh
function configure_aodh {
iniset_rpc_backend aodh $AODH_CONF
iniset $AODH_CONF DEFAULT notification_topics "$AODH_NOTIFICATION_TOPICS"
iniset $AODH_CONF DEFAULT verbose True
iniset $AODH_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
if [[ -n "$AODH_COORDINATION_URL" ]]; then
iniset $AODH_CONF coordination backend_url $AODH_COORDINATION_URL
fi
# Set up logging
if [ "$SYSLOG" != "False" ]; then
iniset $AODH_CONF DEFAULT use_syslog "True"
fi
# Format logging
if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$AODH_DEPLOY" != "mod_wsgi" ]; then
setup_colorized_logging $AODH_CONF DEFAULT
fi
# Install the policy file for the API server
cp $AODH_DIR/etc/aodh/policy.json $AODH_CONF_DIR
iniset $AODH_CONF oslo_policy policy_file $AODH_CONF_DIR/policy.json
cp $AODH_DIR/etc/aodh/api_paste.ini $AODH_CONF_DIR
# The alarm evaluator needs these options to call gnocchi/ceilometer APIs
iniset $AODH_CONF service_credentials auth_type password
iniset $AODH_CONF service_credentials username aodh
iniset $AODH_CONF service_credentials user_domain_id default
iniset $AODH_CONF service_credentials project_domain_id default
iniset $AODH_CONF service_credentials password $SERVICE_PASSWORD
iniset $AODH_CONF service_credentials project_name $SERVICE_PROJECT_NAME
iniset $AODH_CONF service_credentials region_name $REGION_NAME
iniset $AODH_CONF service_credentials auth_url $KEYSTONE_SERVICE_URI
configure_auth_token_middleware $AODH_CONF aodh $AODH_AUTH_CACHE_DIR
iniset $AODH_CONF notification store_events $AODH_EVENTS
# Configured storage
_aodh_configure_storage_backend
# NOTE: This must come after database configuration as those can
# call cleanup_aodh which will wipe the WSGI config.
if [ "$AODH_DEPLOY" == "mod_wsgi" ]; then
iniset $AODH_CONF api pecan_debug "False"
_aodh_config_apache_wsgi
elif [ "$AODH_DEPLOY" == "uwsgi" ]; then
# iniset creates these files when it's called if they don't exist.
AODH_UWSGI_FILE=$AODH_CONF_DIR/aodh-uwsgi.ini
rm -f "$AODH_UWSGI_FILE"
iniset "$AODH_UWSGI_FILE" uwsgi http $AODH_SERVICE_HOST:$AODH_SERVICE_PORT
iniset "$AODH_UWSGI_FILE" uwsgi wsgi-file "$AODH_DIR/aodh/api/app.wsgi"
# This is running standalone
iniset "$AODH_UWSGI_FILE" uwsgi master true
# Set die-on-term & exit-on-reload so that uwsgi shuts down
iniset "$AODH_UWSGI_FILE" uwsgi die-on-term true
iniset "$AODH_UWSGI_FILE" uwsgi exit-on-reload true
iniset "$AODH_UWSGI_FILE" uwsgi threads 10
iniset "$AODH_UWSGI_FILE" uwsgi processes $API_WORKERS
iniset "$AODH_UWSGI_FILE" uwsgi enable-threads true
iniset "$AODH_UWSGI_FILE" uwsgi plugins python
iniset "$AODH_UWSGI_FILE" uwsgi lazy-apps true
# uwsgi recommends this to prevent thundering herd on accept.
iniset "$AODH_UWSGI_FILE" uwsgi thunder-lock true
# Override the default size for headers from the 4k default.
iniset "$AODH_UWSGI_FILE" uwsgi buffer-size 65535
# Make sure the client doesn't try to re-use the connection.
iniset "$AODH_UWSGI_FILE" uwsgi add-header "Connection: close"
fi
}
# init_aodh() - Initialize etc.
function init_aodh {
# Get aodh keystone settings in place
_aodh_create_accounts
# Create cache dir
sudo install -d -o $STACK_USER $AODH_AUTH_CACHE_DIR
rm -f $AODH_AUTH_CACHE_DIR/*
if is_service_enabled mysql postgresql; then
if [ "$AODH_BACKEND" = 'mysql' ] || [ "$AODH_BACKEND" = 'postgresql' ] ; then
recreate_database aodh
$AODH_BIN_DIR/aodh-dbsync
fi
fi
}
# Install Aodh.
# The storage and coordination backends are installed here because the
# virtualenv context is active at this point and python drivers need to be
# installed. The context is not active during preinstall (when it would
# otherwise makes sense to do the backend services).
function install_aodh {
_aodh_prepare_coordination
_aodh_prepare_storage_backend
install_aodhclient
sudo -H pip install -e "$AODH_DIR"[test,$AODH_BACKEND]
sudo install -d -o $STACK_USER -m 755 $AODH_CONF_DIR $AODH_API_LOG_DIR
if [ "$AODH_DEPLOY" == "mod_wsgi" ]; then
install_apache_wsgi
elif [ "$AODH_DEPLOY" == "uwsgi" ]; then
pip_install uwsgi
fi
}
# install_aodhclient() - Collect source and prepare
function install_aodhclient {
if use_library_from_git "python-ceilometerclient"; then
git_clone_by_name "python-ceilometerclient"
setup_dev_lib "python-ceilometerclient"
sudo install -D -m 0644 -o $STACK_USER {${GITDIR["python-ceilometerclient"]}/tools/,/etc/bash_completion.d/}ceilometer.bash_completion
else
pip_install_gr python-ceilometerclient
fi
}
# start_aodh() - Start running processes, including screen
function start_aodh {
if [[ "$AODH_DEPLOY" == "mod_wsgi" ]]; then
enable_apache_site aodh
restart_apache_server
tail_log aodh /var/log/$APACHE_NAME/aodh.log
tail_log aodh-api /var/log/$APACHE_NAME/aodh_access.log
elif [ "$AODH_DEPLOY" == "uwsgi" ]; then
run_process aodh-api "$AODH_BIN_DIR/uwsgi $AODH_UWSGI_FILE"
else
run_process aodh-api "$AODH_BIN_DIR/aodh-api -d -v --log-dir=$AODH_API_LOG_DIR --config-file $AODH_CONF"
fi
# Only die on API if it was actually intended to be turned on
if is_service_enabled aodh-api; then
echo "Waiting for aodh-api to start..."
if ! wait_for_service $SERVICE_TIMEOUT $(aodh_service_url)/v2/; then
die $LINENO "aodh-api did not start"
fi
fi
run_process aodh-notifier "$AODH_BIN_DIR/aodh-notifier --config-file $AODH_CONF"
run_process aodh-evaluator "$AODH_BIN_DIR/aodh-evaluator --config-file $AODH_CONF"
run_process aodh-listener "$AODH_BIN_DIR/aodh-listener --config-file $AODH_CONF"
}
# stop_aodh() - Stop running processes
function stop_aodh {
if [ "$AODH_DEPLOY" == "mod_wsgi" ]; then
disable_apache_site aodh
restart_apache_server
fi
# Kill the aodh screen windows
for serv in aodh-api aodh-notifier aodh-evaluator aodh-listener; do
stop_process $serv
done
}
# This is the main for plugin.sh
if is_service_enabled aodh; then
if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
# Set up other services
echo_summary "Configuring system services for Aodh"
preinstall_aodh
elif [[ "$1" == "stack" && "$2" == "install" ]]; then
echo_summary "Installing Aodh"
# Use stack_install_service here to account for vitualenv
stack_install_service aodh
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
echo_summary "Configuring Aodh"
configure_aodh
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
echo_summary "Initializing Aodh"
# Tidy base for aodh
init_aodh
# Start the services
start_aodh
fi
if [[ "$1" == "unstack" ]]; then
echo_summary "Shutting Down Aodh"
stop_aodh
fi
if [[ "$1" == "clean" ]]; then
echo_summary "Cleaning Aodh"
cleanup_aodh
fi
fi