| #!/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 |