Skip to content

Commit f3b2ced

Browse files
committed
starting wait-for-it
1 parent 95ebb34 commit f3b2ced

File tree

7 files changed

+197
-3
lines changed

7 files changed

+197
-3
lines changed

Base/Dockerfile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ RUN useradd seluser \
4646
&& echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers \
4747
&& echo 'seluser:secret' | chpasswd
4848

49+
#=======================================
50+
# Create shared / common bin directory
51+
#=======================================
52+
RUN mkdir -p /opt/bin
53+
54+
#======================================
55+
# Add intermediate service discovery
56+
#======================================
57+
COPY wait-for-it.sh \
58+
/opt/bin/
59+
4960
#===================================================
5061
# Run the following commands as non-privileged user
5162
#===================================================

Base/wait-for-it.sh

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#!/usr/bin/env bash
2+
# Use this script to test if a given TCP host/port are available
3+
4+
cmdname=$(basename $0)
5+
6+
echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
7+
8+
usage()
9+
{
10+
cat << USAGE >&2
11+
Usage:
12+
$cmdname host:port [-s] [-t timeout] [-- command args]
13+
-h HOST | --host=HOST Host or IP under test
14+
-p PORT | --port=PORT TCP port under test
15+
Alternatively, you specify the host and port as host:port
16+
-s | --strict Only execute subcommand if the test succeeds
17+
-q | --quiet Don't output any status messages
18+
-t TIMEOUT | --timeout=TIMEOUT
19+
Timeout in seconds, zero for no timeout
20+
-- COMMAND ARGS Execute command with args after the test finishes
21+
USAGE
22+
exit 1
23+
}
24+
25+
wait_for()
26+
{
27+
if [[ $TIMEOUT -gt 0 ]]; then
28+
echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT"
29+
else
30+
echoerr "$cmdname: waiting for $HOST:$PORT without a timeout"
31+
fi
32+
start_ts=$(date +%s)
33+
while :
34+
do
35+
if [[ $ISBUSY -eq 1 ]]; then
36+
nc -z $HOST $PORT
37+
result=$?
38+
else
39+
(echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1
40+
result=$?
41+
fi
42+
if [[ $result -eq 0 ]]; then
43+
end_ts=$(date +%s)
44+
echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds"
45+
break
46+
fi
47+
sleep 1
48+
done
49+
return $result
50+
}
51+
52+
wait_for_wrapper()
53+
{
54+
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
55+
if [[ $QUIET -eq 1 ]]; then
56+
timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
57+
else
58+
timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &
59+
fi
60+
PID=$!
61+
trap "kill -INT -$PID" INT
62+
wait $PID
63+
RESULT=$?
64+
if [[ $RESULT -ne 0 ]]; then
65+
echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT"
66+
fi
67+
return $RESULT
68+
}
69+
70+
# process arguments
71+
while [[ $# -gt 0 ]]
72+
do
73+
case "$1" in
74+
*:* )
75+
hostport=(${1//:/ })
76+
HOST=${hostport[0]}
77+
PORT=${hostport[1]}
78+
shift 1
79+
;;
80+
--child)
81+
CHILD=1
82+
shift 1
83+
;;
84+
-q | --quiet)
85+
QUIET=1
86+
shift 1
87+
;;
88+
-s | --strict)
89+
STRICT=1
90+
shift 1
91+
;;
92+
-h)
93+
HOST="$2"
94+
if [[ $HOST == "" ]]; then break; fi
95+
shift 2
96+
;;
97+
--host=*)
98+
HOST="${1#*=}"
99+
shift 1
100+
;;
101+
-p)
102+
PORT="$2"
103+
if [[ $PORT == "" ]]; then break; fi
104+
shift 2
105+
;;
106+
--port=*)
107+
PORT="${1#*=}"
108+
shift 1
109+
;;
110+
-t)
111+
TIMEOUT="$2"
112+
if [[ $TIMEOUT == "" ]]; then break; fi
113+
shift 2
114+
;;
115+
--timeout=*)
116+
TIMEOUT="${1#*=}"
117+
shift 1
118+
;;
119+
--)
120+
shift
121+
CLI=("$@")
122+
break
123+
;;
124+
--help)
125+
usage
126+
;;
127+
*)
128+
echoerr "Unknown argument: $1"
129+
usage
130+
;;
131+
esac
132+
done
133+
134+
if [[ "$HOST" == "" || "$PORT" == "" ]]; then
135+
echoerr "Error: you need to provide a host and port to test."
136+
usage
137+
fi
138+
139+
TIMEOUT=${TIMEOUT:-15}
140+
STRICT=${STRICT:-0}
141+
CHILD=${CHILD:-0}
142+
QUIET=${QUIET:-0}
143+
144+
# check to see if timeout is from busybox?
145+
# check to see if timeout is from busybox?
146+
TIMEOUT_PATH=$(realpath $(which timeout))
147+
if [[ $TIMEOUT_PATH =~ "busybox" ]]; then
148+
ISBUSY=1
149+
BUSYTIMEFLAG="-t"
150+
else
151+
ISBUSY=0
152+
BUSYTIMEFLAG=""
153+
fi
154+
155+
if [[ $CHILD -gt 0 ]]; then
156+
wait_for
157+
RESULT=$?
158+
exit $RESULT
159+
else
160+
if [[ $TIMEOUT -gt 0 ]]; then
161+
wait_for_wrapper
162+
RESULT=$?
163+
else
164+
wait_for
165+
RESULT=$?
166+
fi
167+
fi
168+
169+
if [[ $CLI != "" ]]; then
170+
if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then
171+
echoerr "$cmdname: strict mode, refusing to execute subprocess"
172+
exit $RESULT
173+
fi
174+
exec "${CLI[@]}"
175+
else
176+
exit $RESULT
177+
fi

