X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c208f8066094c1804b2599dce08e8704b9983d8a..c9b7cc4f504a879feb89df28a5f651e32839048a:/docker/run.sh diff --git a/docker/run.sh b/docker/run.sh index 418771553a..c8ddabeded 100755 --- a/docker/run.sh +++ b/docker/run.sh @@ -1,99 +1,85 @@ #!/bin/bash +ENABLE_SSH=false + function usage { - echo >&2 "usage: $0 [--doc] [--sso] [--api] [--workbench] [--keep]" - echo >&2 "If no switches are given, the default is to start all servers." + 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 " Stop all servers." + echo >&2 + echo >&2 "$0 test [testname] [testname] ..." + echo >&2 " By default, all tests are run." } -if [[ "$ENABLE_SSH" != "" ]]; then - EXTRA=" -e ENABLE_SSH=$ENABLE_SSH" -else - EXTRA='' -fi - -start_doc=false -start_sso=false -start_api=false -start_workbench=false -start_keep=false - -while [ $# -ge 1 ] -do - case $1 in - --doc) - start_doc=true - ;; - --sso) - start_sso=true - ;; - --api) - start_api=true - ;; - --workbench) - start_workbench=true - ;; - --keep) - start_keep=true - ;; - *) - 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 -then - : -else - start_doc=true - start_sso=true - start_api=true - start_workbench=true - start_keep=true -fi - function ip_address { - local container=$1 - echo `docker inspect $container |grep IPAddress |cut -f4 -d\"` + local container=$1 + echo `docker inspect $container |grep IPAddress |cut -f4 -d\"` } function start_container { - local port="-p $1" - if [[ "$2" != '' ]]; then - local name="-name $2" - fi - if [[ "$3" != '' ]]; then - local volume="-v $3" - fi - if [[ "$4" != '' ]]; then - local link="-link $4" - fi - local image=$5 - - `docker ps |grep -P "$2[^/]" -q` - if [[ "$?" == "0" ]]; then - echo "You have a running container with name $2 -- skipping." - return - fi - - echo "Starting container:" - echo " docker run -d -i -t$EXTRA $port $name $volume $link $image" - container=`docker run -d -i -t$EXTRA $port $name $volume $link $image` - if [[ "$?" != "0" ]]; then - echo "Unable to start container" - exit 1 - fi - if [[ $EXTRA ]]; then - ip=$(ip_address $container ) - echo - echo "You can ssh into the container with:" - echo - echo " ssh root@$ip" - echo - fi + local args="-d -i -t" + if [[ "$1" != '' ]]; then + local port="$1" + args="$args -p $port" + fi + if [[ "$2" != '' ]]; then + local name="$2" + args="$args -name $name" + fi + if [[ "$3" != '' ]]; then + local volume="$3" + args="$args -v $volume" + fi + if [[ "$4" != '' ]]; then + local link="$4" + args="$args -link $link" + fi + local image=$5 + + if $ENABLE_SSH + then + args="$args -e ENABLE_SSH=$ENABLE_SSH" + fi + + `docker ps |grep -P "$name[^/]" -q` + if [[ "$?" == "0" ]]; then + echo "You have a running container with name $name -- skipping." + return + fi + + # Remove any existing container by this name. + docker rm "$name" 2>/dev/null + + echo "Starting container:" + echo " docker run $args $image" + container=`docker run $args $image` + if [[ "$?" != "0" ]]; then + echo "Unable to start container" + exit 1 + fi + if $ENABLE_SSH + then + ip=$(ip_address $container ) + echo + echo "You can ssh into the container with:" + echo + echo " ssh root@$ip" + echo + fi } declare -a keep_volumes @@ -103,41 +89,213 @@ declare -a keep_volumes # directory), use them; create temporary volumes if necessary. # function make_keep_volumes () { - # Mount a keep volume if we don't already have one - for mountpoint in $(cut -d ' ' -f 2 /proc/mounts); do - if [[ -d "$mountpoint/keep" && "$mountpoint" != "/" ]]; then - keep_volumes+=($mountpoint) + # Mount a keep volume if we don't already have one + for mountpoint in $(cut -d ' ' -f 2 /proc/mounts); do + if [[ -d "$mountpoint/keep" && "$mountpoint" != "/" ]]; then + keep_volumes+=($mountpoint) + fi + done + + # Create any keep volumes that do not yet exist. + while [ ${#keep_volumes[*]} -lt 2 ] + do + new_keep=$(mktemp -d) + echo >&2 "mounting 512M tmpfs keep volume in $new_keep" + sudo mount -t tmpfs -o size=512M tmpfs $new_keep + mkdir $new_keep/keep + keep_volumes+=($new_keep) + done +} + +function do_start { + local start_doc=false + local start_sso=false + local start_api=false + 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 + -d | --doc) + case "$2" in + "") start_doc=9898; shift 2 ;; + *) start_doc=$2; shift 2 ;; + esac + ;; + -s | --sso) + case "$2" in + "") start_sso=9901; shift 2 ;; + *) start_sso=$2; shift 2 ;; + esac + ;; + -a | --api) + case "$2" in + "") start_api=9900; shift 2 ;; + *) start_api=$2; shift 2 ;; + esac + ;; + -w | --workbench) + case "$2" in + "") start_workbench=9899; shift 2 ;; + *) start_workbench=$2; shift 2 ;; + esac + ;; + -k | --keep ) + start_keep=true + shift + ;; + --ssh) + # ENABLE_SSH is a global variable + ENABLE_SSH=true + shift + ;; + --) + shift + break + ;; + *) + usage + exit 1 + ;; + esac + done + + # If no options were selected, then start all servers. + if [[ $start_doc == false && + $start_sso == false && + $start_api == false && + $start_workbench == false && + $start_keep == false ]] + then + 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 + + if [[ $start_workbench != false ]] + then + start_container "9899:80" "workbench_server" '' "api_server:api" "arvados/workbench" + fi + + 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 - done - - # Create any keep volumes that do not yet exist. - while [ ${#keep_volumes[*]} -lt 2 ] - do - new_keep=$(mktemp -d) - echo >&2 "mounting 512M tmpfs keep volume in $new_keep" - sudo mount -t tmpfs -o size=512M tmpfs $new_keep - mkdir $new_keep/keep - keep_volumes+=($new_keep) - done + + ARVADOS_API_HOST=$(ip_address "api_server") + ARVADOS_API_HOST_INSECURE=yes + ARVADOS_API_TOKEN=$(cat api/generated/superuser_token) + + echo "To run a test suite:" + echo "export ARVADOS_API_HOST=$ARVADOS_API_HOST" + echo "export ARVADOS_API_HOST_INSECURE=$ARVADOS_API_HOST_INSECURE" + echo "export ARVADOS_API_TOKEN=$ARVADOS_API_TOKEN" + echo "python -m unittest discover ../sdk/python" } -$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" +function do_stop { + docker stop doc_server \ + api_server \ + sso_server \ + workbench_server \ + keep_server_0 \ + keep_server_1 2>/dev/null +} -declare -a keep_volumes -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" +function do_test { + local alltests + if [ $# -lt 1 ] + then + alltests="python-sdk api" + else + alltests="$@" + 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) + 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 +} -echo "To run a test suite:" +if [ $# -lt 1 ] +then + usage + exit 1 +fi -echo "export ARVADOS_API_HOST=$ARVADOS_API_HOST" -echo "export ARVADOS_API_HOST_INSECURE=$ARVADOS_API_HOST_INSECURE" -echo "export ARVADOS_API_TOKEN=$ARVADOS_API_TOKEN" -echo "python -m unittest discover ../sdk/python" +case $1 in + start) + shift + do_start $@ + ;; + stop) + shift + do_stop $@ + ;; + test) + shift + do_test $@ + ;; + *) + usage + exit 1 + ;; +esac