Add wsgi module

The wsgi_script feature is being removed because of some changes in
underlying python packaging tooling. This makes heat to vendor the wsgi
module which can be used instead of the wsgi script, according to
the proposed community goal[1]. The existing wsgi scripts are kept now
for smooth transition.

[1] https://review.opendev.org/c/openstack/governance/+/902807

Depends-On: https://review.opendev.org/c/openstack/devstack/+/902758
Change-Id: I4dc92f06610753171215913180ce7cdab15ba047
This commit is contained in:
Takashi Kajinami 2023-12-07 17:16:30 +09:00
parent be1481de61
commit 1292ebb1bf
15 changed files with 86 additions and 20 deletions

View File

@ -39,7 +39,7 @@ GITBRANCH["python-heatclient"]=${HEATCLIENT_BRANCH:-master}
HEAT_USE_APACHE=${HEAT_USE_APACHE:-${HEAT_USE_MOD_WSGI:-True}} HEAT_USE_APACHE=${HEAT_USE_APACHE:-${HEAT_USE_MOD_WSGI:-True}}
HEAT_DIR=$DEST/heat HEAT_DIR=$DEST/heat
HEAT_FILES_DIR=$HEAT_DIR/heat/httpd/files HEAT_HTTPD_VHOST_FILES_DIR=$HEAT_DIR/etc/heat/httpd
HEAT_STANDALONE=$(trueorfalse False HEAT_STANDALONE) HEAT_STANDALONE=$(trueorfalse False HEAT_STANDALONE)
HEAT_ENABLE_ADOPT_ABANDON=$(trueorfalse False HEAT_ENABLE_ADOPT_ABANDON) HEAT_ENABLE_ADOPT_ABANDON=$(trueorfalse False HEAT_ENABLE_ADOPT_ABANDON)
@ -58,8 +58,8 @@ HEAT_TRUSTEE_DOMAIN=${HEAT_TRUSTEE_DOMAIN:-default}
HEAT_BIN_DIR=$(get_python_exec_prefix) HEAT_BIN_DIR=$(get_python_exec_prefix)
HEAT_API_UWSGI_CONF=$HEAT_CONF_DIR/heat-api-uwsgi.ini HEAT_API_UWSGI_CONF=$HEAT_CONF_DIR/heat-api-uwsgi.ini
HEAT_CFN_API_UWSGI_CONF=$HEAT_CONF_DIR/heat-api-cfn-uwsgi.ini HEAT_CFN_API_UWSGI_CONF=$HEAT_CONF_DIR/heat-api-cfn-uwsgi.ini
HEAT_API_UWSGI=$HEAT_BIN_DIR/heat-wsgi-api HEAT_API_UWSGI=heat.wsgi.api:application
HEAT_CFN_API_UWSGI=$HEAT_BIN_DIR/heat-wsgi-api-cfn HEAT_CFN_API_UWSGI=heat.wsgi.cfn:application
# Flag to set the oslo_policy.enforce_scope and oslo_policy.enforce_new_defaults. # Flag to set the oslo_policy.enforce_scope and oslo_policy.enforce_new_defaults.
# This is used to disable the compute API policies scope and new defaults. # This is used to disable the compute API policies scope and new defaults.
@ -159,12 +159,12 @@ function configure_heat {
if [[ "$HEAT_USE_APACHE" == "True" ]]; then if [[ "$HEAT_USE_APACHE" == "True" ]]; then
if [[ $WSGI_MODE == "uwsgi" ]]; then if [[ $WSGI_MODE == "uwsgi" ]]; then
write_uwsgi_config "$HEAT_API_UWSGI_CONF" "$HEAT_API_UWSGI" "/heat-api" write_uwsgi_config "$HEAT_API_UWSGI_CONF" "$HEAT_API_UWSGI" "/heat-api" "" "heat-api"
# configure threads for h-api to avoid IO wait and messaging timeout. We use # configure threads for h-api to avoid IO wait and messaging timeout. We use
# 'nproc/4' to calculate API workers, hence, 4 would be probably correct # 'nproc/4' to calculate API workers, hence, 4 would be probably correct
# approximation. # approximation.
iniset "$HEAT_API_UWSGI_CONF" uwsgi threads 4 iniset "$HEAT_API_UWSGI_CONF" uwsgi threads 4
write_uwsgi_config "$HEAT_CFN_API_UWSGI_CONF" "$HEAT_CFN_API_UWSGI" "/heat-api-cfn" write_uwsgi_config "$HEAT_CFN_API_UWSGI_CONF" "$HEAT_CFN_API_UWSGI" "/heat-api-cfn" "" "heat-api-cfn"
else else
_config_heat_apache_wsgi _config_heat_apache_wsgi
fi fi
@ -368,11 +368,11 @@ function _config_heat_apache_wsgi {
local heat_cfn_api_port=$HEAT_API_CFN_PORT local heat_cfn_api_port=$HEAT_API_CFN_PORT
local venv_path="" local venv_path=""
sudo cp $HEAT_FILES_DIR/heat-api.conf $heat_apache_conf sudo cp $HEAT_HTTPD_VHOST_FILES_DIR/heat-api.conf $heat_apache_conf
sudo sed -e " sudo sed -e "
s|%PUBLICPORT%|$heat_api_port|g; s|%PUBLICPORT%|$heat_api_port|g;
s|%APACHE_NAME%|$APACHE_NAME|g; s|%APACHE_NAME%|$APACHE_NAME|g;
s|%HEAT_BIN_DIR%|$HEAT_BIN_DIR|g; s|%HEAT_DIR%|$HEAT_DIR|g;
s|%API_WORKERS%|$API_WORKERS|g; s|%API_WORKERS%|$API_WORKERS|g;
s|%SSLENGINE%|$heat_ssl|g; s|%SSLENGINE%|$heat_ssl|g;
s|%SSLCERTFILE%|$heat_certfile|g; s|%SSLCERTFILE%|$heat_certfile|g;
@ -381,11 +381,11 @@ function _config_heat_apache_wsgi {
s|%VIRTUALENV%|$venv_path|g s|%VIRTUALENV%|$venv_path|g
" -i $heat_apache_conf " -i $heat_apache_conf
sudo cp $HEAT_FILES_DIR/heat-api-cfn.conf $heat_cfn_apache_conf sudo cp $HEAT_HTTPD_VHOST_FILES_DIR/heat-api-cfn.conf $heat_cfn_apache_conf
sudo sed -e " sudo sed -e "
s|%PUBLICPORT%|$heat_cfn_api_port|g; s|%PUBLICPORT%|$heat_cfn_api_port|g;
s|%APACHE_NAME%|$APACHE_NAME|g; s|%APACHE_NAME%|$APACHE_NAME|g;
s|%HEAT_BIN_DIR%|$HEAT_BIN_DIR|g; s|%HEAT_DIR%|$HEAT_DIR|g;
s|%API_WORKERS%|$API_WORKERS|g; s|%API_WORKERS%|$API_WORKERS|g;
s|%SSLENGINE%|$heat_ssl|g; s|%SSLENGINE%|$heat_ssl|g;
s|%SSLCERTFILE%|$heat_certfile|g; s|%SSLCERTFILE%|$heat_certfile|g;

View File

@ -180,10 +180,10 @@ apidoc_excluded_paths = [
'engine/resources/aws', 'engine/resources/aws',
'engine/resources/openstack', 'engine/resources/openstack',
'hacking', 'hacking',
'httpd',
'locale', 'locale',
'tests', 'tests',
'version.py', 'version.py',
'wsgi',
] ]

View File

@ -3,7 +3,7 @@ Listen %PUBLICPORT%
<VirtualHost *:%PUBLICPORT%> <VirtualHost *:%PUBLICPORT%>
WSGIDaemonProcess heat-api-cfn processes=%API_WORKERS% threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV% WSGIDaemonProcess heat-api-cfn processes=%API_WORKERS% threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
WSGIProcessGroup heat-api-cfn WSGIProcessGroup heat-api-cfn
WSGIScriptAlias / %HEAT_BIN_DIR%/heat-wsgi-api-cfn WSGIScriptAlias / %HEAT_DIR%/cfn/wsgi.py
WSGIApplicationGroup %{GLOBAL} WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On WSGIPassAuthorization On
AllowEncodedSlashes On AllowEncodedSlashes On

View File

@ -3,7 +3,7 @@ Listen %PUBLICPORT%
<VirtualHost *:%PUBLICPORT%> <VirtualHost *:%PUBLICPORT%>
WSGIDaemonProcess heat-api processes=%API_WORKERS% threads=10 user=%USER% display-name=%{GROUP} %VIRTUALENV% WSGIDaemonProcess heat-api processes=%API_WORKERS% threads=10 user=%USER% display-name=%{GROUP} %VIRTUALENV%
WSGIProcessGroup heat-api WSGIProcessGroup heat-api
WSGIScriptAlias / %HEAT_BIN_DIR%/heat-wsgi-api WSGIScriptAlias / %HEAT_DIR%/api/wsgi.py
WSGIApplicationGroup %{GLOBAL} WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On WSGIPassAuthorization On
AllowEncodedSlashes On AllowEncodedSlashes On

View File

@ -11,4 +11,4 @@ die-on-term = true
master = true master = true
processes = 4 processes = 4
http = 127.0.0.1:80998 http = 127.0.0.1:80998
wsgi-file = /usr/local/bin/heat-wsgi-api-cfn module = heat.wsgi.cfn:application

View File

@ -11,4 +11,4 @@ die-on-term = true
master = true master = true
processes = 4 processes = 4
http = 127.0.0.1:80999 http = 127.0.0.1:80999
wsgi-file = /usr/local/bin/heat-wsgi-api module = heat.wsgi.api:application

View File

@ -1,2 +0,0 @@
KeepAlive Off
ProxyPass "/heat-api-cfn" "http://127.0.0.1:80998" retry=0

View File

@ -1,2 +0,0 @@
KeepAlive Off
ProxyPass "/heat-api" "http://127.0.0.1:80999" retry=0

24
heat/wsgi/api.py Normal file
View File

@ -0,0 +1,24 @@
# 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.
"""WSGI application entry-point for the Heat API."""
import threading
from heat.api.openstack import wsgi
application = None
lock = threading.Lock()
with lock:
if application is None:
application = wsgi.init_application()

24
heat/wsgi/cfn.py Normal file
View File

@ -0,0 +1,24 @@
# 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.
"""WSGI application entry-point for the Heat API."""
import threading
from heat.api.cfn import wsgi
application = None
lock = threading.Lock()
with lock:
if application is None:
application = wsgi.init_application()

View File

@ -0,0 +1,22 @@
---
features:
- |
A new module, ``heat.wsgi``, has been added as a place to gather WSGI
``application`` objects. This is intended to ease deployment by providing
a consistent location for these objects. For example, if using uWSGI then
instead of:
.. code-block:: ini
[uwsgi]
wsgi-file = /bin/heat-api
You can now use:
.. code-block:: ini
[uwsgi]
module = heat.wsgi.api:application
This also simplifies deployment with other WSGI servers that expect module
paths such as gunicorn.

View File

@ -43,8 +43,8 @@ console_scripts =
heat-status = heat.cmd.status:main heat-status = heat.cmd.status:main
wsgi_scripts = wsgi_scripts =
heat-wsgi-api = heat.httpd.heat_api:init_application heat-wsgi-api = heat.api.openstack.wsgi:init_application
heat-wsgi-api-cfn = heat.httpd.heat_api_cfn:init_application heat-wsgi-api-cfn = heat.api.cfn.wsgi:init_application
oslo.config.opts = oslo.config.opts =
heat.common.cache = heat.common.cache:list_opts heat.common.cache = heat.common.cache:list_opts