Hub/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# NOTE: DO *NOT* EDIT THIS FILE. IT IS GENERATED.
33
# PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
44
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5-
FROM selenium/base:3.9.1-actinium
5+
FROM selenium/base:local
66
LABEL authors=SeleniumHQ
77

88
USER seluser

Hub/entry_point.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,7 @@ java ${JAVA_OPTS} -jar /opt/selenium/selenium-server-standalone.jar \
2525
${SE_OPTS} &
2626
NODE_PID=$!
2727

28+
/opt/bin/wait-for-it.sh -h 127.0.0.1 -p $GRID_HUB_PORT -t 30 -- echo "Hub is up and running."
29+
2830
trap shutdown SIGTERM SIGINT
2931
wait $NODE_PID

NodeBase/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# NOTE: DO *NOT* EDIT THIS FILE. IT IS GENERATED.
33
# PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
44
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5-
FROM selenium/base:3.9.1-actinium
5+
FROM selenium/base:local
66
LABEL authors=SeleniumHQ
77

88
USER root

NodeBase/entry_point.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ SERVERNUM=$(get_server_num)
4646

4747
rm -f /tmp/.X*lock
4848

49+
/opt/bin/wait-for-it.sh -h $HUB_PORT_4444_TCP_ADDR -p $HUB_PORT_4444_TCP_PORT -t 30 -s -- echo "Hub is ready for connections"
50+
4951
xvfb-run -n $SERVERNUM --server-args="-screen 0 $GEOMETRY -ac +extension RANDR" \
5052
java ${JAVA_OPTS} -jar /opt/selenium/selenium-server-standalone.jar \
5153
-role node \
@@ -55,5 +57,7 @@ xvfb-run -n $SERVERNUM --server-args="-screen 0 $GEOMETRY -ac +extension RANDR"
5557
${SE_OPTS} &
5658
NODE_PID=$!
5759

60+
/opt/bin/wait-for-it.sh -h 127.0.0.1 -p $NODE_PORT -t 30 -s -- echo "Node is up."
61+
5862
trap shutdown SIGTERM SIGINT
5963
wait $NODE_PID

NodeChrome/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# NOTE: DO *NOT* EDIT THIS FILE. IT IS GENERATED.
33
# PLEASE UPDATE Dockerfile.txt INSTEAD OF THIS FILE
44
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5-
FROM selenium/node-base:3.9.1-actinium
5+
FROM selenium/node-base:local
66
LABEL authors=SeleniumHQ
77

88
USER root

0 commit comments

Comments
 (0)