Merge branch 'master' into 5720-ajax-loading-error
[arvados.git] / docker / arvdock
index ecd90c916ee461d91909932926169da7e70d6084..a41056cd680c534585e5346c15a2264157ef1b55 100755 (executable)
@@ -6,13 +6,21 @@ if [[ "$DOCKER" == "" ]]; then
     DOCKER=`which docker`
 fi
 
+CURL=`which curl`
+
 COMPUTE_COUNTER=0
 
 function usage {
     echo >&2
-    echo >&2 "usage: $0 (start|stop|restart|test) [options]"
+    echo >&2 "usage: $0 (start|stop|restart|reset|test) [options]"
+    echo >&2
+    echo >&2 "start    run new or restart stopped arvados containers"
+    echo >&2 "stop     stop arvados containers"
+    echo >&2 "restart  stop and then start arvados containers"
+    echo >&2 "reset    stop and delete containers WARNING: this will delete the data inside Arvados!"
+    echo >&2 "test     run tests"
     echo >&2
-    echo >&2 "$0 start/stop/restart options:"
+    echo >&2 "$0 options:"
     echo >&2 "  -d[port], --doc[=port]        Documentation server (default port 9898)"
     echo >&2 "  -w[port], --workbench[=port]  Workbench server (default port 9899)"
     echo >&2 "  -s[port], --sso[=port]        SSO server (default port 9901)"
@@ -56,7 +64,7 @@ function start_container {
     fi
     if [[ "$3" != '' ]]; then
       local volume="$3"
-      args="$args -v $volume"
+      args="$args --volumes-from $volume"
     fi
     if [[ "$4" != '' ]]; then
       local link="$4"
@@ -70,12 +78,16 @@ function start_container {
       return
     fi
 
-    # Remove any existing container by this name.
-    $DOCKER rm "$name" 2>/dev/null
+    echo "Starting container: $name"
+    `$DOCKER ps --all |grep -P "$name[^/]" -q`
+    if [[ "$?" == "0" ]]; then
+        echo "  $DOCKER start $name"
+        container=`$DOCKER start $name`
+    else
+        echo "  $DOCKER run $args $image"
+        container=`$DOCKER run $args $image`
+    fi
 
-    echo "Starting container:"
-    echo "  $DOCKER run $args $image"
-    container=`$DOCKER run $args $image`
     if [ "$?" != "0" -o "$container" = "" ]; then
       echo "Unable to start container"
       exit 1
@@ -83,48 +95,15 @@ function start_container {
       echo "Started container: $container"
     fi
 
-    if [[ "$name" == "doc_server" ]]; then
-      echo
-      echo "*****************************************************************"
-      echo "You can access the Arvados documentation at http://localhost:${port%:*}"
-      echo "*****************************************************************"
-      echo
-    fi
-
-    if [[ "$name" == "workbench_server" ]]; then
-      echo
-      echo "*****************************************************************"
-      echo "You can access the Arvados workbench at http://localhost:${port%:*}"
-      echo "*****************************************************************"
-      echo
-   fi
-
-
 }
 
-declare -a keep_volumes
-
-# Initialize the global `keep_volumes' array. If any keep volumes
-# already appear to exist (mounted volumes with a top-level "keep"
-# directory), use them; create temporary volumes if necessary.
-#
+# Create a Docker data volume
 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)
-      fi
-    done
-
-    # Create any keep volumes that do not yet exist.
-    while [ ${#keep_volumes[*]} -lt 2 ]
-    do
-        new_keep=$(mktemp -d)
-        echo >&2 "mounting 2G tmpfs keep volume in $new_keep"
-        sudo mount -t tmpfs -o size=2G tmpfs $new_keep
-        mkdir $new_keep/keep
-        keep_volumes+=($new_keep)
-    done
+    `$DOCKER ps --all |grep -P "keep_data[^/]" -q`
+    if [[ "$?" == "0" ]]; then
+      return
+    fi
+    docker create -v /keep-data --name keep_data arvados/keep
 }
 
 function do_start {
@@ -137,6 +116,7 @@ function do_start {
     local start_nameserver=false
     local start_keep=false
     local start_keepproxy=false
+    local
 
     # NOTE: This requires GNU getopt (part of the util-linux package on Debian-based distros).
     local TEMP=`getopt -o d::s::a::cw::nkpvh \
@@ -237,12 +217,14 @@ function do_start {
       if [[ "$?" != "0" ]]; then
         echo "Starting crosbymichael/skydns container..."
         $DOCKER rm "skydns" 2>/dev/null
+        echo $DOCKER run -d -p 172.17.42.1:53:53/udp --name skydns crosbymichael/skydns -nameserver 8.8.8.8:53 -domain arvados
         $DOCKER run -d -p 172.17.42.1:53:53/udp --name skydns crosbymichael/skydns -nameserver 8.8.8.8:53 -domain arvados
       fi
       $DOCKER ps | grep skydock >/dev/null
       if [[ "$?" != "0" ]]; then
         echo "Starting crosbymichael/skydock container..."
         $DOCKER rm "skydock" 2>/dev/null
+        echo $DOCKER run -d -v /var/run/docker.sock:/docker.sock --name skydock crosbymichael/skydock -ttl 30 -environment dev -s /docker.sock -domain arvados -name skydns
         $DOCKER run -d -v /var/run/docker.sock:/docker.sock --name skydock crosbymichael/skydock -ttl 30 -environment dev -s /docker.sock -domain arvados -name skydns
       fi
     fi
@@ -273,16 +255,12 @@ function do_start {
         # 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]}:/keep-data" \
+            "keep_data" \
             "api_server:api" \
             "arvados/keep"
         start_container "25108:25107" "keep_server_1" \
-            "${keep_volumes[1]}:/keep-data" \
+            "keep_data" \
             "api_server:api" \
             "arvados/keep"
     fi
@@ -323,6 +301,42 @@ EOF
           fi
         fi
     fi
+
+    if [ "$(awk '($1 == "nameserver"){print $2; exit}' </etc/resolv.conf)" != "172.17.42.1" ]; then
+        echo
+        echo "******************************************************************"
+        echo "To access Arvados you must add the Arvados nameserver to the top"
+        echo "of your DNS configuration in /etc/resolv.conf:"
+        echo "nameserver 172.17.42.1"
+        echo
+        echo "Then run '$0 start' again"
+        echo "******************************************************************"
+        echo
+    else
+        while ! $CURL -L -f http://workbench.dev.arvados >/dev/null 2>/dev/null ; do
+            echo "Waiting for Arvados to be ready."
+            sleep 1
+        done
+
+        `$DOCKER ps |grep -P "doc_server[^/]" -q`
+        if [[ "$?" == "0" ]]; then
+            echo
+            echo "******************************************************************"
+            echo "You can access the Arvados documentation at http://doc.dev.arvados"
+            echo "******************************************************************"
+            echo
+        fi
+
+        `$DOCKER ps |grep -P "workbench_server[^/]" -q`
+        if [[ "$?" == "0" ]]; then
+            echo
+            echo "********************************************************************"
+            echo "You can access the Arvados workbench at http://workbench.dev.arvados"
+            echo "********************************************************************"
+            echo
+        fi
+    fi
+
 }
 
 function do_stop {
@@ -435,6 +449,34 @@ function do_test {
     done
 }
 
+function do_reset {
+    for name in skydock skydns workbench_server shell doc_server keepproxy_server keep_server_0 keep_server_1 compute0 compute1 api_server keepproxy keep_data
+    do
+        `$DOCKER ps |grep -P "$name[^/]" -q`
+        if [[ "$?" == "0" ]]; then
+            echo "  $DOCKER stop $name"
+            $DOCKER stop $name
+        fi
+        `$DOCKER ps --all |grep -P "$name[^/]" -q`
+        if [[ "$?" == "0" ]]; then
+            echo "  $DOCKER rm $name"
+            $DOCKER rm $name
+        fi
+    done
+}
+
+if [ "$DOCKER" == '' ]
+then
+  echo "Docker not found. Please install it first."
+  exit 2
+fi
+
+if [ "$CURL" == '' ]
+then
+  echo "Curl not found. Please install it first."
+  exit 3
+fi
+
 if [ $# -lt 1 ]
 then
   usage
@@ -459,6 +501,10 @@ case $1 in
         shift
         do_test $@
         ;;
+    reset)
+        shift
+        do_reset $@
+        ;;
     *)
         usage
         exit 1