Merge branch 'master' of git.clinicalfuture.com:arvados
[arvados.git] / docker / run.sh
index cea9c0322eee28aecbef8fdaa5dfab830356987c..c8ddabeded7e95114817b59957c89c135633e904 100755 (executable)
@@ -1,14 +1,28 @@
 #!/bin/bash
 
 ENABLE_SSH=false
-DOCKER_ARGS="-d -i -t"
 
 function usage {
-    echo >&2 "usage:"
-    echo >&2 "$0 start [--ssh] [--doc] [--sso] [--api] [--workbench] [--keep]"
+    echo >&2
+    echo >&2 "usage: $0 (start|stop|test) [options]"
+    echo >&2
+    echo >&2 "$0 start options:"
+    echo >&2 "  -d [port], --doc[=port]        Start documentation server (default port 9898)"
+    echo >&2 "  -w [port], --workbench[=port]  Start workbench server (default port 9899)"
+    echo >&2 "  -s [port], --sso[=port]        Start SSO server (default port 9901)"
+    echo >&2 "  -a [port], --api[=port]        Start API server (default port 9900)"
+    echo >&2 "  -k, --keep                     Start Keep servers"
+    echo >&2 "  --ssh                          Enable SSH access to server containers"
+    echo >&2 "  -h, --help                     Display this help and exit"
+    echo >&2
+    echo >&2 "  If no switches are given, the default is to start all"
+    echo >&2 "  servers on the default ports."
+    echo >&2
     echo >&2 "$0 stop"
-    echo >&2 "$0 test"
-    echo >&2 "If no switches are given, the default is to start all servers."
+    echo >&2 "  Stop all servers."
+    echo >&2
+    echo >&2 "$0 test [testname] [testname] ..."
+    echo >&2 "  By default, all tests are run."
 }
 
 function ip_address {
@@ -17,24 +31,28 @@ function ip_address {
 }
 
 function start_container {
-    local port="-p $1"
+    local args="-d -i -t"
+    if [[ "$1" != '' ]]; then
+      local port="$1"
+      args="$args -p $port"
+    fi
     if [[ "$2" != '' ]]; then
       local name="$2"
-      DOCKER_ARGS="$DOCKER_ARGS -name $name"
+      args="$args -name $name"
     fi
     if [[ "$3" != '' ]]; then
       local volume="$3"
-      DOCKER_ARGS="$DOCKER_ARGS -v $volume"
+      args="$args -v $volume"
     fi
     if [[ "$4" != '' ]]; then
       local link="$4"
-      DOCKER_ARGS="$DOCKER_ARGS -link $link"
+      args="$args -link $link"
     fi
     local image=$5
 
     if $ENABLE_SSH
     then
-      DOCKER_ARGS="$DOCKER_ARGS -e ENABLE_SSH=$ENABLE_SSH"
+      args="$args -e ENABLE_SSH=$ENABLE_SSH"
     fi
 
     `docker ps |grep -P "$name[^/]" -q`
@@ -43,12 +61,12 @@ function start_container {
       return
     fi
 
-    # If a container by this name already exists, remove it before
-    # starting a new one.
-    
+    # Remove any existing container by this name.
+    docker rm "$name" 2>/dev/null
+
     echo "Starting container:"
-    echo "  docker run $DOCKER_ARGS $image"
-    container=`docker run $DOCKER_ARGS $image`
+    echo "  docker run $args $image"
+    container=`docker run $args $image`
     if [[ "$?" != "0" ]]; then
       echo "Unable to start container"
       exit 1
@@ -96,59 +114,119 @@ function do_start {
     local start_workbench=false
     local start_keep=false
 
+    # NOTE: This requires GNU getopt (part of the util-linux package on Debian-based distros).
+    local TEMP=`getopt -o d::s::a::w::kh \
+                  --long doc::,sso::,api::,workbench::,keep,help,ssh \
+                  -n "$0" -- "$@"`
+
+    if [ $? != 0 ] ; then echo "Use -h for help"; exit 1 ; fi
+
+    # Note the quotes around `$TEMP': they are essential!
+    eval set -- "$TEMP"
+
     while [ $# -ge 1 ]
     do
         case $1 in
-           --doc)
-               start_doc=true
+           -d | --doc)
+               case "$2" in
+                   "") start_doc=9898; shift 2 ;;
+                   *)  start_doc=$2; shift 2 ;;
+               esac
                ;;
-           --sso)
-               start_sso=true
+           -s | --sso)
+               case "$2" in
+                   "") start_sso=9901; shift 2 ;;
+                   *)  start_sso=$2; shift 2 ;;
+               esac
                ;;
-           --api)
-               start_api=true
+           -a | --api)
+               case "$2" in
+                   "") start_api=9900; shift 2 ;;
+                   *)  start_api=$2; shift 2 ;;
+               esac
                ;;
-           --workbench)
-               start_workbench=true
+           -w | --workbench)
+               case "$2" in
+                   "") start_workbench=9899; shift 2 ;;
+                   *)  start_workbench=$2; shift 2 ;;
+               esac
                ;;
