Browse code

Handle uwsgi on systemd properly

uwsgi is a different service type under systemd and shouldn't be run as
a standard oneshot type. The uwsgi docs outline a good pattern for
writing systemd unit files:

http://uwsgi-docs.readthedocs.io/en/latest/Systemd.html

This commit takes those suggestions and creates a separate path for
writing uwsgi unit files.

Change-Id: I9b541b86781afdded311dba058cedd783e1a0dfa

Matthew Treinish authored on 2017/03/30 05:47:57
Showing 2 changed files
... ...
@@ -1467,6 +1467,32 @@ function write_user_unit_file {
1467 1467
     $SYSTEMCTL daemon-reload
1468 1468
 }
1469 1469
 
1470
+function write_uwsgi_user_unit_file {
1471
+    local service=$1
1472
+    local command="$2"
1473
+    local group=$3
1474
+    local user=$4
1475
+    local unitfile="$SYSTEMD_DIR/$service"
1476
+    mkdir -p $SYSTEMD_DIR
1477
+
1478
+    iniset -sudo $unitfile "Unit" "Description" "Devstack $service"
1479
+    iniset -sudo $unitfile "Service" "User" "$user"
1480
+    iniset -sudo $unitfile "Service" "ExecStart" "$command"
1481
+    iniset -sudo $unitfile "Service" "Type" "notify"
1482
+    iniset -sudo $unitfile "Service" "KillSignal" "SIGQUIT"
1483
+    iniset -sudo $unitfile "Service" "Restart" "Always"
1484
+    iniset -sudo $unitfile "Service" "NotifyAccess" "all"
1485
+    iniset -sudo $unitfile "Service" "RestartForceExitStatus" "100"
1486
+
1487
+    if [[ -n "$group" ]]; then
1488
+        iniset -sudo $unitfile "Service" "Group" "$group"
1489
+    fi
1490
+    iniset -sudo $unitfile "Install" "WantedBy" "multi-user.target"
1491
+
1492
+    # changes to existing units sometimes need a refresh
1493
+    $SYSTEMCTL daemon-reload
1494
+}
1495
+
1470 1496
 function _run_under_systemd {
1471 1497
     local service=$1
1472 1498
     local command="$2"
... ...
@@ -1474,7 +1500,11 @@ function _run_under_systemd {
1474 1474
     local systemd_service="devstack@$service.service"
1475 1475
     local group=$3
1476 1476
     local user=${4:-$STACK_USER}
1477
-    write_user_unit_file $systemd_service "$cmd" "$group" "$user"
1477
+    if [[ "$command" =~ "uwsgi" ]] ; then
1478
+        write_uwsgi_user_unit_file $systemd_service "$cmd" "$group" "$user"
1479
+    else
1480
+        write_user_unit_file $systemd_service "$cmd" "$group" "$user"
1481
+    fi
1478 1482
 
1479 1483
     $SYSTEMCTL enable $systemd_service
1480 1484
     $SYSTEMCTL start $systemd_service
... ...
@@ -604,8 +604,8 @@ function start_keystone {
604 604
         # TODO(sdague): we should really get down to a single keystone here
605 605
         enable_service key-p
606 606
         enable_service key-a
607
-        run_process key-p "$KEYSTONE_BIN_DIR/uwsgi $KEYSTONE_PUBLIC_UWSGI_FILE" ""
608
-        run_process key-a "$KEYSTONE_BIN_DIR/uwsgi $KEYSTONE_ADMIN_UWSGI_FILE" ""
607
+        run_process key-p "$KEYSTONE_BIN_DIR/uwsgi --ini $KEYSTONE_PUBLIC_UWSGI_FILE" ""
608
+        run_process key-a "$KEYSTONE_BIN_DIR/uwsgi --ini $KEYSTONE_ADMIN_UWSGI_FILE" ""
609 609
     fi
610 610
 
611 611
     echo "Waiting for keystone to start..."
... ...
@@ -638,6 +638,9 @@ function stop_keystone {
638 638
     if [ "$KEYSTONE_DEPLOY" == "mod_wsgi" ]; then
639 639
         disable_apache_site keystone
640 640
         restart_apache_server
641
+    else
642
+        stop_process key-p
643
+        stop_process key-a
641 644
     fi
642 645
     # Kill the Keystone screen window
643 646
     stop_process key