Merge branch 'master' into 1978-compare-pipelines
[arvados.git] / docker / run.sh
1 #!/bin/bash
2
3 ENABLE_SSH=false
4
5 function usage {
6     echo >&2
7     echo >&2 "usage: $0 (start|stop|test) [options]"
8     echo >&2
9     echo >&2 "$0 start options:"
10     echo >&2 "  -d [port], --doc[=port]        Start documentation server (default port 9898)"
11     echo >&2 "  -w [port], --workbench[=port]  Start workbench server (default port 9899)"
12     echo >&2 "  -s [port], --sso[=port]        Start SSO server (default port 9901)"
13     echo >&2 "  -a [port], --api[=port]        Start API server (default port 9900)"
14     echo >&2 "  -k, --keep                     Start Keep servers"
15     echo >&2 "  --ssh                          Enable SSH access to server containers"
16     echo >&2 "  -h, --help                     Display this help and exit"
17     echo >&2
18     echo >&2 "  If no switches are given, the default is to start all"
19     echo >&2 "  servers on the default ports."
20     echo >&2
21     echo >&2 "$0 stop"
22     echo >&2 "  Stop all servers."
23     echo >&2
24     echo >&2 "$0 test [testname] [testname] ..."
25     echo >&2 "  By default, all tests are run."
26 }
27
28 function ip_address {
29     local container=$1
30     echo `docker inspect $container  |grep IPAddress |cut -f4 -d\"`
31 }
32
33 function start_container {
34     local args="-d -i -t"
35     if [[ "$1" != '' ]]; then
36       local port="$1"
37       args="$args -p $port"
38     fi
39     if [[ "$2" != '' ]]; then
40       local name="$2"
41       args="$args -name $name"
42     fi
43     if [[ "$3" != '' ]]; then
44       local volume="$3"
45       args="$args -v $volume"
46     fi
47     if [[ "$4" != '' ]]; then
48       local link="$4"
49       args="$args -link $link"
50     fi
51     local image=$5
52
53     if $ENABLE_SSH
54     then
55       args="$args -e ENABLE_SSH=$ENABLE_SSH"
56     fi
57
58     `docker ps |grep -P "$name[^/]" -q`
59     if [[ "$?" == "0" ]]; then
60       echo "You have a running container with name $name -- skipping."
61       return
62     fi
63
64     # Remove any existing container by this name.
65     docker rm "$name" 2>/dev/null
66
67     echo "Starting container:"
68     echo "  docker run $args $image"
69     container=`docker run $args $image`
70     if [[ "$?" != "0" ]]; then
71       echo "Unable to start container"
72       exit 1
73     fi
74     if $ENABLE_SSH
75     then
76       ip=$(ip_address $container )
77       echo
78       echo "You can ssh into the container with:"
79       echo
80       echo "    ssh root@$ip"
81       echo
82     fi
83 }
84
85 declare -a keep_volumes
86
87 # Initialize the global `keep_volumes' array. If any keep volumes
88 # already appear to exist (mounted volumes with a top-level "keep"
89 # directory), use them; create temporary volumes if necessary.
90 #
91 function make_keep_volumes () {
92     # Mount a keep volume if we don't already have one
93     for mountpoint in $(cut -d ' ' -f 2 /proc/mounts); do
94       if [[ -d "$mountpoint/keep" && "$mountpoint" != "/" ]]; then
95         keep_volumes+=($mountpoint)
96       fi
97     done
98
99     # Create any keep volumes that do not yet exist.
100     while [ ${#keep_volumes[*]} -lt 2 ]
101     do
102         new_keep=$(mktemp -d)
103         echo >&2 "mounting 512M tmpfs keep volume in $new_keep"
104         sudo mount -t tmpfs -o size=512M tmpfs $new_keep
105         mkdir $new_keep/keep
106         keep_volumes+=($new_keep)
107     done
108 }
109
110 function do_start {
111     local start_doc=false
112     local start_sso=false
113     local start_api=false
114     local start_workbench=false
115     local start_keep=false
116
117     # NOTE: This requires GNU getopt (part of the util-linux package on Debian-based distros).
118     local TEMP=`getopt -o d::s::a::w::kh \
119                   --long doc::,sso::,api::,workbench::,keep,help,ssh \
120                   -n "$0" -- "$@"`
121
122     if [ $? != 0 ] ; then echo "Use -h for help"; exit 1 ; fi
123
124     # Note the quotes around `$TEMP': they are essential!
125     eval set -- "$TEMP"
126
127     while [ $# -ge 1 ]
128     do
129         case $1 in
130             -d | --doc)
131                 case "$2" in
132                     "") start_doc=9898; shift 2 ;;
133                     *)  start_doc=$2; shift 2 ;;
134                 esac
135                 ;;
136             -s | --sso)
137                 case "$2" in
138                     "") start_sso=9901; shift 2 ;;
139                     *)  start_sso=$2; shift 2 ;;
140                 esac
141                 ;;
142             -a | --api)
143                 case "$2" in
144                     "") start_api=9900; shift 2 ;;
145                     *)  start_api=$2; shift 2 ;;
146                 esac
147                 ;;
148             -w | --workbench)
149                 case "$2" in
150                     "") start_workbench=9899; shift 2 ;;
151                     *)  start_workbench=$2; shift 2 ;;
152                 esac
153                 ;;
154             -k | --keep )
155                 start_keep=true
156                 shift
157                 ;;
158             --ssh)
159                 # ENABLE_SSH is a global variable
160                 ENABLE_SSH=true
161                 shift
162                 ;;
163             --)
164                 shift
165                 break
166                 ;;
167             *)
168                 usage
169                 exit 1
170                 ;;
171         esac
172     done
173
174     # If no options were selected, then start all servers.
175     if [[ $start_doc == false &&
176           $start_sso == false &&
177           $start_api == false &&
178           $start_workbench == false &&
179           $start_keep == false ]]
180     then
181         start_doc=9898
182         start_sso=9901
183         start_api=9900
184         start_workbench=9899
185         start_keep=true
186     fi
187
188     if [[ $start_doc != false ]]
189     then
190         start_container "9898:80" "doc_server" '' '' "arvados/doc"
191     fi
192
193     if [[ $start_sso != false ]]
194     then
195         start_container "9901:443" "sso_server" '' '' "arvados/sso"
196     fi
197
198     if [[ $start_api != false ]]
199     then
200         start_container "9900:443" "api_server" '' "sso_server:sso" "arvados/api"
201     fi
202
203     if [[ $start_workbench != false ]]
204     then
205         start_container "9899:80" "workbench_server" '' "api_server:api" "arvados/workbench"
206     fi
207
208     if [[ $start_keep != false ]]
209     then
210         # create `keep_volumes' array with a list of keep mount points
211         # remove any stale metadata from those volumes before starting them
212         make_keep_volumes
213         for v in ${keep_volumes[*]}
214         do
215             [ -f $v/keep/.metadata.yml ] && sudo rm $v/keep/.metadata.yml
216         done
217         start_container "25107:25107" "keep_server_0" \
218             "${keep_volumes[0]}:/dev/keep-0" \
219             "api_server:api" \
220             "arvados/warehouse"
221         start_container "25108:25107" "keep_server_1" \
222             "${keep_volumes[1]}:/dev/keep-0" \
223             "api_server:api" \
224             "arvados/warehouse"
225     fi
226
227     if [ -d $HOME/.config/arvados ] || mkdir -p $HOME/.config/arvados
228     then
229         cat >$HOME/.config/arvados/settings.conf <<EOF
230 ARVADOS_API_HOST=$(ip_address "api_server")
231 ARVADOS_API_HOST_INSECURE=yes
232 ARVADOS_API_TOKEN=$(cat api/generated/superuser_token)
233 EOF
234
235         echo "To run a test suite:"
236         echo "python -m unittest discover ../sdk/python"
237     fi
238 }
239
240 function do_stop {
241     docker stop doc_server \
242         api_server \
243         sso_server \
244         workbench_server \
245         keep_server_0 \
246         keep_server_1 2>/dev/null
247 }
248
249 function do_test {
250     local alltests
251     if [ $# -lt 1 ]
252     then
253         alltests="python-sdk api"
254     else
255         alltests="$@"
256     fi
257
258     for testname in $alltests
259     do
260         echo "testing $testname..."
261         case $testname in
262             python-sdk)
263                 do_start --api --keep --sso
264                 export ARVADOS_API_HOST=$(ip_address "api_server")
265                 export ARVADOS_API_HOST_INSECURE=yes
266                 export ARVADOS_API_TOKEN=$(cat api/generated/superuser_token)
267                 python -m unittest discover ../sdk/python
268                 ;;
269             api)
270                 docker run -t -i arvados/api \
271                     /usr/src/arvados/services/api/script/rake_test.sh
272                 ;;
273             *)
274                 echo >&2 "unknown test $testname"
275                 ;;
276         esac
277     done
278 }
279
280 if [ $# -lt 1 ]
281 then
282   usage
283   exit 1
284 fi
285
286 case $1 in
287     start)
288         shift
289         do_start $@
290         ;;
291     stop)
292         shift
293         do_stop $@
294         ;;
295     test)
296         shift
297         do_test $@
298         ;;
299     *)
300         usage
301         exit 1
302         ;;
303 esac