Deploy masakari-api with uwsgi

As per community goal [1], this patch allows deploying
masakari-api with uwsgi.

NOTE:
This patch takes reference from the nova implementation of deploying
nova-api with uwsgi.

[1] https://governance.openstack.org/tc/goals/pike/deploy-api-in-wsgi.html
Change-Id: I469d4b6df49ad3489722feae0b795c20a6a3913b
This commit is contained in:
dineshbhor 2018-04-08 19:38:25 -07:00
parent 24e500cb77
commit 5bbd78e326
5 changed files with 99 additions and 12 deletions

View File

@ -25,6 +25,10 @@ if is_service_enabled tls-proxy; then
MASAKARI_SERVICE_PROTOCOL="https"
fi
# Toggle for deploying Masakari under a wsgi server.
MASAKARI_USE_MOD_WSGI=${MASAKARI_USE_MOD_WSGI:-True}
# Functions
# ---------
@ -52,11 +56,19 @@ function create_masakari_accounts {
local masakari_service=$(get_or_create_service "masakari" \
"instance-ha" "OpenStack High Availability")
get_or_create_endpoint $masakari_service \
"$REGION_NAME" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s"
if [ "$MASAKARI_USE_MOD_WSGI" == "False" ]; then
get_or_create_endpoint $masakari_service \
"$REGION_NAME" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST:$MASAKARI_SERVICE_PORT/v1/\$(tenant_id)s"
else
get_or_create_endpoint $masakari_service \
"$REGION_NAME" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST/instance-ha/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST/instance-ha/v1/\$(tenant_id)s" \
"$MASAKARI_SERVICE_PROTOCOL://$SERVICE_HOST/instance-ha/v1/\$(tenant_id)s"
fi
fi
}
@ -69,6 +81,10 @@ function cleanup_masakari {
# Clean up dirs
rm -fr $MASAKARI_AUTH_CACHE_DIR/*
rm -fr $MASAKARI_CONF_DIR/*
if [ "$MASAKARI_USE_MOD_WSGI" == "True" ]; then
remove_uwsgi_config "$MASAKARI_UWSGI_CONF" "$MASAKARI_UWSGI"
fi
}
# iniset_conditional() - Sets the value in the inifile, but only if it's
@ -127,6 +143,10 @@ function configure_masakari {
if is_service_enabled tls-proxy; then
iniset $MASAKARI_CONF DEFAULT masakari_api_listen_port $MASAKARI_SERVICE_PORT_INT
fi
if [ "$MASAKARI_USE_MOD_WSGI" == "True" ]; then
write_uwsgi_config "$MASAKARI_UWSGI_CONF" "$MASAKARI_UWSGI" "/instance-ha"
fi
}
# install_masakari() - Collect source and prepare
@ -157,20 +177,35 @@ function init_masakari {
get_or_add_user_project_role admin ${ADMIN_ALT_USERNAME} ${ALT_TENANT_NAME}
}
# start_masakari() - Start running processes, including screen
# start_masakari() - Start running processes
function start_masakari {
local masakari_url
if is_service_enabled tls-proxy; then
start_tls_proxy masakari-service '*' $MASAKARI_SERVICE_PORT $SERVICE_HOST $MASAKARI_SERVICE_PORT_INT
if [[ "$ENABLED_SERVICES" =~ "masakari-api" ]]; then
if [ "$MASAKARI_USE_MOD_WSGI" == "False" ]; then
run_process masakari-api "$MASAKARI_BIN_DIR/masakari-api --config-file=$MASAKARI_CONF --debug"
masakari_url=$MASAKARI_SERVICE_PROTOCOL://$MASAKARI_SERVICE_HOST:$MASAKARI_SERVICE_PORT
# Start proxy if tls enabled
if is_service_enabled tls_proxy; then
start_tls_proxy masakari-service '*' $MASAKARI_SERVICE_PORT $SERVICE_HOST $MASAKARI_SERVICE_PORT_INT
fi
else
run_process "masakari-api" "$MASAKARI_BIN_DIR/uwsgi --procname-prefix masakari-api --ini $MASAKARI_UWSGI_CONF"
masakari_url=$MASAKARI_SERVICE_PROTOCOL://$MASAKARI_SERVICE_HOST/instance-ha/v1
fi
fi
echo "Waiting for Masakari API to start..."
if ! wait_for_service $SERVICE_TIMEOUT $masakari_url; then
die $LINENO "masakari-api did not start"
fi
run_process masakari-api "$MASAKARI_BIN_DIR/masakari-api --config-file=$MASAKARI_CONF --debug"
run_process masakari-engine "$MASAKARI_BIN_DIR/masakari-engine --config-file=$MASAKARI_CONF --debug"
}
# stop_masakari() - Stop running processes
function stop_masakari {
# Kill the masakari screen windows
# Kill the masakari services
local serv
for serv in masakari-engine masakari-api; do
stop_process $serv

View File

@ -17,6 +17,7 @@ MASAKARI_LOCAL_API_PASTE_INI=${MASAKARI_LOCAL_API_PASTE_INI:-${MASAKARI_LOCAL_CO
MASAKARI_LOCAL_POLICY_JSON=${MASAKARI_LOCAL_POLICY_JSON:-${MASAKARI_LOCAL_CONF_DIR}/policy.json}
MASAKARI_AUTH_CACHE_DIR=${MASAKARI_AUTH_CACHE_DIR:-/var/cache/masakari}
MASAKARI_SERVICE_HOST=${MASAKARI_SERVICE_HOST:-$SERVICE_HOST}
MASAKARI_SERVICE_PROTOCOL=${MASAKARI_SERVICE_PROTOCOL:-http}
# Support entry points installation of console scripts
@ -31,5 +32,8 @@ MASAKARI_MANAGE=$MASAKARI_BIN_DIR/masakari-manage
MASAKARI_SERVICE_PORT=${MASAKARI_SERVICE_PORT:-15868}
MASAKARI_SERVICE_PORT_INT=${MASAKARI_SERVICE_PORT_INT:-25868}
MASAKARI_UWSGI=$MASAKARI_BIN_DIR/masakari-wsgi
MASAKARI_UWSGI_CONF=$MASAKARI_CONF_DIR/masakari-api-uwsgi.ini
enable_service masakari masakari-api masakari-engine

View File

@ -16,22 +16,36 @@
"""Starter script for Masakari API.
"""
import os
import sys
from oslo_log import log as logging
from oslo_service import _options as service_opts
from paste import deploy
import six
from masakari.common import config
import masakari.conf
from masakari import config
from masakari import config as api_config
from masakari import exception
from masakari import objects
from masakari import rpc
from masakari import service
from masakari import version
CONFIG_FILES = ['api-paste.ini', 'masakari.conf']
CONF = masakari.conf.CONF
def _get_config_files(env=None):
if env is None:
env = os.environ
dirname = env.get('OS_MASAKARI_CONFIG_DIR', '/etc/masakari').strip()
return [os.path.join(dirname, config_file)
for config_file in CONFIG_FILES]
def main():
config.parse_args(sys.argv)
logging.setup(CONF, "masakari")
@ -54,3 +68,26 @@ def main():
sys.exit(1)
launcher.wait()
def initialize_application():
conf_files = _get_config_files()
api_config.parse_args([], default_config_files=conf_files)
logging.setup(CONF, "masakari")
objects.register_all()
CONF(sys.argv[1:], project='masakari', version=version.version_string())
# NOTE: Dump conf at debug (log_options option comes from oslo.service)
# This is gross but we don't have a public hook into oslo.service to
# register these options, so we are doing it manually for now;
# remove this when we have a hook method into oslo.service.
CONF.register_opts(service_opts.service_opts)
if CONF.log_options:
CONF.log_opt_values(logging.getLogger(__name__), logging.DEBUG)
config.set_middleware_defaults()
rpc.init(CONF)
conf = conf_files[0]
return deploy.loadapp('config:%s' % conf, name="masakari_api")

View File

@ -0,0 +1,8 @@
---
upgrade:
- |
WSGI application script ``masakari-wsgi`` is now available. It allows
running the masakari APIs using a WSGI server of choice (for example
nginx and uwsgi, apache2 with mod_proxy_uwsgi or gunicorn).
The eventlet-based servers are still available, but the WSGI options will
allow greater deployment flexibility.

View File

@ -38,6 +38,9 @@ console_scripts =
masakari-engine = masakari.cmd.engine:main
masakari-manage = masakari.cmd.manage:main
wsgi_scripts =
masakari-wsgi = masakari.cmd.api:initialize_application
masakari.database.migration_backend =
sqlalchemy = oslo_db.sqlalchemy.migration