-           --keep)
+           -k | --keep )
                start_keep=true
+               shift
                ;;
            --ssh)
+               # ENABLE_SSH is a global variable
                ENABLE_SSH=true
+               shift
+               ;;
+           --)
+               shift
+               break
                ;;
            *)
                usage
                exit 1
                ;;
        esac
-       shift
     done
 
     # If no options were selected, then start all servers.
-    if $start_doc || $start_sso || $start_api || $start_workbench || $start_keep
+    if [[ $start_doc == false &&
+         $start_sso == false &&
+         $start_api == false &&
+         $start_workbench == false &&
+         $start_keep == false ]]
     then
-      :
-    else
-      start_doc=true
-      start_sso=true
-      start_api=true
-      start_workbench=true
-      start_keep=true
+       start_doc=9898
+       start_sso=9901
+       start_api=9900
+       start_workbench=9899
+       start_keep=true
+    fi
+
+    if [[ $start_doc != false ]]
+    then
+       start_container "9898:80" "doc_server" '' '' "arvados/doc"
+    fi
+
+    if [[ $start_sso != false ]]
+    then
+       start_container "9901:443" "sso_server" '' '' "arvados/sso"
+    fi
+
+    if [[ $start_api != false ]]
+    then
+       start_container "9900:443" "api_server" '' "sso_server:sso" "arvados/api"
     fi
 
-    $start_doc && start_container "9898:80" "doc_server" '' '' "arvados/doc"
-    $start_sso && start_container "9901:443" "sso_server" '' '' "arvados/sso"
-    $start_api && start_container "9900:443" "api_server" '' "sso_server:sso" "arvados/api"
-    $start_workbench && start_container "9899:80" "workbench_server" '' "api_server:api" "arvados/workbench"
+    if [[ $start_workbench != false ]]
+    then
+       start_container "9899:80" "workbench_server" '' "api_server:api" "arvados/workbench"
+    fi
 
-    make_keep_volumes
-    $start_keep && start_container "25107:25107" "keep_server_0" "${keep_volumes[0]}:/dev/keep-0" "api_server:api" "arvados/warehouse"
-    $start_keep && start_container "25108:25107" "keep_server_1" "${keep_volumes[1]}:/dev/keep-0" "api_server:api" "arvados/warehouse"
+    if [[ $start_keep != false ]]
+    then
+       # create `keep_volumes' array with a list of keep mount points
+       # remove any stale metadata from those volumes before starting them
+       make_keep_volumes
+       for v in ${keep_volumes[*]}
+       do
+           [ -f $v/keep/.metadata.yml ] && sudo rm $v/keep/.metadata.yml
+       done
+       start_container "25107:25107" "keep_server_0" \
+           "${keep_volumes[0]}:/dev/keep-0" \
+           "api_server:api" \
+           "arvados/warehouse"
+       start_container "25108:25107" "keep_server_1" \
+           "${keep_volumes[1]}:/dev/keep-0" \
+           "api_server:api" \
+           "arvados/warehouse"
+    fi
 
     ARVADOS_API_HOST=$(ip_address "api_server")
     ARVADOS_API_HOST_INSECURE=yes
-    ARVADOS_API_TOKEN=$(grep '^\w' api/generated/secret_token.rb | cut -d "'" -f 2)
+    ARVADOS_API_TOKEN=$(cat api/generated/superuser_token)
 
     echo "To run a test suite:"
     echo "export ARVADOS_API_HOST=$ARVADOS_API_HOST"
@@ -157,6 +235,46 @@ function do_start {
     echo "python -m unittest discover ../sdk/python"
 }
 
+function do_stop {
+    docker stop doc_server \
+       api_server \
+       sso_server \
+       workbench_server \
+       keep_server_0 \
+       keep_server_1 2>/dev/null
+}
+
+function do_test {
+    local alltests
+    if [ $# -lt 1 ]
+    then
+       alltests="python-sdk api"
+    else
+       alltests="$@"
+    fi
+
+    for testname in $alltests
+    do
+       echo "testing $testname..."
+       case $testname in
+           python-sdk)
+               do_start --api --keep --sso
+               export ARVADOS_API_HOST=$(ip_address "api_server")
+               export ARVADOS_API_HOST_INSECURE=yes
+               export ARVADOS_API_TOKEN=$(cat api/generated/superuser_token)
+               python -m unittest discover ../sdk/python
+               ;;
+           api)
+               docker run -t -i arvados/api \
+                   /usr/src/arvados/services/api/script/rake_test.sh
+               ;;
+           *)
+               echo >&2 "unknown test $testname"
+               ;;
+       esac
+    done
+}
+
 if [ $# -lt 1 ]
 then
   usage
@@ -168,6 +286,14 @@ case $1 in
        shift
        do_start $@
        ;;
+    stop)
+       shift
+       do_stop $@
+       ;;
+    test)
+       shift
+       do_test $@
+       ;;
     *)
        usage
        exit 1