Use some helpful HTTP status codes, not just generic 422.
[arvados.git] / docker / run.sh
index 9aaba361848afa541ebebd0c0db2309f91c8bd7c..bfcd2047181b019f9a97110cc60a833954f2b750 100755 (executable)
-#!/bin/sh
+#!/bin/bash
 
+function usage {
+  echo >&2
+  echo >&2 "usage: $0 [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 "  -h, --help                     Display this help and exit"
+  echo >&2
+  echo >&2 "If no switches are given, the default is to start all servers on the default"
+  echo >&2 "ports."
+  echo >&2
+}
 
-echo "Starting documentation server: http://localhost:9898"
-docker run -d -i -t -p 9898:80 arvados/docserver
+if [[ "$ENABLE_SSH" != "" ]]; then
+  EXTRA=" -e ENABLE_SSH=$ENABLE_SSH"
+else
+  EXTRA=''
+fi
 
-echo "Starting sso server:     https://localhost:9901"
-docker run -d -i -t -p 9901:443 -name sso_server arvados/sso
+start_doc=false
+start_sso=false
+start_api=false
+start_workbench=false
+start_keep=false
 
-echo "Starting api server:     https://localhost:9900"
-docker run -d -i -t -p 9900:443 -name api_server -link sso_server:sso arvados/api
+# NOTE: This requires GNU getopt (part of the util-linux package on Debian-based distros).
+TEMP=`getopt -o d::s::a::w::kh --long doc::,sso::,api::,workbench::,keep,help \
+             -n "$0" -- "$@"`
 
-echo "Starting workbench server:     http://localhost:9899"
-docker run -d -i -t -p 9899:80 -link api_server:api arvados/workbench
+if [ $? != 0 ] ; then echo "Use -h for help"; exit 1 ; fi
 
-echo "Starting keep server:        http://localhost:25107"
+# Note the quotes around `$TEMP': they are essential!
+eval set -- "$TEMP"
 
-# Mount a keep volume if we don't already have one
-keepvolume=""
-for mountpoint in $(cut -d ' ' -f 2 /proc/mounts)
-do
-    if [ -d "$mountpoint/keep" ]
-    then
-       keepvolume=$mountpoint
-    fi
+# For optional argument, as we are in quoted mode,
+# an empty parameter will be generated if its optional
+# argument is not found.
+while true; do
+  case "$1" in
+    -k | --keep ) start_keep=true; shift ;;
+    -h | --help ) usage; exit ;;
+    -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 ;;
+    -a | --workbench)
+      case "$2" in
+        "") start_workbench=9899; shift 2 ;;
+        *)  start_workbench=$2; shift 2 ;;
+      esac ;;
+    -- ) shift; break ;;
+    * ) usage; exit ;;
+  esac
 done
 
-if [ ! "$keepvolume" ]
-then
+# 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
+    :
+else
+    start_doc=9898
+    start_sso=9901
+    start_api=9900
+    start_workbench=9899
+    start_keep=true
+fi
+
+function ip_address {
+  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
+}
+
+function make_keep_volume {
+  # Mount a keep volume if we don't already have one
+  local keepvolume=""
+  for mountpoint in $(cut -d ' ' -f 2 /proc/mounts); do
+    if [[ -d "$mountpoint/keep" && "$mountpoint" != "/" ]]; then
+      keepvolume=$mountpoint
+    fi
+  done
+
+  if [[ "$keepvolume" == '' ]]; then
     keepvolume=$(mktemp -d)
     echo "mounting 512M tmpfs keep volume in $keepvolume"
     sudo mount -t tmpfs -o size=512M tmpfs $keepvolume
     mkdir $keepvolume/keep
+  fi
+  echo "$keepvolume"
+}
+
+if [[ $start_doc != false ]]; then
+  start_container "$start_doc:80" "doc_server" '' '' "arvados/doc"
+fi
+if [[ $start_sso != false ]]; then
+  start_container "$start_sso:443" "sso_server" '' '' "arvados/sso"
+fi
+if [[ $start_api != false ]]; then
+  start_container "$start_api:443" "api_server" '' "sso_server:sso" "arvados/api"
+fi
+if [[ $start_workbench != false ]]; then
+  start_container "$start_workbench:80" "workbench_server" '' "api_server:api" "arvados/workbench"
 fi
 
-docker run -d -i -t -p 25107:25107 -v $keepvolume:/dev/keep-0 arvados/warehouse
+if [[ $start_keep == true ]]; then
+  keepvolume=$(make_keep_volume)
+  start_container "25107:25107" "keep_server_0" "$keepvolume:/dev/keep-0" '' "arvados/warehouse"
+  start_container "25108:25107" "keep_server_1" "$keepvolume:/dev/keep-0" '' "arvados/warehouse"
+fi