diff --git a/devstack/README.rst b/devstack/README.rst
index 400904639..1026aeb3e 100644
--- a/devstack/README.rst
+++ b/devstack/README.rst
@@ -15,4 +15,7 @@ Enabling senlin in DevStack
#Enable senlin-dashboard
enable_plugin senlin-dashboard https://git.openstack.org/openstack/senlin-dashboard
+Optionally, you can add a line ``SENLIN_USE_MOD_WSGI=True`` to the same ``local.conf``
+file if you prefer running the Senlin API service under Apache.
+
3. Run ``./stack.sh``.
diff --git a/devstack/apache-senlin.template b/devstack/apache-senlin.template
new file mode 100644
index 000000000..c7f11623d
--- /dev/null
+++ b/devstack/apache-senlin.template
@@ -0,0 +1,34 @@
+Listen %PORT%
+
+
+ WSGIDaemonProcess senlin-api processes=2 threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
+ WSGIProcessGroup senlin-api
+ WSGIScriptAlias / %SENLIN_BIN_DIR%/senlin-wsgi-api
+ WSGIApplicationGroup %{GLOBAL}
+ WSGIPassAuthorization On
+ AllowEncodedSlashes On
+ = 2.4>
+ ErrorLogFormat "%{cu}t %M"
+
+ ErrorLog /var/log/%APACHE_NAME%/senlin-api.log
+
+
+ = 2.4>
+ Require all granted
+
+
+ Order allow,deny
+ Allow from all
+
+
+
+
+Alias /cluster %SENLIN_BIN_DIR%/senlin-wsgi-api
+
+ SetHandler wsgi-script
+ Options +ExecCGI
+ WSGIProcessGroup senlin-api
+ WSGIApplicationGroup %{GLOBAL}
+ WSGIPassAuthorization On
+ AllowEncodedSlashes On
+
diff --git a/devstack/lib/senlin b/devstack/lib/senlin
index 5bda41a9c..3feda1a3c 100644
--- a/devstack/lib/senlin
+++ b/devstack/lib/senlin
@@ -57,6 +57,9 @@ SENLIN_DASHBOARD_DIR=$DEST/senlin-dashboard
SENLIN_DASHBOARD_REPO=${SENLIN_DASHBOARD_REPO:-${GIT_BASE}/openstack/senlin-dashboard.git}
SENLIN_DASHBOARD_BRANCH=${SENLIN_DASHBOARD_BRANCH:-master}
+# Toggle for deploying senlin-api under Apache(mod_wsgi)
+SENLIN_USE_MOD_WSGI=${SENLIN_USE_MOD_WSGI:-False}
+
# Functions
# ---------
@@ -70,6 +73,7 @@ function is_senlin_enabled {
# cleanup_senlin() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_senlin {
+ _cleanup_senlin_apache_wsgi
sudo rm -rf $SENLIN_AUTH_CACHE_DIR
sudo rm -rf $SENLIN_CONF_DIR
}
@@ -96,7 +100,7 @@ function configure_senlin {
iniset $SENLIN_CONF DEFAULT default_region_name "$REGION_NAME"
iniset $SENLIN_CONF DEFAULT use_syslog $SYSLOG
- if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
+ if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$SENLIN_USE_MOD_WSGI" == "False" ]; then
# Add color to logging output
setup_colorized_logging $SENLIN_CONF DEFAULT
fi
@@ -134,6 +138,35 @@ function configure_senlin {
iniset $SENLIN_CONF zaqar auth_url $KEYSTONE_AUTH_URI/v3
iniset $SENLIN_CONF zaqar user_domain_name Default
iniset $SENLIN_CONF zaqar project_domain_name Default
+
+ if [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ _config_senlin_apache_wsgi
+ fi
+}
+
+# _cleanup_senlin_apache_wsgi() - Remove WSGI files, disable and remove Apache vhost file
+function _cleanup_senlin_apache_wsgi {
+ if [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ sudo rm -f $(apache_site_config_for senlin-api)
+ fi
+}
+
+# _config_senlin_apache_wsgi() - Configure mod_wsgi
+function _config_senlin_apache_wsgi {
+
+ local senlin_apache_conf
+ senlin_apache_conf=$(apache_site_config_for senlin-api)
+ local senlin_api_port=$SENLIN_API_PORT
+ local venv_path=""
+
+ sudo cp $SENLIN_DIR/devstack/apache-senlin.template $senlin_apache_conf
+ sudo sed -e "
+ s|%PORT%|$senlin_api_port|g;
+ s|%APACHE_NAME%|$APACHE_NAME|g;
+ s|%SENLIN_BIN_DIR%|$SENLIN_BIN_DIR|g;
+ s|%USER%|$STACK_USER|g;
+ s|%VIRTUALENV%|$venv_path|g
+ " -i $senlin_apache_conf
}
# init_senlin() - Initialize database
@@ -199,21 +232,37 @@ function cleanup_senlin_dashboard {
function install_senlin {
git_clone $SENLIN_REPO $SENLIN_DIR $SENLIN_BRANCH
setup_develop $SENLIN_DIR
+ if [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ install_apache_wsgi
+ fi
}
# start_senlin() - Start running processes, including screen
function start_senlin {
run_process sl-eng "$SENLIN_BIN_DIR/senlin-engine --config-file=$SENLIN_CONF"
- run_process sl-api "$SENLIN_BIN_DIR/senlin-api --config-file=$SENLIN_CONF"
+
+ local enabled_site_file
+ enabled_site_file=$(apache_site_config_for senlin-api)
+ if [ -f ${enabled_site_file} ] && [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ enable_apache_site senlin-api
+ restart_apache_server
+ tail_log senlin-api /var/log/$APACHE_NAME/senlin-api.log
+ else
+ run_process sl-api "$SENLIN_BIN_DIR/senlin-api --config-file=$SENLIN_CONF"
+ fi
}
# stop_senlin() - Stop running processes
function stop_senlin {
# Kill the screen windows
- local serv
- for serv in sl-eng sl-api; do
- stop_process $serv
- done
+ stop_process sl-eng
+
+ if [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ disable_apache_site senlin-api
+ restart_apache_server
+ else
+ stop_process sl-api
+ fi
}
# create_senlin_accounts() - Set up common required senlin accounts
@@ -225,11 +274,17 @@ function create_senlin_accounts {
local senlin_service=$(get_or_create_service "senlin" \
"clustering" "Senlin Clustering Service")
+ if [ "$SENLIN_USE_MOD_WSGI" == "True" ]; then
+ senlin_api_url="$SERVICE_PROTOCOL://$SENLIN_API_HOST/cluster"
+ else
+ senlin_api_url="$SERVICE_PROTOCOL://$SENLIN_API_HOST:$SENLIN_API_PORT"
+ fi
+
get_or_create_endpoint $senlin_service \
"$REGION_NAME" \
- "$SERVICE_PROTOCOL://$SENLIN_API_HOST:$SENLIN_API_PORT" \
- "$SERVICE_PROTOCOL://$SENLIN_API_HOST:$SENLIN_API_PORT" \
- "$SERVICE_PROTOCOL://$SENLIN_API_HOST:$SENLIN_API_PORT"
+ "$senlin_api_url" \
+ "$senlin_api_url" \
+ "$senlin_api_url"
fi
# get or adds 'service' role to 'senlin' on 'demo' project
diff --git a/doc/source/install.rst b/doc/source/install.rst
index a4138c813..5f362920b 100644
--- a/doc/source/install.rst
+++ b/doc/source/install.rst
@@ -41,6 +41,9 @@ following detailed instructions.
#Enable senlin-dashboard
enable_plugin senlin-dashboard https://git.openstack.org/openstack/senlin-dashboard
+Optionally, you can add a line ``SENLIN_USE_MOD_WSGI=True`` to the same ``local.conf``
+file if you prefer running the Senlin API service under Apache.
+
3. Run ``./stack.sh``::
$ ./stack.sh