Browse code

Add toggle to run Nova API and EC2-API under Apache2

Inspired by keystone and rcbops-cookbooks's nova scripts,
this review adds apache2 templates for two of the Nova
services. Also add code in lib/nova to switch between
the old and new ways to these two services. The patch
depends on the Nova review mentioned below as the two
scripts that are needed will be in Nova's repository.

TODO for later would be to switch on NOVA_USE_MOD_WSGI
when ENABLE_HTTPD_MOD_WSGI_SERVICES is switched on.

Related Nova blueprint:
https://blueprints.launchpad.net/nova/+spec/run-nova-services-under-apache2

Depends-On: Idd7d3d1b3cc5770cdecea7afe6db3c89d5b2c0d0
Change-Id: I9fc0c601db2776d3e9084be84065e728e3f5d414

Davanum Srinivas authored on 2015/05/01 10:10:48
Showing 4 changed files
... ...
@@ -149,6 +149,10 @@ Example (Keystone):
149 149
 
150 150
     KEYSTONE_USE_MOD_WSGI="True"
151 151
 
152
+Example (Nova):
153
+
154
+    NOVA_USE_MOD_WSGI="True"
155
+
152 156
 Example (Swift):
153 157
 
154 158
     SWIFT_USE_MOD_WSGI="True"
155 159
new file mode 100644
... ...
@@ -0,0 +1,16 @@
0
+Listen %PUBLICPORT%
1
+
2
+<VirtualHost *:%PUBLICPORT%>
3
+    WSGIDaemonProcess nova-api processes=5 threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
4
+    WSGIProcessGroup nova-api
5
+    WSGIScriptAlias / %PUBLICWSGI%
6
+    WSGIApplicationGroup %{GLOBAL}
7
+    WSGIPassAuthorization On
8
+    <IfVersion >= 2.4>
9
+      ErrorLogFormat "%{cu}t %M"
10
+    </IfVersion>
11
+    ErrorLog /var/log/%APACHE_NAME%/nova-api.log
12
+    %SSLENGINE%
13
+    %SSLCERTFILE%
14
+    %SSLKEYFILE%
15
+</VirtualHost>
0 16
\ No newline at end of file
1 17
new file mode 100644
... ...
@@ -0,0 +1,16 @@
0
+Listen %PUBLICPORT%
1
+
2
+<VirtualHost *:%PUBLICPORT%>
3
+    WSGIDaemonProcess nova-ec2-api processes=5 threads=1 user=%USER% display-name=%{GROUP} %VIRTUALENV%
4
+    WSGIProcessGroup nova-ec2-api
5
+    WSGIScriptAlias / %PUBLICWSGI%
6
+    WSGIApplicationGroup %{GLOBAL}
7
+    WSGIPassAuthorization On
8
+    <IfVersion >= 2.4>
9
+      ErrorLogFormat "%{cu}t %M"
10
+    </IfVersion>
11
+    ErrorLog /var/log/%APACHE_NAME%/nova-ec2-api.log
12
+    %SSLENGINE%
13
+    %SSLCERTFILE%
14
+    %SSLKEYFILE%
15
+</VirtualHost>
0 16
\ No newline at end of file
... ...
@@ -16,6 +16,7 @@
16 16
 #
17 17
 # - install_nova
18 18
 # - configure_nova
19
+# - _config_nova_apache_wsgi
19 20
 # - create_nova_conf
20 21
 # - init_nova
21 22
 # - start_nova
... ...
@@ -62,6 +63,15 @@ NOVA_API_PASTE_INI=${NOVA_API_PASTE_INI:-$NOVA_CONF_DIR/api-paste.ini}
62 62
 # Expect to remove in L or M.
63 63
 NOVA_API_VERSION=${NOVA_API_VERSION-default}
64 64
 
