Enable UWSGI support in monasca-log-api
Community has set a community wide goal in Pike cycle: "Control Plane API endpoints deployment via WSGI" [1]. monasca-log-api is already capable of being deployed under mod-wsgi but not under uwsgi. This commits enables that feature. Until Queens release API will hence support: * gunicorn * mod_wsgi (remove in Queens) * uwsgi (preffered) Refs: [1]: https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html Story: 2001464 Task: 6180 Change-Id: Ie4a94c9c2e166915c3f4a1783dc3527f4eb62f29
This commit is contained in:
parent
b8d7b60781
commit
71f0bdfb8c
|
@ -87,6 +87,14 @@ contains:
|
||||||
MONASCA_LOG_API_USE_MOD_WSGI=True
|
MONASCA_LOG_API_USE_MOD_WSGI=True
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Actual ```MONASCA_LOG_API_DEPLOY``` value is determined using devstack`s
|
||||||
|
```WSGI_MODE``` variable. Nevertheless there are only three possible values,
|
||||||
|
that ```MONASCA_LOG_API_DEPLOY``` can take:
|
||||||
|
|
||||||
|
* ```gunicorn``` if ```MONASCA_LOG_API_USE_MOD_WSGI=False```
|
||||||
|
* ```mod_wsgi``` if ```MONASCA_LOG_API_USE_MOD_WSGI=True && WSGI_MODE="mod_wsgi""```
|
||||||
|
* ```uwsgi``` if ```MONASCA_LOG_API_USE_MOD_WSGI=True && WSGI_MODE="uwsgi""```
|
||||||
|
|
||||||
# Using Vagrant
|
# Using Vagrant
|
||||||
|
|
||||||
Vagrant can be used to deploy a VM with Devstack and Monasca Logging
|
Vagrant can be used to deploy a VM with Devstack and Monasca Logging
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Non configurable settings or settings derived from another settings
|
||||||
|
|
||||||
|
_XTRACE_LOG_API_CONFIG=$(set +o | grep xtrace)
|
||||||
|
set +o xtrace
|
||||||
|
|
||||||
|
if [[ ${USE_VENV} = True ]]; then
|
||||||
|
PROJECT_VENV["monasca-log-api"]=${MONASCA_LOG_API_DIR}.venv
|
||||||
|
MONASCA_LOG_API_BIN_DIR=${PROJECT_VENV["monasca-log-api"]}/bin
|
||||||
|
else
|
||||||
|
MONASCA_LOG_API_BIN_DIR=$(get_python_exec_prefix)
|
||||||
|
fi
|
||||||
|
|
||||||
|
MONASCA_LOG_API_WSGI=$MONASCA_LOG_API_BIN_DIR/monasca-log-api-wsgi
|
||||||
|
MONASCA_LOG_API_DEPLOY=`determine_log_api_deploy_mode`
|
||||||
|
if is_service_enabled tls-proxy; then
|
||||||
|
MONASCA_LOG_API_SERVICE_PROTOCOL="https"
|
||||||
|
fi
|
||||||
|
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
||||||
|
MONASCA_LOG_API_BASE_URI=${MONASCA_LOG_API_SERVICE_PROTOCOL}://${MONASCA_LOG_API_SERVICE_HOST}/logs
|
||||||
|
else
|
||||||
|
MONASCA_LOG_API_BASE_URI=${MONASCA_LOG_API_SERVICE_PROTOCOL}://${MONASCA_LOG_API_SERVICE_HOST}:${MONASCA_LOG_API_SERVICE_PORT}
|
||||||
|
fi
|
||||||
|
MONASCA_LOG_API_URI_V2=${MONASCA_LOG_API_BASE_URI}/v2.0
|
||||||
|
MONASCA_LOG_API_URI_V3=${MONASCA_LOG_API_BASE_URI}/v3.0
|
||||||
|
|
||||||
|
MONASCA_LOG_API_CONF_DIR=${MONASCA_LOG_API_CONF_DIR:-/etc/monasca}
|
||||||
|
MONASCA_LOG_API_LOG_DIR=${MONASCA_LOG_API_LOG_DIR:-/var/log/monasca}
|
||||||
|
MONASCA_LOG_API_CACHE_DIR=${MONASCA_LOG_API_CACHE_DIR:-/var/cache/monasca-log-api}
|
||||||
|
MONASCA_LOG_API_WSGI_DIR=${MONASCA_LOG_API_WSGI_DIR:-/var/www/monasca-log-api}
|
||||||
|
|
||||||
|
MONASCA_LOG_API_CONF=${MONASCA_LOG_API_CONF:-$MONASCA_LOG_API_CONF_DIR/log-api.conf}
|
||||||
|
MONASCA_LOG_API_PASTE=${MONASCA_LOG_API_PASTE:-$MONASCA_LOG_API_CONF_DIR/log-api-paste.ini}
|
||||||
|
MONASCA_LOG_API_LOGGING_CONF=${MONASCA_LOG_API_LOGGING_CONF:-$MONASCA_LOG_API_CONF_DIR/log-api-logging.conf}
|
||||||
|
MONASCA_LOG_API_UWSGI_CONF=${MONASCA_LOG_API_UWSGI_CONF:-$MONASCA_LOG_API_CONF_DIR/log-api-uwsgi.ini}
|
||||||
|
|
||||||
|
MONASCA_LOG_API_USE_MOD_WSGI=${MONASCA_LOG_API_USE_MOD_WSGI:-$ENABLE_HTTPD_MOD_WSGI_SERVICES}
|
||||||
|
|
||||||
|
# configuration bits of various services
|
||||||
|
LOG_PERSISTER_DIR=$DEST/monasca-log-persister
|
||||||
|
LOG_TRANSFORMER_DIR=$DEST/monasca-log-transformer
|
||||||
|
LOG_METRICS_DIR=$DEST/monasca-log-metrics
|
||||||
|
LOG_AGENT_DIR=$DEST/monasca-log-agent
|
||||||
|
|
||||||
|
ELASTICSEARCH_DIR=$DEST/elasticsearch
|
||||||
|
ELASTICSEARCH_CFG_DIR=$ELASTICSEARCH_DIR/config
|
||||||
|
ELASTICSEARCH_LOG_DIR=$LOGDIR/elasticsearch
|
||||||
|
ELASTICSEARCH_DATA_DIR=$DATA_DIR/elasticsearch
|
||||||
|
|
||||||
|
KIBANA_DIR=$DEST/kibana
|
||||||
|
KIBANA_CFG_DIR=$KIBANA_DIR/config
|
||||||
|
|
||||||
|
LOGSTASH_DIR=$DEST/logstash
|
||||||
|
|
||||||
|
PLUGIN_FILES=$MONASCA_LOG_API_DIR/devstack/files
|
||||||
|
# configuration bits of various services
|
||||||
|
|
||||||
|
# Files inside this directory will be visible in gates log
|
||||||
|
GATE_CONFIGURATION_DIR=/etc/monasca-log-api
|
||||||
|
|
||||||
|
# clone monasca-{common,statsd} directly from repo
|
||||||
|
GITREPO["monasca-common"]=${MONASCA_COMMON_REPO}
|
||||||
|
GITBRANCH["monasca-common"]=${MONASCA_COMMON_BRANCH}
|
||||||
|
GITDIR["monasca-common"]=${MONASCA_COMMON_DIR}
|
||||||
|
|
||||||
|
GITREPO["monasca-statsd"]=${MONASCA_STATSD_REPO}
|
||||||
|
GITBRANCH["monasca-statsd"]=${MONASCA_STATSD_BRANCH}
|
||||||
|
GITDIR["monasca-statsd"]=${MONASCA_STATSD_DIR}
|
||||||
|
|
||||||
|
LIBS_FROM_GIT="${LIBS_FROM_GIT:-""},monasca-common,monasca-statsd"
|
||||||
|
# clone monasca-{common,statsd} directly from repo
|
||||||
|
|
||||||
|
# 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_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}
|
||||||
|
ES_SERVICE_PUBLISH_HOST=${ES_SERVICE_PUBLISH_HOST:-${SERVICE_HOST}}
|
||||||
|
ES_SERVICE_PUBLISH_PORT=${ES_SERVICE_PUBLISH_PORT:-9300}
|
||||||
|
|
||||||
|
KIBANA_SERVICE_HOST=${KIBANA_SERVICE_HOST:-${SERVICE_HOST}}
|
||||||
|
KIBANA_SERVICE_PORT=${KIBANA_SERVICE_PORT:-5601}
|
||||||
|
KIBANA_SERVER_BASE_PATH=${KIBANA_SERVER_BASE_PATH:-"/dashboard/monitoring/logs_proxy"}
|
||||||
|
|
||||||
|
KAFKA_SERVICE_HOST=${KAFKA_SERVICE_HOST:-${SERVICE_HOST}}
|
||||||
|
KAFKA_SERVICE_PORT=${KAFKA_SERVICE_PORT:-9092}
|
||||||
|
# public facing bits
|
||||||
|
|
||||||
|
${_XTRACE_LOG_API_CONFIG}
|
|
@ -0,0 +1,56 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Set of utility-like methods that are not bound to any particular
|
||||||
|
# service
|
||||||
|
|
||||||
|
_XTRACE_LOG_API_UTILS=$(set +o | grep xtrace)
|
||||||
|
set +o xtrace
|
||||||
|
|
||||||
|
run_process_sleep() {
|
||||||
|
local name=$1
|
||||||
|
local cmd=$2
|
||||||
|
local sleepTime=${3:-1}
|
||||||
|
run_process "$name" "$cmd"
|
||||||
|
sleep ${sleepTime}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_logstash_required() {
|
||||||
|
is_service_enabled monasca-log-persister \
|
||||||
|
|| is_service_enabled monasca-log-transformer \
|
||||||
|
|| is_service_enabled monasca-log-metrics \
|
||||||
|
|| is_service_enabled monasca-log-agent \
|
||||||
|
&& return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# MONASCA_LOG_API_DEPLOY defines how monasca-log-api is deployed, allowed values:
|
||||||
|
# - mod_wsgi : Run monasca-log-api under Apache HTTPd mod_wsgi
|
||||||
|
# - uwsgi : Run monasca-log-api under uwsgi
|
||||||
|
# - gunicorn: Run monasca-log-api under gunicorn
|
||||||
|
determine_log_api_deploy_mode() {
|
||||||
|
MONASCA_LOG_API_USE_MOD_WSGI=$(trueorfalse False MONASCA_LOG_API_USE_MOD_WSGI)
|
||||||
|
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
||||||
|
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
|
||||||
|
echo "uwsgi"
|
||||||
|
else
|
||||||
|
echo "mod_wsgi"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "gunicorn"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
${_XTRACE_LOG_API_UTILS}
|
|
@ -1,5 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2016 FUJITSU LIMITED
|
# Copyright 2016-2017 FUJITSU LIMITED
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
|
@ -22,41 +24,10 @@ set -o xtrace
|
||||||
_ERREXIT_LOG_API=$(set +o | grep errexit)
|
_ERREXIT_LOG_API=$(set +o | grep errexit)
|
||||||
set -o errexit
|
set -o errexit
|
||||||
|
|
||||||
# monasca-log-api settings
|
# source lib/*
|
||||||
if [[ ${USE_VENV} = True ]]; then
|
source ${MONASCA_LOG_API_DIR}/devstack/lib/util.sh
|
||||||
PROJECT_VENV["monasca-log-api"]=${MONASCA_LOG_API_DIR}.venv
|
source ${MONASCA_LOG_API_DIR}/devstack/lib/config.sh
|
||||||
MONASCA_LOG_API_BIN_DIR=${PROJECT_VENV["monasca-log-api"]}/bin
|
# source lib/*
|
||||||
else
|
|
||||||
MONASCA_LOG_API_BIN_DIR=$(get_python_exec_prefix)
|
|
||||||
fi
|
|
||||||
|
|
||||||
MONASCA_LOG_API_BASE_URI=${MONASCA_LOG_API_SERVICE_PROTOCOL}://${MONASCA_LOG_API_SERVICE_HOST}:${MONASCA_LOG_API_SERVICE_PORT}
|
|
||||||
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
|
|
||||||
LOG_METRICS_DIR=$DEST/monasca-log-metrics
|
|
||||||
LOG_AGENT_DIR=$DEST/monasca-log-agent
|
|
||||||
|
|
||||||
ELASTICSEARCH_DIR=$DEST/elasticsearch
|
|
||||||
ELASTICSEARCH_CFG_DIR=$ELASTICSEARCH_DIR/config
|
|
||||||
ELASTICSEARCH_LOG_DIR=$LOGDIR/elasticsearch
|
|
||||||
ELASTICSEARCH_DATA_DIR=$DATA_DIR/elasticsearch
|
|
||||||
|
|
||||||
KIBANA_DIR=$DEST/kibana
|
|
||||||
KIBANA_CFG_DIR=$KIBANA_DIR/config
|
|
||||||
|
|
||||||
LOGSTASH_DIR=$DEST/logstash
|
|
||||||
|
|
||||||
PLUGIN_FILES=$MONASCA_LOG_API_DIR/devstack/files
|
|
||||||
|
|
||||||
# Files inside this directory will be visible in gates log
|
|
||||||
GATE_CONFIGURATION_DIR=/etc/monasca-log-api
|
|
||||||
|
|
||||||
# TOP_LEVEL functions called from devstack coordinator
|
# TOP_LEVEL functions called from devstack coordinator
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -157,16 +128,19 @@ function install_monasca-log-api {
|
||||||
git_clone $MONASCA_LOG_API_REPO $MONASCA_LOG_API_DIR $MONASCA_LOG_API_BRANCH
|
git_clone $MONASCA_LOG_API_REPO $MONASCA_LOG_API_DIR $MONASCA_LOG_API_BRANCH
|
||||||
setup_develop $MONASCA_LOG_API_DIR
|
setup_develop $MONASCA_LOG_API_DIR
|
||||||
|
|
||||||
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "False" ]; then
|
|
||||||
pip_install gunicorn
|
|
||||||
fi
|
|
||||||
|
|
||||||
install_keystonemiddleware
|
install_keystonemiddleware
|
||||||
install_monasca_common
|
install_monasca_common
|
||||||
install_monasca_statsd
|
install_monasca_statsd
|
||||||
|
|
||||||
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
if [ "$MONASCA_LOG_API_DEPLOY" == "mod_wsgi" ]; then
|
||||||
install_apache_wsgi
|
install_apache_wsgi
|
||||||
|
elif [ "$MONASCA_LOG_API_DEPLOY" == "uwsgi" ]; then
|
||||||
|
pip_install uwsgi
|
||||||
|
else
|
||||||
|
pip_install gunicorn
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$MONASCA_LOG_API_DEPLOY" != "gunicorn" ]; then
|
||||||
if is_ssl_enabled_service "monasca-log-api"; then
|
if is_ssl_enabled_service "monasca-log-api"; then
|
||||||
enable_mod_ssl
|
enable_mod_ssl
|
||||||
fi
|
fi
|
||||||
|
@ -177,55 +151,11 @@ function configure_monasca_log_api {
|
||||||
if is_service_enabled monasca-log-api; then
|
if is_service_enabled monasca-log-api; then
|
||||||
echo_summary "Configuring monasca-log-api"
|
echo_summary "Configuring monasca-log-api"
|
||||||
|
|
||||||
# Put config files in ``$MONASCA_LOG_API_CONF_DIR`` for everyone to find
|
configure_monasca_log_api_core
|
||||||
sudo install -d -o $STACK_USER $MONASCA_LOG_API_CONF_DIR
|
if [ "$MONASCA_LOG_API_DEPLOY" == "mod_wsgi" ]; then
|
||||||
create_log_api_cache_dir
|
configure_monasca_log_api_mod_wsgi
|
||||||
|
elif [ "$MONASCA_LOG_API_DEPLOY" == "uwsgi" ]; then
|
||||||
# ensure fresh installation of configuration files
|
configure_monasca_log_api_uwsgi
|
||||||
rm -rf $MONASCA_LOG_API_CONF $MONASCA_LOG_API_PASTE $MONASCA_LOG_API_LOGGING_CONF
|
|
||||||
|
|
||||||
$MONASCA_LOG_API_BIN_DIR/oslo-config-generator \
|
|
||||||
--config-file $MONASCA_LOG_API_DIR/config-generator/monasca-log-api.conf \
|
|
||||||
--output-file /tmp/log-api.conf
|
|
||||||
|
|
||||||
install -m 600 /tmp/log-api.conf $MONASCA_LOG_API_CONF && rm -rf /tmp/log-api.conf
|
|
||||||
install -m 600 $MONASCA_LOG_API_DIR/etc/monasca/log-api-paste.ini $MONASCA_LOG_API_PASTE
|
|
||||||
install -m 600 $MONASCA_LOG_API_DIR/etc/monasca/log-api-logging.conf $MONASCA_LOG_API_LOGGING_CONF
|
|
||||||
|
|
||||||
# configure log-api.conf
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" DEFAULT log_config_append $MONASCA_LOG_API_LOGGING_CONF
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" service region $REGION_NAME
|
|
||||||
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" log_publisher kafka_url $KAFKA_SERVICE_HOST:$KAFKA_SERVICE_PORT
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" log_publisher topics log
|
|
||||||
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" kafka_healthcheck kafka_url $KAFKA_SERVICE_HOST:$KAFKA_SERVICE_PORT
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" kafka_healthcheck kafka_topics log
|
|
||||||
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" roles_middleware path "/v2.0/log,/v3.0/logs"
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" roles_middleware default_roles monasca-user
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" roles_middleware agent_roles monasca-agent
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" roles_middleware delegate_roles admin
|
|
||||||
|
|
||||||
# configure keystone middleware
|
|
||||||
configure_auth_token_middleware "$MONASCA_LOG_API_CONF" "admin" $MONASCA_LOG_API_CACHE_DIR
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken region_name $REGION_NAME
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken project_name "admin"
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken password $ADMIN_PASSWORD
|
|
||||||
|
|
||||||
# insecure
|
|
||||||
if is_service_enabled tls-proxy; then
|
|
||||||
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken insecure False
|
|
||||||
fi
|
|
||||||
|
|
||||||
# configure log-api-paste.ini
|
|
||||||
iniset "$MONASCA_LOG_API_PASTE" server:main bind $MONASCA_LOG_API_SERVICE_HOST:$MONASCA_LOG_API_SERVICE_PORT
|
|
||||||
iniset "$MONASCA_LOG_API_PASTE" server:main chdir $MONASCA_LOG_API_DIR
|
|
||||||
iniset "$MONASCA_LOG_API_PASTE" server:main workers $API_WORKERS
|
|
||||||
|
|
||||||
# WSGI
|
|
||||||
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
|
||||||
configure_monasca_log_api_wsgi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# link configuration for the gate
|
# link configuration for the gate
|
||||||
|
@ -236,7 +166,63 @@ function configure_monasca_log_api {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function configure_monasca_log_api_wsgi {
|
function configure_monasca_log_api_core {
|
||||||
|
# Put config files in ``$MONASCA_LOG_API_CONF_DIR`` for everyone to find
|
||||||
|
sudo install -d -o $STACK_USER $MONASCA_LOG_API_CONF_DIR
|
||||||
|
sudo install -m 700 -d -o $STACK_USER $MONASCA_LOG_API_CACHE_DIR
|
||||||
|
sudo install -d -o $STACK_USER $MONASCA_LOG_API_LOG_DIR
|
||||||
|
|
||||||
|
# ensure fresh installation of configuration files
|
||||||
|
rm -rf $MONASCA_LOG_API_CONF $MONASCA_LOG_API_PASTE $MONASCA_LOG_API_LOGGING_CONF
|
||||||
|
|
||||||
|
$MONASCA_LOG_API_BIN_DIR/oslo-config-generator \
|
||||||
|
--config-file $MONASCA_LOG_API_DIR/config-generator/monasca-log-api.conf \
|
||||||
|
--output-file /tmp/log-api.conf
|
||||||
|
|
||||||
|
install -m 600 /tmp/log-api.conf $MONASCA_LOG_API_CONF && rm -rf /tmp/log-api.conf
|
||||||
|
install -m 600 $MONASCA_LOG_API_DIR/etc/monasca/log-api-paste.ini $MONASCA_LOG_API_PASTE
|
||||||
|
install -m 600 $MONASCA_LOG_API_DIR/etc/monasca/log-api-logging.conf $MONASCA_LOG_API_LOGGING_CONF
|
||||||
|
|
||||||
|
# configure log-api.conf
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" DEFAULT log_config_append $MONASCA_LOG_API_LOGGING_CONF
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" service region $REGION_NAME
|
||||||
|
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" log_publisher kafka_url $KAFKA_SERVICE_HOST:$KAFKA_SERVICE_PORT
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" log_publisher topics log
|
||||||
|
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" kafka_healthcheck kafka_url $KAFKA_SERVICE_HOST:$KAFKA_SERVICE_PORT
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" kafka_healthcheck kafka_topics log
|
||||||
|
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" roles_middleware path "/v2.0/log,/v3.0/logs"
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" roles_middleware default_roles monasca-user
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" roles_middleware agent_roles monasca-agent
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" roles_middleware delegate_roles admin
|
||||||
|
|
||||||
|
# configure keystone middleware
|
||||||
|
configure_auth_token_middleware "$MONASCA_LOG_API_CONF" "admin" $MONASCA_LOG_API_CACHE_DIR
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken region_name $REGION_NAME
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken project_name "admin"
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken password $ADMIN_PASSWORD
|
||||||
|
|
||||||
|
# insecure
|
||||||
|
if is_service_enabled tls-proxy; then
|
||||||
|
iniset "$MONASCA_LOG_API_CONF" keystone_authtoken insecure False
|
||||||
|
fi
|
||||||
|
|
||||||
|
# configure log-api-paste.ini
|
||||||
|
iniset "$MONASCA_LOG_API_PASTE" server:main bind $MONASCA_LOG_API_SERVICE_HOST:$MONASCA_LOG_API_SERVICE_PORT
|
||||||
|
iniset "$MONASCA_LOG_API_PASTE" server:main chdir $MONASCA_LOG_API_DIR
|
||||||
|
iniset "$MONASCA_LOG_API_PASTE" server:main workers $API_WORKERS
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure_monasca_log_api_uwsgi {
|
||||||
|
rm -rf $MONASCA_LOG_API_UWSGI_CONF
|
||||||
|
install -m 600 $MONASCA_LOG_API_DIR/etc/monasca/log-api-uwsgi.ini $MONASCA_LOG_API_UWSGI_CONF
|
||||||
|
|
||||||
|
write_uwsgi_config "$MONASCA_LOG_API_UWSGI_CONF" "$MONASCA_LOG_API_WSGI" "/logs"
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure_monasca_log_api_mod_wsgi {
|
||||||
sudo install -d $MONASCA_LOG_API_WSGI_DIR
|
sudo install -d $MONASCA_LOG_API_WSGI_DIR
|
||||||
|
|
||||||
local monasca_log_api_apache_conf
|
local monasca_log_api_apache_conf
|
||||||
|
@ -253,17 +239,19 @@ function configure_monasca_log_api_wsgi {
|
||||||
monasca_log_api_certfile="SSLCertificateFile $MONASCA_LOG_API_SSL_CERT"
|
monasca_log_api_certfile="SSLCertificateFile $MONASCA_LOG_API_SSL_CERT"
|
||||||
monasca_log_api_keyfile="SSLCertificateKeyFile $MONASCA_LOG_API_SSL_KEY"
|
monasca_log_api_keyfile="SSLCertificateKeyFile $MONASCA_LOG_API_SSL_KEY"
|
||||||
fi
|
fi
|
||||||
|
if is_service_enabled tls-proxy; then
|
||||||
|
monasca_log_api_api_port=$MONASCA_LOG_API_SERVICE_PORT_INT
|
||||||
|
fi
|
||||||
if [[ ${USE_VENV} = True ]]; then
|
if [[ ${USE_VENV} = True ]]; then
|
||||||
venv_path="python-path=${PROJECT_VENV["monasca_log_api"]}/lib/$(python_version)/site-packages"
|
venv_path="python-path=${PROJECT_VENV["monasca_log_api"]}/lib/$(python_version)/site-packages"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# copy proxy vhost and wsgi helper files
|
# copy proxy vhost and wsgi helper files
|
||||||
sudo cp $MONASCA_LOG_API_BIN_DIR/monasca-log-api-wsgi $MONASCA_LOG_API_WSGI_DIR/monasca_log_api
|
|
||||||
sudo cp $PLUGIN_FILES/apache-log-api.template $monasca_log_api_apache_conf
|
sudo cp $PLUGIN_FILES/apache-log-api.template $monasca_log_api_apache_conf
|
||||||
sudo sed -e "
|
sudo sed -e "
|
||||||
s|%PUBLICPORT%|$monasca_log_api_api_port|g;
|
s|%PUBLICPORT%|$monasca_log_api_api_port|g;
|
||||||
s|%APACHE_NAME%|$APACHE_NAME|g;
|
s|%APACHE_NAME%|$APACHE_NAME|g;
|
||||||
s|%PUBLICWSGI%|$MONASCA_LOG_API_WSGI_DIR/monasca_log_api|g;
|
s|%PUBLICWSGI%|$MONASCA_LOG_API_BIN_DIR/monasca-log-api-wsgi|g;
|
||||||
s|%SSLENGINE%|$monasca_log_api_ssl|g;
|
s|%SSLENGINE%|$monasca_log_api_ssl|g;
|
||||||
s|%SSLCERTFILE%|$monasca_log_api_certfile|g;
|
s|%SSLCERTFILE%|$monasca_log_api_certfile|g;
|
||||||
s|%SSLKEYFILE%|$monasca_log_api_keyfile|g;
|
s|%SSLKEYFILE%|$monasca_log_api_keyfile|g;
|
||||||
|
@ -310,38 +298,48 @@ function start_monasca_log_api {
|
||||||
service_port=$MONASCA_LOG_API_SERVICE_PORT_INT
|
service_port=$MONASCA_LOG_API_SERVICE_PORT_INT
|
||||||
service_protocol="http"
|
service_protocol="http"
|
||||||
fi
|
fi
|
||||||
|
local service_uri
|
||||||
|
|
||||||
restart_service memcached
|
if [ "$MONASCA_LOG_API_DEPLOY" == "mod_wsgi" ]; then
|
||||||
|
local enabled_site_file
|
||||||
local enabled_site_file
|
enabled_site_file=$(apache_site_config_for monasca-log-api)
|
||||||
enabled_site_file=$(apache_site_config_for monasca-log-api)
|
service_uri=$service_protocol://$MONASCA_LOG_API_SERVICE_HOST/logs/v3.0
|
||||||
if [ -f ${enabled_site_file} ] && [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
if [ -f ${enabled_site_file} ]; then
|
||||||
enable_apache_site monasca-log-api
|
enable_apache_site monasca-log-api
|
||||||
restart_apache_server
|
restart_apache_server
|
||||||
tail_log monasca-log-api /var/log/$APACHE_NAME/monasca-log-api.log
|
tail_log monasca-log-api /var/log/$APACHE_NAME/monasca-log-api.log
|
||||||
|
fi
|
||||||
|
elif [ "$MONASCA_LOG_API_DEPLOY" == "uwsgi" ]; then
|
||||||
|
service_uri=$service_protocol://$MONASCA_LOG_API_SERVICE_HOST/logs/v3.0
|
||||||
|
run_process "monasca-log-api" "$MONASCA_LOG_API_BIN_DIR/uwsgi --ini $MONASCA_LOG_API_UWSGI_CONF" ""
|
||||||
else
|
else
|
||||||
local gunicorn="$MONASCA_LOG_API_BIN_DIR/gunicorn"
|
service_uri=$service_protocol://$MONASCA_LOG_API_SERVICE_HOST:$service_port
|
||||||
run_process "monasca-log-api" "$gunicorn --paste $MONASCA_LOG_API_PASTE"
|
run_process "monasca-log-api" "$MONASCA_LOG_API_BIN_DIR/gunicorn --paste $MONASCA_LOG_API_PASTE" ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Waiting for monasca-log-api to start..."
|
echo "Waiting for monasca-log-api to start..."
|
||||||
if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$SERVICE_HOST:$service_port; then
|
if ! wait_for_service $SERVICE_TIMEOUT $service_uri; then
|
||||||
die $LINENO "monasca-log-api did not start"
|
die $LINENO "monasca-log-api did not start"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if is_service_enabled tls-proxy; then
|
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
|
start_tls_proxy monasca-log-api '*' $MONASCA_LOG_API_SERVICE_PORT $MONASCA_LOG_API_SERVICE_HOST $MONASCA_LOG_API_SERVICE_PORT_INT
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
restart_service memcached
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop_monasca_log_api {
|
function stop_monasca_log_api {
|
||||||
if is_service_enabled monasca-log-api; then
|
if is_service_enabled monasca-log-api; then
|
||||||
if [ "$MONASCA_LOG_API_USE_MOD_WSGI" == "True" ]; then
|
if [ "$MONASCA_LOG_API_DEPLOY" == "mod_wsgi" ]; then
|
||||||
disable_apache_site monasca-log-api
|
disable_apache_site monasca-log-api
|
||||||
restart_apache_server
|
restart_apache_server
|
||||||
else
|
else
|
||||||
stop_process "monasca-log-api" || true
|
stop_process "monasca-log-api"
|
||||||
|
if [ "$MONASCA_LOG_API_DEPLOY" == "uwsgi" ]; then
|
||||||
|
remove_uwsgi_config "$MONASCA_LOG_API_UWSGI_CONF" "$MONASCA_LOG_API_WSGI"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -435,7 +433,7 @@ function start_elasticsearch {
|
||||||
echo_summary "Starting ElasticSearch ${ELASTICSEARCH_VERSION}"
|
echo_summary "Starting ElasticSearch ${ELASTICSEARCH_VERSION}"
|
||||||
# 5 extra seconds to ensure that ES started properly
|
# 5 extra seconds to ensure that ES started properly
|
||||||
local esSleepTime=${ELASTICSEARCH_SLEEP_TIME:-5}
|
local esSleepTime=${ELASTICSEARCH_SLEEP_TIME:-5}
|
||||||
_run_process_sleep "elasticsearch" "$ELASTICSEARCH_DIR/bin/elasticsearch" $esSleepTime
|
run_process_sleep "elasticsearch" "$ELASTICSEARCH_DIR/bin/elasticsearch" $esSleepTime
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +506,7 @@ function start_kibana {
|
||||||
echo_summary "Starting Kibana ${KIBANA_VERSION}"
|
echo_summary "Starting Kibana ${KIBANA_VERSION}"
|
||||||
local kibanaSleepTime=${KIBANA_SLEEP_TIME:-90} # kibana takes some time to load up
|
local kibanaSleepTime=${KIBANA_SLEEP_TIME:-90} # kibana takes some time to load up
|
||||||
local kibanaCFG="$KIBANA_CFG_DIR/kibana.yml"
|
local kibanaCFG="$KIBANA_CFG_DIR/kibana.yml"
|
||||||
_run_process_sleep "kibana" "$KIBANA_DIR/bin/kibana --config $kibanaCFG" $kibanaSleepTime
|
run_process_sleep "kibana" "$KIBANA_DIR/bin/kibana --config $kibanaCFG" $kibanaSleepTime
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,22 +780,6 @@ function enable_log_management {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function _run_process_sleep {
|
|
||||||
local name=$1
|
|
||||||
local cmd=$2
|
|
||||||
local sleepTime=${3:-1}
|
|
||||||
run_process "$name" "$cmd"
|
|
||||||
sleep ${sleepTime}
|
|
||||||
}
|
|
||||||
|
|
||||||
function is_logstash_required {
|
|
||||||
is_service_enabled monasca-log-persister \
|
|
||||||
|| is_service_enabled monasca-log-transformer \
|
|
||||||
|| is_service_enabled monasca-log-metrics \
|
|
||||||
|| is_service_enabled monasca-log-agent \
|
|
||||||
&& return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# check for service enabled
|
# check for service enabled
|
||||||
if is_service_enabled monasca-log; then
|
if is_service_enabled monasca-log; then
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
# services
|
# services
|
||||||
enable_service zookeeper # devstack/lib/dlm
|
enable_service zookeeper # devstack/monasca-api/zookeeper
|
||||||
enable_service kibana # devstack/monasca-api/kafka
|
enable_service kibana # devstack/monasca-api/kafka
|
||||||
enable_service elasticsearch
|
enable_service elasticsearch
|
||||||
enable_service monasca-log
|
enable_service monasca-log
|
||||||
|
@ -50,44 +50,5 @@ MONASCA_KIBANA_PLUGIN_REPO=${MONASCA_KIBANA_PLUGIN_REPO:-${GIT_BASE}/openstack/m
|
||||||
MONASCA_KIBANA_PLUGIN_BRANCH=${MONASCA_KIBANA_PLUGIN_BRANCH:-master}
|
MONASCA_KIBANA_PLUGIN_BRANCH=${MONASCA_KIBANA_PLUGIN_BRANCH:-master}
|
||||||
MONASCA_KIBANA_PLUGIN_DIR=${DEST}/monasca-kibana-plugin
|
MONASCA_KIBANA_PLUGIN_DIR=${DEST}/monasca-kibana-plugin
|
||||||
|
|
||||||
GITREPO["monasca-common"]=${MONASCA_COMMON_REPO}
|
|
||||||
GITBRANCH["monasca-common"]=${MONASCA_COMMON_BRANCH}
|
|
||||||
GITDIR["monasca-common"]=${MONASCA_COMMON_DIR}
|
|
||||||
|
|
||||||
GITREPO["monasca-statsd"]=${MONASCA_STATSD_REPO}
|
|
||||||
GITBRANCH["monasca-statsd"]=${MONASCA_STATSD_BRANCH}
|
|
||||||
GITDIR["monasca-statsd"]=${MONASCA_STATSD_DIR}
|
|
||||||
|
|
||||||
LIBS_FROM_GIT="${LIBS_FROM_GIT:-""},monasca-common,monasca-statsd"
|
|
||||||
|
|
||||||
# configuration bits
|
|
||||||
MONASCA_LOG_API_CONF_DIR=${MONASCA_LOG_API_CONF_DIR:-/etc/monasca}
|
|
||||||
MONASCA_LOG_API_CONF=${MONASCA_LOG_API_CONF:-$MONASCA_LOG_API_CONF_DIR/log-api.conf}
|
|
||||||
MONASCA_LOG_API_PASTE=${MONASCA_LOG_API_PASTE:-$MONASCA_LOG_API_CONF_DIR/log-api-paste.ini}
|
|
||||||
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_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}
|
|
||||||
ES_SERVICE_PUBLISH_HOST=${ES_SERVICE_PUBLISH_HOST:-${SERVICE_HOST}}
|
|
||||||
ES_SERVICE_PUBLISH_PORT=${ES_SERVICE_PUBLISH_PORT:-9300}
|
|
||||||
|
|
||||||
KIBANA_SERVICE_HOST=${KIBANA_SERVICE_HOST:-${SERVICE_HOST}}
|
|
||||||
KIBANA_SERVICE_PORT=${KIBANA_SERVICE_PORT:-5601}
|
|
||||||
KIBANA_SERVER_BASE_PATH=${KIBANA_SERVER_BASE_PATH:-"/dashboard/monitoring/logs_proxy"}
|
|
||||||
|
|
||||||
KAFKA_SERVICE_HOST=${KAFKA_SERVICE_HOST:-${SERVICE_HOST}}
|
|
||||||
KAFKA_SERVICE_PORT=${KAFKA_SERVICE_PORT:-9092}
|
|
||||||
|
|
||||||
DOWNLOAD_FILE_TIMEOUT=${DOWNLOAD_FILE_TIMEOUT:-300}
|
DOWNLOAD_FILE_TIMEOUT=${DOWNLOAD_FILE_TIMEOUT:-300}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ class = logging.handlers.RotatingFileHandler
|
||||||
level = DEBUG
|
level = DEBUG
|
||||||
formatter = context
|
formatter = context
|
||||||
# store up to 5*100MB of logs
|
# store up to 5*100MB of logs
|
||||||
args = ('monasca-log-api.log', 'a', 104857600, 5)
|
args = ('/var/log/monasca/log-api.log', 'a', 104857600, 5)
|
||||||
|
|
||||||
[formatter_context]
|
[formatter_context]
|
||||||
class = oslo_log.formatters.ContextFormatter
|
class = oslo_log.formatters.ContextFormatter
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
[uwsgi]
|
||||||
|
wsgi-file = /usr/local/bin/monasca-log-api-wsgi
|
||||||
|
|
||||||
|
# Versions of mod_proxy_uwsgi>=2.0.6 should use a UNIX socket, see
|
||||||
|
# http://uwsgi-docs.readthedocs.org/en/latest/Apache.html#mod-proxy-uwsgi
|
||||||
|
uwsgi-socket = 127.0.0.1:5607
|
||||||
|
|
||||||
|
# Override the default size for headers from the 4k default.
|
||||||
|
buffer-size = 65535
|
||||||
|
|
||||||
|
# This is running standalone
|
||||||
|
master = true
|
||||||
|
|
||||||
|
enable-threads = true
|
||||||
|
|
||||||
|
# Tune this to your environment.
|
||||||
|
processes = 4
|
||||||
|
|
||||||
|
# uwsgi recommends this to prevent thundering herd on accept.
|
||||||
|
thunder-lock = true
|
||||||
|
|
||||||
|
plugins = python
|
||||||
|
|
||||||
|
# This ensures that file descriptors aren't shared between keystone processes.
|
||||||
|
lazy-apps = true
|
|
@ -75,8 +75,11 @@ class TestLogApiConstraints(base.BaseLogsTestCase):
|
||||||
except exceptions.OverLimit as urc:
|
except exceptions.OverLimit as urc:
|
||||||
self.assertEqual(413, urc.resp.status)
|
self.assertEqual(413, urc.resp.status)
|
||||||
return
|
return
|
||||||
|
except exceptions.UnexpectedContentType as uct:
|
||||||
|
self.assertEqual(503, uct.resp.status)
|
||||||
|
return
|
||||||
|
|
||||||
self.assertTrue(False, 'API should respond with 413')
|
self.assertTrue(False, 'API should respond with 413 or 503')
|
||||||
|
|
||||||
@decorators.attr(type='gate')
|
@decorators.attr(type='gate')
|
||||||
def test_should_reject_too_big_message_multiline(self):
|
def test_should_reject_too_big_message_multiline(self):
|
||||||
|
@ -97,5 +100,8 @@ class TestLogApiConstraints(base.BaseLogsTestCase):
|
||||||
except exceptions.OverLimit as urc:
|
except exceptions.OverLimit as urc:
|
||||||
self.assertEqual(413, urc.resp.status)
|
self.assertEqual(413, urc.resp.status)
|
||||||
return
|
return
|
||||||
|
except exceptions.UnexpectedContentType as uct:
|
||||||
|
self.assertEqual(503, uct.resp.status)
|
||||||
|
return
|
||||||
|
|
||||||
self.assertTrue(False, 'API should respond with 413')
|
self.assertTrue(False, 'API should respond with 413 or 503')
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
---
|
||||||
|
prelude: >
|
||||||
|
https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
According to Pike release goals, all APIs should have the possibility
|
||||||
|
to be deployed under WSGI. With this change, monasca-log-api is capable
|
||||||
|
of running on either of following: gunicorn, uwsgi or mod_wsgi.
|
Loading…
Reference in New Issue