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