systemd: Always create the systemd unit files

Commit 5edae54 introduced the usage of systemd in Devstack. This allowed
the transition away from 'screen'. Systemd needs "user unit files" to
describe the services. Currently, those unit files get only created when
an openstack service (n-cpu, c-sch, g-api, ...) is in the list of enabled
services (`ENABLED_SERVICES`). This means, when Devstack is fully stacked,
there is no way to start the systemd unit of an openstack service which
is *not* in that list.

This commit changes that behavior, and creates the systemd unit files
independently of the list ENABLED_SERVICES. This means, when Devstack
is fully stacked, I can start a systemd unit of an openstack service which
wasn't in the ENABLED_SERVICES list. This allows more flexible lifecycle
management of openstack services in the gate, which is useful for tests
which test components which are not in the "default configuration" (e.g.
the "nova-serialproxy" service).

The `clean.sh` script purges all traces of systemd user unit files created
by devstack.

Change-Id: I0f7e1ee8723f4de47cbc56b727182f90a2b32bfb
This commit is contained in:
Markus Zoeller 2017-05-31 11:21:22 +02:00 committed by Ian Wienand
parent b3ced44e37
commit 15b0a5f1eb
2 changed files with 24 additions and 6 deletions

View File

@ -125,6 +125,13 @@ if [[ -n "$SCREEN_LOGDIR" ]] && [[ -d "$SCREEN_LOGDIR" ]]; then
sudo rm -rf $SCREEN_LOGDIR sudo rm -rf $SCREEN_LOGDIR
fi fi
# Clean out the sytemd user unit files if systemd was used.
if [[ "$USE_SYSTEMD" = "True" ]]; then
sudo find $SYSTEMD_DIR -type f -name '*devstack@*service' -delete
# Make systemd aware of the deletion.
$SYSTEMCTL daemon-reload
fi
# Clean up venvs # Clean up venvs
DIRS_TO_CLEAN="$WHEELHOUSE ${PROJECT_VENV[@]} .config/openstack" DIRS_TO_CLEAN="$WHEELHOUSE ${PROJECT_VENV[@]} .config/openstack"
rm -rf $DIRS_TO_CLEAN rm -rf $DIRS_TO_CLEAN

View File

@ -1508,8 +1508,13 @@ EOF
} }
# Helper function to build a basic unit file and run it under systemd. # Defines a systemd service which can be enabled and started later on.
function _run_under_systemd { # arg1: The openstack service name ('n-cpu', 'c-sch', ...).
# arg2: The command to start (e.g. path to service binary + config files).
# arg3: The group which owns the process.
# arg4: The user which owns the process.
# Returns: The systemd service name which got defined.
function _define_systemd_service {
local service=$1 local service=$1
local command="$2" local command="$2"
local cmd=$command local cmd=$command
@ -1524,9 +1529,7 @@ function _run_under_systemd {
else else
write_user_unit_file $systemd_service "$cmd" "$group" "$user" write_user_unit_file $systemd_service "$cmd" "$group" "$user"
fi fi
echo $systemd_service
$SYSTEMCTL enable $systemd_service
$SYSTEMCTL start $systemd_service
} }
# Helper to remove the ``*.failure`` files under ``$SERVICE_DIR/$SCREEN_NAME``. # Helper to remove the ``*.failure`` files under ``$SERVICE_DIR/$SCREEN_NAME``.
@ -1567,11 +1570,19 @@ function run_process {
local user=$4 local user=$4
local name=$service local name=$service
local systemd_service
time_start "run_process" time_start "run_process"
# Note we deliberately make all service files, even if the service
# isn't enabled, so it can be enabled by a dev manually on command
# line.
if [[ "$USE_SYSTEMD" = "True" ]]; then
systemd_service=$(_define_systemd_service "$name" "$command" "$group" "$user")
fi
if is_service_enabled $service; then if is_service_enabled $service; then
if [[ "$USE_SYSTEMD" = "True" ]]; then if [[ "$USE_SYSTEMD" = "True" ]]; then
_run_under_systemd "$name" "$command" "$group" "$user" $SYSTEMCTL enable $systemd_service
$SYSTEMCTL start $systemd_service
elif [[ "$USE_SCREEN" = "True" ]]; then elif [[ "$USE_SCREEN" = "True" ]]; then
if [[ "$user" == "root" ]]; then if [[ "$user" == "root" ]]; then
command="sudo $command" command="sudo $command"