devstack/tests/run-process.sh
Chris Dent 2f27a0ed3c Replace screen_it() with run_process() throughout
run_process will use screen if USE_SCREEN=True (the default),
otherwise it will simply start the requested service. Therefore
wherever screen_it used, run_process can be instead.

Where stop_screen was found it has been replaced with stop_process.

A tail_log function has been added which will tail a logfile in a
screen if USE_SCREEN is True.

lib/template has been updated to reflect the use of the new
functions.

When using sg the quoting in run_process gets very complicated.
To get around this run_process and the functions it calls accepts
an optional third argument. If set it is a group to be used with sg.

Change-Id: Ia3843818014f7c6c7526ef3aa9676bbddb8a85ca
2014-09-11 18:59:39 +01:00

110 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
# tests/exec.sh - Test DevStack run_process() and stop_process()
#
# exec.sh start|stop|status
#
# Set USE_SCREEN True|False to change use of screen.
#
# This script emulates the basic exec envirnment in ``stack.sh`` to test
# the process spawn and kill operations.
if [[ -z $1 ]]; then
echo "$0 start|stop"
exit 1
fi
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
source $TOP_DIR/functions
USE_SCREEN=${USE_SCREEN:-False}
ENABLED_SERVICES=fake-service
SERVICE_DIR=/tmp
SCREEN_NAME=test
SCREEN_LOGDIR=${SERVICE_DIR}/${SCREEN_NAME}
# Kill background processes on exit
trap clean EXIT
clean() {
local r=$?
jobs -p
kill >/dev/null 2>&1 $(jobs -p)
exit $r
}
# Exit on any errors so that errors don't compound
trap failed ERR
failed() {
local r=$?
jobs -p
kill >/dev/null 2>&1 $(jobs -p)
set +o xtrace
[ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
exit $r
}
function status {
if [[ -r $SERVICE_DIR/$SCREEN_NAME/fake-service.pid ]]; then
pstree -pg $(cat $SERVICE_DIR/$SCREEN_NAME/fake-service.pid)
fi
ps -ef | grep fake
}
function setup_screen {
if [[ ! -d $SERVICE_DIR/$SCREEN_NAME ]]; then
rm -rf $SERVICE_DIR/$SCREEN_NAME
mkdir -p $SERVICE_DIR/$SCREEN_NAME
fi
if [[ "$USE_SCREEN" == "True" ]]; then
# Create a new named screen to run processes in
screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
sleep 1
# Set a reasonable status bar
if [ -z "$SCREEN_HARDSTATUS" ]; then
SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
fi
screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS"
fi
# Clear screen rc file
SCREENRC=$TOP_DIR/tests/$SCREEN_NAME-screenrc
if [[ -e $SCREENRC ]]; then
echo -n > $SCREENRC
fi
}
# Mimic logging
# Set up output redirection without log files
# Copy stdout to fd 3
exec 3>&1
if [[ "$VERBOSE" != "True" ]]; then
# Throw away stdout and stderr
#exec 1>/dev/null 2>&1
:
fi
# Always send summary fd to original stdout
exec 6>&3
if [[ "$1" == "start" ]]; then
echo "Start service"
setup_screen
run_process fake-service "$TOP_DIR/tests/fake-service.sh"
sleep 1
status
elif [[ "$1" == "stop" ]]; then
echo "Stop service"
stop_process fake-service
status
elif [[ "$1" == "status" ]]; then
status
else
echo "Unknown command"
exit 1
fi