-
Notifications
You must be signed in to change notification settings - Fork 112
Expand file tree
/
Copy pathboot
More file actions
executable file
·135 lines (105 loc) · 3.73 KB
/
boot
File metadata and controls
executable file
·135 lines (105 loc) · 3.73 KB
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
#!/usr/bin/env bash
#
# This script is designed to be run inside the container
#
# fail hard and fast even on pipelines
set -eo pipefail
# set debug based on envvar
[[ $DEBUG ]] && set -x
# configure etcd
export ETCD_PORT=${ETCD_PORT:-4001}
export ETCD="$HOST:$ETCD_PORT"
export ETCD_PATH=${ETCD_PATH:-/deis/controller}
export ETCD_TTL=${ETCD_TTL:-20}
# wait for etcd to be available
until etcdctl --no-sync -C "$ETCD" ls >/dev/null 2>&1; do
echo "waiting for etcd at $ETCD..."
sleep $((ETCD_TTL/2)) # sleep for half the TTL
done
# wait until etcd has discarded potentially stale values
sleep $((ETCD_TTL+1))
function etcd_set_default {
set +e
ERROR="$(etcdctl --no-sync -C "$ETCD" mk "$ETCD_PATH/$1" "$2" 2>&1 >/dev/null)"
if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then
echo "etcd_set_default: an etcd error occurred ($ERROR)"
echo "aborting..."
exit 1
fi
set -e
}
function etcd_safe_mkdir {
set +e
ERROR="$(etcdctl --no-sync -C "$ETCD" mkdir "$1" 2>&1 >/dev/null)"
if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then
echo "etcd_safe_mkdir: an etcd error occurred ($ERROR)"
echo "aborting..."
exit 1
fi
set -e
}
etcd_set_default protocol "${DEIS_PROTOCOL:-http}"
etcd_set_default secretKey "${DEIS_SECRET_KEY:-$(openssl rand -base64 64 | tr -d '\n')}"
etcd_set_default builderKey "${DEIS_BUILDER_KEY:-$(openssl rand -base64 64 | tr -d '\n')}"
etcd_set_default registrationMode "enabled"
etcd_set_default webEnabled 0
etcd_set_default unitHostname default
# safely create required keyspaces
etcd_safe_mkdir /deis/domains
etcd_safe_mkdir /deis/platform
etcd_safe_mkdir /deis/scheduler
etcd_safe_mkdir /deis/services
# run etcd data migrations
echo "controller: running etcd data migrations..."
for script in /app/migrations/data/*.sh;
do
# shellcheck disable=SC1090
. "$script";
done
echo "controller: done running etcd data migrations."
# wait for confd to run once and install initial templates
until confd -onetime -node "$ETCD" --confdir /app --log-level error; do
echo "controller: waiting for confd to write initial templates..."
sleep $((ETCD_TTL/2)) # sleep for half the TTL
done
cd /app
mkdir -p /data/logs
chmod 777 /data/logs
# allow deis user permission to Docker
if addgroup -g "$(stat -c "%g" /var/run/docker.sock)" docker; then
addgroup deis docker
fi
# run an idempotent database migration
sudo -E -u deis ./manage.py syncdb --migrate --noinput
# spawn a gunicorn server in the background
sudo -E -u deis gunicorn -c deis/gconf.py deis.wsgi &
./manage.py load_db_state_to_etcd
# smart shutdown on SIGTERM (SIGINT is handled by gunicorn)
function on_exit() {
GUNICORN_PID=$(cat /tmp/gunicorn.pid)
kill -TERM "$GUNICORN_PID" 2>/dev/null
wait "$GUNICORN_PID" 2>/dev/null
exit 0
}
trap on_exit TERM
# spawn confd in the background to update services based on etcd changes
confd -node "$ETCD" --confdir /app --log-level error --interval 5 &
echo deis-controller running...
# publish the service to etcd using the injected EXTERNAL_PORT
if [[ ! -z $EXTERNAL_PORT ]]; then
# configure service discovery
PORT=${PORT:-8000}
PROTO=${PROTO:-tcp}
set +e
# wait for the service to become available on PORT
sleep 1 && while [[ -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do sleep 1; done
# while the port is listening, publish to etcd
while [[ ! -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do
etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/host" "$HOST" --ttl "$ETCD_TTL" >/dev/null
etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/port" "$EXTERNAL_PORT" --ttl "$ETCD_TTL" >/dev/null
sleep $((ETCD_TTL/2)) # sleep for half the TTL
done
# if the loop quits, something went wrong
exit 1
fi
wait