65
+if is_suse; then
66
+    NOVA_WSGI_DIR=${NOVA_WSGI_DIR:-/srv/www/htdocs/nova}
67
+else
68
+    NOVA_WSGI_DIR=${NOVA_WSGI_DIR:-/var/www/nova}
69
+fi
70
+
71
+# Toggle for deploying Nova-API under HTTPD + mod_wsgi
72
+NOVA_USE_MOD_WSGI=${NOVA_USE_MOD_WSGI:-False}
73
+
65 74
 if is_ssl_enabled_service "nova" || is_service_enabled tls-proxy; then
66 75
     NOVA_SERVICE_PROTOCOL="https"
67 76
     EC2_SERVICE_PROTOCOL="https"
... ...
@@ -223,6 +233,64 @@ function cleanup_nova {
223 223
     #fi
224 224
 }
225 225
 
226
+# _cleanup_nova_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
227
+function _cleanup_nova_apache_wsgi {
228
+    sudo rm -f $NOVA_WSGI_DIR/*
229
+    sudo rm -f $(apache_site_config_for nova-api)
230
+    sudo rm -f $(apache_site_config_for nova-ec2-api)
231
+}
232
+
233
+# _config_nova_apache_wsgi() - Set WSGI config files of Keystone
234
+function _config_nova_apache_wsgi {
235
+    sudo mkdir -p $NOVA_WSGI_DIR
236
+
237
+    local nova_apache_conf=$(apache_site_config_for nova-api)
238
+    local nova_ec2_apache_conf=$(apache_site_config_for nova-ec2-api)
239
+    local nova_ssl=""
240
+    local nova_certfile=""
241
+    local nova_keyfile=""
242
+    local nova_api_port=$NOVA_SERVICE_PORT
243
+    local nova_ec2_api_port=$EC2_SERVICE_PORT
244
+    local venv_path=""
245
+
246
+    if is_ssl_enabled_service nova-api; then
247
+        nova_ssl="SSLEngine On"
248
+        nova_certfile="SSLCertificateFile $NOVA_SSL_CERT"
249
+        nova_keyfile="SSLCertificateKeyFile $NOVA_SSL_KEY"
250
+    fi
251
+    if [[ ${USE_VENV} = True ]]; then
252
+        venv_path="python-path=${PROJECT_VENV["nova"]}/lib/python2.7/site-packages"
253
+    fi
254
+
255
+    # copy proxy vhost and wsgi helper files
256
+    sudo cp $NOVA_DIR/nova/wsgi/nova-api.py $NOVA_WSGI_DIR/nova-api
257
+    sudo cp $NOVA_DIR/nova/wsgi/nova-ec2-api.py $NOVA_WSGI_DIR/nova-ec2-api
258
+
259
+    sudo cp $FILES/apache-nova-api.template $nova_apache_conf
260
+    sudo sed -e "
261
+        s|%PUBLICPORT%|$nova_api_port|g;
262
+        s|%APACHE_NAME%|$APACHE_NAME|g;
263
+        s|%PUBLICWSGI%|$NOVA_WSGI_DIR/nova-api|g;
264
+        s|%SSLENGINE%|$nova_ssl|g;
265
+        s|%SSLCERTFILE%|$nova_certfile|g;
266
+        s|%SSLKEYFILE%|$nova_keyfile|g;
267
+        s|%USER%|$STACK_USER|g;
268
+        s|%VIRTUALENV%|$venv_path|g
269
+    " -i $nova_apache_conf
270
+
271
+    sudo cp $FILES/apache-nova-ec2-api.template $nova_ec2_apache_conf
272
+    sudo sed -e "
273
+        s|%PUBLICPORT%|$nova_ec2_api_port|g;
274
+        s|%APACHE_NAME%|$APACHE_NAME|g;
275
+        s|%PUBLICWSGI%|$NOVA_WSGI_DIR/nova-ec2-api|g;
276
+        s|%SSLENGINE%|$nova_ssl|g;
277
+        s|%SSLCERTFILE%|$nova_certfile|g;
278
+        s|%SSLKEYFILE%|$nova_keyfile|g;
279
+        s|%USER%|$STACK_USER|g;
280
+        s|%VIRTUALENV%|$venv_path|g
281
+    " -i $nova_ec2_apache_conf
282
+}
283
+
226 284
 # configure_nova() - Set config files, create data dirs, etc
227 285
 function configure_nova {
228 286
     # Put config files in ``/etc/nova`` for everyone to find
... ...
@@ -453,12 +521,16 @@ function create_nova_conf {
453 453
         iniset $NOVA_CONF DEFAULT force_config_drive "$FORCE_CONFIG_DRIVE"
454 454
     fi
455 455
     # Format logging
456
-    if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
456
+    if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ] && [ "$NOVA_USE_MOD_WSGI" == "False" ]  ; then
457 457
         setup_colorized_logging $NOVA_CONF DEFAULT
458 458
     else
459 459
         # Show user_name and project_name instead of user_id and project_id
460 460
         iniset $NOVA_CONF DEFAULT logging_context_format_string "%(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s %(user_name)s %(project_name)s] %(instance)s%(message)s"
461 461
     fi
462
+    if [ "$NOVA_USE_MOD_WSGI" == "True" ]; then
463
+        _config_nova_apache_wsgi
464
+    fi
465
+
462 466
     if is_service_enabled ceilometer; then
463 467
         iniset $NOVA_CONF DEFAULT instance_usage_audit "True"
464 468
         iniset $NOVA_CONF DEFAULT instance_usage_audit_period "hour"
... ...
@@ -655,6 +727,13 @@ function install_nova {
655 655
     git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH
656 656
     setup_develop $NOVA_DIR
657 657
     sudo install -D -m 0644 -o $STACK_USER {$NOVA_DIR/tools/,/etc/bash_completion.d/}nova-manage.bash_completion
658
+
659
+    if [ "$NOVA_USE_MOD_WSGI" == "True" ]; then
660
+        install_apache_wsgi
661
+        if is_ssl_enabled_service "nova-api"; then
662
+            enable_mod_ssl
663
+        fi
664
+    fi
658 665
 }
659 666
 
660 667
 # start_nova_api() - Start the API process ahead of other things
... ...
@@ -671,7 +750,18 @@ function start_nova_api {
671 671
     local old_path=$PATH
672 672
     export PATH=$NOVA_BIN_DIR:$PATH
673 673
 
674
-    run_process n-api "$NOVA_BIN_DIR/nova-api"
674
+    # If the site is not enabled then we are in a grenade scenario
675
+    local enabled_site_file=$(apache_site_config_for nova-api)
676
+    if [ -f ${enabled_site_file} ] && [ "$NOVA_USE_MOD_WSGI" == "True" ]; then
677
+        enable_apache_site nova-api
678
+        enable_apache_site nova-ec2-api
679
+        restart_apache_server
680
+        tail_log nova /var/log/$APACHE_NAME/nova-api.log
681
+        tail_log nova /var/log/$APACHE_NAME/nova-ec2-api.log
682
+    else
683
+        run_process n-api "$NOVA_BIN_DIR/nova-api"
684
+    fi
685
+
675 686
     echo "Waiting for nova-api to start..."
676 687
     if ! wait_for_service $SERVICE_TIMEOUT $service_protocol://$SERVICE_HOST:$service_port; then
677 688
         die $LINENO "nova-api did not start"
... ...
@@ -780,6 +870,13 @@ function stop_nova_compute {
780 780
 }
781 781
 
782 782
 function stop_nova_rest {
783
+    if [ "$NOVA_USE_MOD_WSGI" == "True" ]; then
784
+        disable_apache_site nova-api
785
+        disable_apache_site nova-ec2-api
786
+        restart_apache_server
787
+    else
788
+        stop_process n-api
789
+    fi
783 790
     # Kill the nova screen windows
784 791
     # Some services are listed here twice since more than one instance
785 792
     # of a service may be running in certain configs.