From 651cb1ad758866a87b947c4e50b4ec995072d6ca Mon Sep 17 00:00:00 2001 From: Anton Arefiev Date: Tue, 1 Sep 2015 10:55:20 +0300 Subject: [PATCH] Add toggle to run Cinder API under Apache This change adds apache templates for Cinder API services. Also add possibility to switch between the old and new ways to setup Cinder API. Related Cinder blueprint: https://blueprints.launchpad.net/cinder/+spec/non-eventlet-wsgi-app Change-Id: Icfad40ee6998296727a95613199e5c2d87bd0a45 Depends-On: Ifbab059001d1567b1f7b394c0411a9ca4629f846 Co-Authored-By: Ivan Kolodyazhny --- doc/source/configuration.rst | 6 +++ files/apache-cinder-api.template | 26 +++++++++++ lib/cinder | 80 +++++++++++++++++++++++++++++--- 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 files/apache-cinder-api.template diff --git a/doc/source/configuration.rst b/doc/source/configuration.rst index e8de7c4f70..7ca82c7fd1 100644 --- a/doc/source/configuration.rst +++ b/doc/source/configuration.rst @@ -298,6 +298,12 @@ Example (Swift): SWIFT_USE_MOD_WSGI="True" +Example (Cinder): + +:: + + CINDER_USE_MOD_WSGI="True" + Libraries from Git ------------------ diff --git a/files/apache-cinder-api.template b/files/apache-cinder-api.template new file mode 100644 index 0000000000..e1246f11b6 --- /dev/null +++ b/files/apache-cinder-api.template @@ -0,0 +1,26 @@ +Listen %PUBLICPORT% + + + WSGIDaemonProcess osapi_volume processes=%APIWORKERS% threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV% + WSGIProcessGroup osapi_volume + WSGIScriptAlias / %CINDER_BIN_DIR%/cinder-wsgi + WSGIApplicationGroup %{GLOBAL} + WSGIPassAuthorization On + = 2.4> + ErrorLogFormat "%{cu}t %M" + + ErrorLog /var/log/%APACHE_NAME%/c-api.log + %SSLENGINE% + %SSLCERTFILE% + %SSLKEYFILE% + + + = 2.4> + Require all granted + + + Order allow,deny + Allow from all + + + diff --git a/lib/cinder b/lib/cinder index 26277ccaba..10144117ec 100644 --- a/lib/cinder +++ b/lib/cinder @@ -108,6 +108,8 @@ CINDER_PERIODIC_INTERVAL=${CINDER_PERIODIC_INTERVAL:-60} CINDER_ISCSI_HELPER=${CINDER_ISCSI_HELPER:-tgtadm} +# Toggle for deploying Cinder under HTTPD + mod_wsgi +CINDER_USE_MOD_WSGI=${CINDER_USE_MOD_WSGI:-False} # Source the enabled backends if is_service_enabled c-vol && [[ -n "$CINDER_ENABLED_BACKENDS" ]]; then @@ -137,6 +139,11 @@ function is_cinder_enabled { return 1 } +# _cinder_cleanup_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file +function _cinder_cleanup_apache_wsgi { + sudo rm -f $(apache_site_config_for osapi-volume) +} + # cleanup_cinder() - Remove residual data files, anything left over from previous # runs that a clean run would need to clean up function cleanup_cinder { @@ -183,6 +190,43 @@ function cleanup_cinder { fi done fi + + if [ "$CINDER_USE_MOD_WSGI" == "True" ]; then + _cinder_cleanup_apache_wsgi + fi +} + +# _cinder_config_apache_wsgi() - Set WSGI config files +function _cinder_config_apache_wsgi { + local cinder_apache_conf=$(apache_site_config_for osapi-volume) + local cinder_ssl="" + local cinder_certfile="" + local cinder_keyfile="" + local cinder_api_port=$CINDER_SERVICE_PORT + local venv_path="" + + if is_ssl_enabled_service c-api; then + cinder_ssl="SSLEngine On" + cinder_certfile="SSLCertificateFile $CINDER_SSL_CERT" + cinder_keyfile="SSLCertificateKeyFile $CINDER_SSL_KEY" + fi + if [[ ${USE_VENV} = True ]]; then + venv_path="python-path=${PROJECT_VENV["cinder"]}/lib/python2.7/site-packages" + fi + + # copy proxy vhost file + sudo cp $FILES/apache-cinder-api.template $cinder_apache_conf + sudo sed -e " + s|%PUBLICPORT%|$cinder_api_port|g; + s|%APACHE_NAME%|$APACHE_NAME|g; + s|%APIWORKERS%|$API_WORKERS|g + s|%CINDER_BIN_DIR%|$CINDER_BIN_DIR|g; + s|%SSLENGINE%|$cinder_ssl|g; + s|%SSLCERTFILE%|$cinder_certfile|g; + s|%SSLKEYFILE%|$cinder_keyfile|g; + s|%USER%|$STACK_USER|g; + s|%VIRTUALENV%|$venv_path|g + " -i $cinder_apache_conf } # configure_cinder() - Set config files, create data dirs, etc @@ -276,13 +320,17 @@ function configure_cinder { fi # Format logging - if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then + if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$CINDER_USE_MOD_WSGI" == "False" ]; then setup_colorized_logging $CINDER_CONF DEFAULT "project_id" "user_id" else # Set req-id, project-name and resource in log format iniset $CINDER_CONF DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(project_name)s] %(resource)s%(message)s" fi + if [ "$CINDER_USE_MOD_WSGI" == "True" ]; then + _cinder_config_apache_wsgi + fi + if [[ -r $CINDER_PLUGINS/$CINDER_DRIVER ]]; then configure_cinder_driver fi @@ -399,6 +447,13 @@ function install_cinder { install_package tgt fi fi + + if [ "$CINDER_USE_MOD_WSGI" == "True" ]; then + install_apache_wsgi + if is_ssl_enabled_service "c-api"; then + enable_mod_ssl + fi + fi } # install_cinderclient() - Collect source and prepare @@ -446,10 +501,16 @@ function start_cinder { fi fi - run_process c-api "$CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF" - echo "Waiting for Cinder API to start..." - if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$CINDER_SERVICE_HOST:$service_port; then - die $LINENO "c-api did not start" + if [ "$CINDER_USE_MOD_WSGI" == "True" ]; then + enable_apache_site osapi-volume + restart_apache_server + tail_log c-api /var/log/$APACHE_NAME/c-api.log + else + run_process c-api "$CINDER_BIN_DIR/cinder-api --config-file $CINDER_CONF" + echo "Waiting for Cinder API to start..." + if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$CINDER_SERVICE_HOST:$service_port; then + die $LINENO "c-api did not start" + fi fi run_process c-sch "$CINDER_BIN_DIR/cinder-scheduler --config-file $CINDER_CONF" @@ -468,9 +529,16 @@ function start_cinder { # stop_cinder() - Stop running processes function stop_cinder { + if [ "$CINDER_USE_MOD_WSGI" == "True" ]; then + disable_apache_site osapi-volume + restart_apache_server + else + stop_process c-api + fi + # Kill the cinder screen windows local serv - for serv in c-api c-bak c-sch c-vol; do + for serv in c-bak c-sch c-vol; do stop_process $serv done }