Adding WSGI support

Following commits adds possiblity to run monasca-log-api
with Apache2 (mod_wsgi) in devstack environment.

Change-Id: I4aca9bebacb4799a0e45b785ba1997003c6b7165
(cherry picked from commit 4ae270263d)
This commit is contained in:
Tomasz Trębski 2017-02-22 08:05:03 +01:00
parent 57e44c3052
commit 9bc6c9c768
7 changed files with 174 additions and 5 deletions

View File

@ -74,6 +74,19 @@ Or you can use "\*" as a wild card, like below.
Select @timestamp as time-field name.
4. Extra settings
## Using WSGI
monasca-log-api can be deployed with Apache using mod_uwsgi.
By default monasca-log-api by default runs under gunicorn.
If you wish to use Apache make sure that ```devstack/local.conf```
contains:
```sh
MONASCA_LOG_API_USE_MOD_WSGI=True
```
# Using Vagrant
Vagrant can be used to deploy a VM with Devstack and Monasca Logging

View File

@ -98,6 +98,9 @@ MONASCA_PERSISTER_IMPLEMENTATION_LANG=${MONASCA_PERSISTER_IMPLEMENTATION_LANG:-p
# MONASCA_METRICS_DB=${MONASCA_METRICS_DB:-cassandra}
MONASCA_METRICS_DB=${MONASCA_METRICS_DB:-influxdb}
# Uncomment following line to deploy monasca-log-api with Apache
# MONASCA_LOG_API_USE_MOD_WSGI=True
# Uncomment one of the following lines and modify accordingly to enable the Monasca DevStack Plugin
enable_plugin monasca-api https://git.openstack.org/openstack/monasca-api
enable_plugin monasca-log-api https://git.openstack.org/openstack/monasca-log-api.git

View File

@ -0,0 +1,25 @@
Listen %PUBLICPORT%
<VirtualHost *:%PUBLICPORT%>
WSGIDaemonProcess monasca-log-api processes=%APIWORKERS% threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
WSGIProcessGroup monasca-log-api
WSGIScriptAlias / %PUBLICWSGI%
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
<IfVersion >= 2.4>
ErrorLogFormat "%M"
</IfVersion>
ErrorLog /var/log/%APACHE_NAME%/monasca-log-api.log
%SSLENGINE%
%SSLCERTFILE%
%SSLKEYFILE%
</VirtualHost>
Alias /logs %PUBLICWSGI%
<Location /logs>
SetHandler wsgi-script
Options +ExecCGI
WSGIProcessGroup monasca-log-api
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>

View File

@ -34,6 +34,9 @@ MONASCA_LOG_API_BASE_URI=${MONASCA_LOG_API_SERVICE_PROTOCOL}://${MONASCA_LOG_API
MONASCA_LOG_API_URI_V2=${MONASCA_LOG_API_BASE_URI}/v2.0
MONASCA_LOG_API_URI_V3=${MONASCA_LOG_API_BASE_URI}/v3.0
# wsgit bits
MONASCA_LOG_API_USE_MOD_WSGI=$(trueorfalse False MONASCA_LOG_API_USE_MOD_WSGI)
# configuration bits
LOG_PERSISTER_DIR=$DEST/monasca-log-persister
LOG_TRANSFORMER_DIR=$DEST/monasca-log-transformer
@ -95,7 +98,7 @@ function init_monasca_log {
function stop_monasca_log {
stop_process "monasca-log-agent" || true
stop_process "monasca-log-api" || true
stop_monasca_log_api
stop_process "monasca-log-metrics" || true
stop_process "monasca-log-persister" || true
stop_process "monasca-log-transformer" || true
@ -131,7 +134,9 @@ function install_monasca-log-api {
git_clone $MONASCA_LOG_API_REPO $MONASCA_LOG_API_DIR $MONASCA_LOG_API_BRANCH
setup_develop $MONASCA_LOG_API_DIR
pip_install gunicorn
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "False" ]; then
pip_install gunicorn
fi
pip_install_gr python-memcached
if use_library_from_git "monasca-common"; then
@ -142,6 +147,13 @@ function install_monasca-log-api {
git_clone_by_name "monasca-statsd"
setup_dev_lib "monasca-statsd"
fi
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
install_apache_wsgi
if is_ssl_enabled_service "monasca-log-api"; then
enable_mod_ssl
fi
fi
}
function configure_monasca_log_api {
@ -188,9 +200,53 @@ function configure_monasca_log_api {
iniset "$MONASCA_LOG_API_PASTE_INI" server:main host $MONASCA_LOG_API_SERVICE_HOST
iniset "$MONASCA_LOG_API_PASTE_INI" server:main port $MONASCA_LOG_API_SERVICE_PORT
iniset "$MONASCA_LOG_API_PASTE_INI" server:main chdir $MONASCA_LOG_API_DIR
iniset "$MONASCA_LOG_API_PASTE_INI" server:main workers $API_WORKERS
# WSGI
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
configure_monasca_log_api_wsgi
fi
fi
}
function configure_monasca_log_api_wsgi {
sudo install -d $MONASCA_LOG_API_WSGI_DIR
local monasca_log_api_apache_conf
monasca_log_api_apache_conf=$(apache_site_config_for monasca-log-api)
local monasca_log_api_ssl=""
local monasca_log_api_certfile=""
local monasca_log_api_keyfile=""
local monasca_log_api_api_port=$MONASCA_LOG_API_SERVICE_PORT
local venv_path=""
if is_ssl_enabled_service monasca_log_api; then
monasca_log_api_ssl="SSLEngine On"
monasca_log_api_certfile="SSLCertificateFile $MONASCA_LOG_API_SSL_CERT"
monasca_log_api_keyfile="SSLCertificateKeyFile $MONASCA_LOG_API_SSL_KEY"
fi
if [[ ${USE_VENV} = True ]]; then
venv_path="python-path=${PROJECT_VENV["monasca_log_api"]}/lib/$(python_version)/site-packages"
fi
# copy proxy vhost and wsgi helper files
sudo cp $MONASCA_LOG_API_DIR/monasca_log_api/wsgi/monasca_log_api.py $MONASCA_LOG_API_WSGI_DIR/monasca_log_api
sudo cp $PLUGIN_FILES/apache-log-api.template $monasca_log_api_apache_conf
sudo sed -e "
s|%PUBLICPORT%|$monasca_log_api_api_port|g;
s|%APACHE_NAME%|$APACHE_NAME|g;
s|%PUBLICWSGI%|$MONASCA_LOG_API_WSGI_DIR/monasca_log_api|g;
s|%SSLENGINE%|$monasca_log_api_ssl|g;
s|%SSLCERTFILE%|$monasca_log_api_certfile|g;
s|%SSLKEYFILE%|$monasca_log_api_keyfile|g;
s|%USER%|$STACK_USER|g;
s|%VIRTUALENV%|$venv_path|g
s|%APIWORKERS%|$API_WORKERS|g
" -i $monasca_log_api_apache_conf
}
function create_log_api_cache_dir {
sudo install -m 700 -d -o $STACK_USER $MONASCA_LOG_API_CACHE_DIR
}
@ -206,15 +262,61 @@ function clean_monasca_log_api {
sudo rm -rf $MONASCA_LOG_API_CONF_DIR || true
sudo rm -rf $MONASCA_LOG_API_DIR || true
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
clean_monasca_log_api_wsgi
fi
fi
}
function clean_monasca_log_api_wsgi {
sudo rm -f $MONASCA_LOG_API_WSGI_DIR/*
sudo rm -f $(apache_site_config_for monasca-log-api)
}
function start_monasca_log_api {
if is_service_enabled monasca-log-api; then
echo_summary "Starting monasca-log-api"
local gunicorn="$MONASCA_LOG_API_BIN_DIR/gunicorn"
local service_port=$MONASCA_LOG_API_SERVICE_PORT
local service_protocol=$MONASCA_LOG_API_SERVICE_PROTOCOL
if is_service_enabled tls-proxy; then
service_port=$MONASCA_LOG_API_SERVICE_PORT_INT
service_protocol="http"
fi
restart_service memcached
run_process "monasca-log-api" "$gunicorn -n monasca-log-api -k eventlet --paste $MONASCA_LOG_API_PASTE_INI"
local enabled_site_file
enabled_site_file=$(apache_site_config_for monasca-log-api)
if [ -f ${enabled_site_file} ] && [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
enable_apache_site monasca-log-api
restart_apache_server
tail_log monasca-log-api /var/log/$APACHE_NAME/monasca-log-api.log
else
local gunicorn="$MONASCA_LOG_API_BIN_DIR/gunicorn"
run_process "monasca-log-api" "$gunicorn -n monasca-log-api -k eventlet --paste $MONASCA_LOG_API_PASTE_INI"
fi
echo "Waiting for monasca-log-api to start..."
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$SERVICE_HOST:$service_port; then
die $LINENO "monasca-log-api did not start"
fi
if is_service_enabled tls-proxy; then
start_tls_proxy monasca-log-api '*' $MONASCA_LOG_API_SERVICE_PORT $MONASCA_LOG_API_SERVICE_HOST $MONASCA_LOG_API_SERVICE_PORT_INT
fi
fi
}
function stop_monasca_log_api {
if is_service_enabled monasca-log-api; then
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
disable_apache_site monasca-log-api
restart_apache_server
else
stop_process "monasca-log-api" || true
fi
fi
}

View File

@ -67,10 +67,15 @@ MONASCA_LOG_API_PASTE_INI=${MONASCA_LOG_API_PASTE_INI:-$MONASCA_LOG_API_CONF_DIR
MONASCA_LOG_API_LOGGING_CONF=${MONASCA_LOG_API_LOGGING_CONF:-$MONASCA_LOG_API_CONF_DIR/log-api-logging.conf}
MONASCA_LOG_API_CACHE_DIR=${MONASCA_LOG_API_CACHE_DIR:-/var/cache/monasca-log-api}
## WSGI
MONASCA_LOG_API_WSGI_DIR=${MONASCA_LOG_API_WSGI_DIR:-/var/www/monasca-log-api}
MONASCA_LOG_API_USE_MOD_WSGI=${MONASCA_LOG_API_USE_MOD_WSGI:-False}
# public facing bits
MONASCA_LOG_API_SERVICE_HOST=${MONASCA_LOG_API_SERVICE_HOST:-${SERVICE_HOST}}
MONASCA_LOG_API_SERVICE_PORT=${MONASCA_LOG_API_SERVICE_PORT:-5607}
MONASCA_LOG_API_SERVICE_PROTOCOL="http" # right now we do not have SSL support here
MONASCA_LOG_API_SERVICE_PORT_INT=${MONASCA_LOG_API_SERVICE_PORT:-15607}
MONASCA_LOG_API_SERVICE_PROTOCOL=${MONASCA_LOG_API_SERVICE_PROTOCOL:-${SERVICE_PROTOCOL}}
ES_SERVICE_BIND_HOST=${ES_SERVICE_BIND_HOST:-${SERVICE_HOST}}
ES_SERVICE_BIND_PORT=${ES_SERVICE_BIND_PORT:-9200}
@ -85,3 +90,4 @@ KAFKA_SERVICE_HOST=${KAFKA_SERVICE_HOST:-${SERVICE_HOST}}
KAFKA_SERVICE_PORT=${KAFKA_SERVICE_PORT:-9092}
DOWNLOAD_FILE_TIMEOUT=${DOWNLOAD_FILE_TIMEOUT:-300}

View File

View File

@ -0,0 +1,20 @@
# Copyright 2017 FUJITSU LIMITED
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# extremely simple way to setup of monasca-log-api
# with wsgi
from monasca_log_api import server
application = server.get_wsgi_app(config_base_path='/etc/monasca')