-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstart_test_wraxl_cluster.sh
executable file
·226 lines (194 loc) · 7.69 KB
/
start_test_wraxl_cluster.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/bin/bash
set -uo pipefail
IFS=$'\n\t'
# taken from http://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format
function vercomp {
if [[ "$1" == "$2" ]]; then
return 0
fi
local IFS=.
local i ver1=($1) ver2=($2)
# fill empty fields in ver1 with zeros
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
do
ver1[i]=0
done
for ((i=0; i<${#ver1[@]}; i++))
do
if [[ -z ${ver2[i]} ]]
then
# fill empty fields in ver2 with zeros
ver2[i]=0
fi
if ((10#${ver1[i]} > 10#${ver2[i]}))
then
return 1
fi
if ((10#${ver1[i]} < 10#${ver2[i]}))
then
return 2
fi
done
return 0
}
usage() {
cat <<EOF
Usage $0 [--registry] [--file] [--rm] [--with-lava]
--registry=(ala|yow|pek)-lpdfs01: Docker registry to download images from.
Will attempt to locate closest registry if not provided.
--file <compose yaml>: Extra compose yaml file(s) to extend wraxl_test.yml
Accepts multiple --file parameters
--rm: Delete containers and volumes when script exits
--with-lava: Creates lava server and data volumes to integrate with wraxl scheduler
--lava-tag: Set the lava docker container tag
--mesos-tag: Set the mesos master,agent and wraxl-scheduler container tag
--dev: Do not start the wraxl-scheduler image
EOF
exit 1
}
CLEANUP=0
WITH_LAVA=0
DEV_MODE=0
PULL_IMAGES=1
export LOG_LEVEL=WARNING
export MESOS_TAG=0.27.2
export LAVA_TAG=2016.6
export REGISTRY=
declare -a FILES=
while [ "$#" -gt 0 ]; do
case "$1" in
--registry=*) REGISTRY="${1#*=}"; shift 1;;
--registry) REGISTRY="$2"; shift 2;;
--file) FILES=("${FILES[@]}" --file $2); shift 2;;
--log=*) LOG_LEVEL="${1#*=}"; shift 1;;
--rm) CLEANUP=1; shift 1;;
--with-lava) WITH_LAVA=1; shift 1;;
--dev) DEV_MODE=1; shift 1;;
--lava-tag=*) LAVA_TAG="${1#*=}"; shift 1;;
--mesos-tag=*) MESOS_TAG="${1#*=}"; shift 1;;
--no-pull) PULL_IMAGES=0; shift 1;;
*) usage ;;
esac
done
command -v docker >/dev/null 2>&1 || { echo >&2 "I require docker but it's not installed. https://docs.docker.com/install/ Aborting."; exit 1; }
# require docker version >= 1.9.1
DOCKER_VERSION=$(docker --version | cut -d' ' -f 3)
vercomp '1.9.1' "$DOCKER_VERSION"
if [ $? != '2' ]; then
echo >&2 "Require docker version 1.9.1 or later. Aborting"
exit 1
fi
DOCKER_CMD="docker"
if groups | grep -vq docker; then
echo "This user is not in the docker group. Will attempt to run docker info using sudo."
DOCKER_CMD=(sudo docker)
fi
${DOCKER_CMD[*]} info > /dev/null 2>&1
if [ $? != 0 ]; then
echo >&2 "Unable to run '${DOCKER_CMD[*]}'. Either give the user sudo access to run docker or add it to the docker group. Aborting."
exit 1
fi
echo 'Successfully ran docker info'
command -v docker-compose >/dev/null 2>&1 || { echo >&2 "I require docker-compose but it's not installed. https://docs.docker.com/compose/install/ Aborting."; exit 1; }
# require docker-compose version >= 1.7.0
DCOMPOSE_VERSION=$(docker-compose --version | cut -d' ' -f 3)
vercomp '1.6.2' "$DCOMPOSE_VERSION"
if [ $? != '2' ]; then
echo >&2 "Require docker-compose version 1.7.0 or later. Aborting"
exit 1
fi
echo "Docker Compose is present and is version $DCOMPOSE_VERSION"
if [ -z "$REGISTRY" ]; then
echo "The closest internal docker registry was not specified with --registry"
echo "The script will attempt to detect the closest docker registry"
echo "Retrieving external ip address to determine location. May take a minute."
external_ip=$(dig +short @resolver1.opendns.com myip.opendns.com)
#only look at first 2 parts of ip address
classB_subnet=$(echo "${external_ip}" | cut -d. -f1-2)
if [ "x$classB_subnet" == "x128.224" ]; then
REGISTRY=yow-lpdfs01
elif [ "x$classB_subnet" == "x147.11" ]; then
REGISTRY=ala-lpdfs01
elif [ "x$classB_subnet" == "x106.120" ]; then
REGISTRY=pek-lpdfs01
else
echo "Unable to determine closest registry. You will need to start the script with --registry"
echo "and choose one of the three available registries: ala-lpdfs01, yow-lpdfs01 and pek-lpdfs01"
exit 1
fi
echo "Using registry $REGISTRY. Next time call script with --registry=$REGISTRY"
else
echo "Using registry $REGISTRY."
fi
get_primary_ip_address() {
# show which device internet connection would use and extract ip of that device
ip=$(ip -4 route get 8.8.8.8 | awk 'NR==1 {print $NF}')
echo "$ip"
}
export HOST="$HOSTNAME"
# require a $HOSTNAME with a proper DNS entry
host "$HOSTNAME" > /dev/null 2>&1
if [ $? != 0 ]; then
echo "The hostname for this system is not in DNS. Attempting ip address fallback"
export HOST=$(get_primary_ip_address)
fi
export HOSTIP=$(get_primary_ip_address)
if [ "$PULL_IMAGES" == '1' ]; then
echo "Pull mesos master, agent and scheduler images"
${DOCKER_CMD[*]} pull "${REGISTRY}:5000/mesos-master:${MESOS_TAG}"
${DOCKER_CMD[*]} pull "${REGISTRY}:5000/mesos-agent:${MESOS_TAG}"
${DOCKER_CMD[*]} pull "${REGISTRY}:5000/mesos-scheduler:${MESOS_TAG}"
fi
if [ "$WITH_LAVA" == '1' ]; then
LAVA_IMAGE="${REGISTRY}:5000/lava:${LAVA_TAG}"
LAVA_IMAGE_ID=$(${DOCKER_CMD[*]} images "$LAVA_IMAGE" )
if [ -z "$LAVA_IMAGE_ID" ] || [ "$PULL_IMAGES" == '1' ]; then
echo "Pulling $LAVA_IMAGE"
${DOCKER_CMD[*]} pull "$LAVA_IMAGE"
fi
LAVA_WORKER_IMAGE="${REGISTRY}:5000/lava-worker:${LAVA_TAG}"
LAVA_WORKER_IMAGE_ID=$(${DOCKER_CMD[*]} images "$LAVA_WORKER_IMAGE" )
if [ -z "$LAVA_WORKER_IMAGE_ID" ] || [ "$PULL_IMAGES" == '1' ]; then
echo "Pulling $LAVA_WORKER_IMAGE"
${DOCKER_CMD[*]} pull "$LAVA_WORKER_IMAGE"
fi
echo "$LAVA_IMAGE and $LAVA_WORKER_IMAGE are installed"
# check if lava-server-data already exists
${DOCKER_CMD[*]} inspect lava-server-data &> /dev/null
if [ $? != 0 ]; then
echo "Creating lava-server-data data-only container"
${DOCKER_CMD[*]} create -v /var/lib/postgresql -v /var/log -v /run \
-v /var/lib/lava-server --name lava-server-data \
"${LAVA_IMAGE}" /bin/true
echo "Initial database setup"
mkdir -p /tmp/lava-server
curl -s -o /tmp/lava-server/lava_backup.db.gz \
http://ala-git/cgit/lpd-ops/lava-wraxl.git/plain/lava/lava_backup.db.gz
${DOCKER_CMD[*]} run -it --rm --volumes-from lava-server-data \
-v /tmp/lava-server:/tmp --name lava-server-init \
-h lava-server "${LAVA_IMAGE}" \
/bin/lava_db_restore.sh &> /dev/null
echo "Initial device creation"
${DOCKER_CMD[*]} run -it --rm --volumes-from lava-server-data \
--name lava-server-init \
-h "$HOSTNAME" -e HOSTNAME="$HOSTNAME" "${LAVA_IMAGE}" \
/bin/lava_device_create.sh &> /dev/null
else
echo "lava-server-data container already exists."
fi
FILES=(--file wraxl_lava.yml "${FILES[@]}")
echo "Lava UI will be available at https://$HOSTIP"
fi
if [ "$DEV_MODE" == '0' ]; then
FILES=(--file wraxl_test.yml --file wraxl_local_sched.yml "${FILES[@]}")
else
FILES=(--file wraxl_test.yml "${FILES[@]}")
fi
echo "Mesos Master UI will be available at http://$HOSTIP:5050"
echo Starting wraxl with: docker-compose ${FILES[*]} up
sleep 1
docker-compose ${FILES[*]} up --abort-on-container-exit
if [ "$CLEANUP" == '1' ]; then
echo "Cleaning up images and volumes"
docker-compose ${FILES[*]} rm --force -v --all
fi