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