Skip to content

Commit 8bada80

Browse files
authored
update: handle graceful shutdown in Node container (#2337)
Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent 7cbc96a commit 8bada80

File tree

16 files changed

+74
-48
lines changed

16 files changed

+74
-48
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ StandaloneC*/generate_config
2424
StandaloneF*/generate_config
2525
StandaloneE*/generate_config
2626
videos
27+
Base/configs
2728

2829
# Created by https://www.gitignore.io/api/virtualenv
2930

Base/Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ RUN if [ "$(dpkg --print-architecture)" = "amd64" ]; then \
127127
#======================================
128128
# Add Grid check script
129129
#======================================
130-
COPY --chown="${SEL_UID}:${SEL_GID}" check-grid.sh entry_point.sh /opt/bin/
130+
COPY --chown="${SEL_UID}:${SEL_GID}" check-grid.sh entry_point.sh configs/node/nodeGridUrl.sh configs/node/nodePreStop.sh /opt/bin/
131131

132132
#======================================
133133
# Add Supervisor configuration file
@@ -149,6 +149,7 @@ ENV SE_BIND_HOST=false \
149149
SE_REJECT_UNSUPPORTED_CAPS=false \
150150
SE_OTEL_JAVA_GLOBAL_AUTOCONFIGURE_ENABLED=true \
151151
SE_OTEL_TRACES_EXPORTER="otlp" \
152-
SE_SUPERVISORD_LOG_LEVEL="info"
152+
SE_SUPERVISORD_LOG_LEVEL="info" \
153+
SE_OPT_BIN="/opt/bin"
153154

154155
CMD ["/opt/bin/entry_point.sh"]

Base/entry_point.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env bash
22

3+
NODE_CONFIG_DIRECTORY=${NODE_CONFIG_DIRECTORY:-$SE_OPT_BIN}
34
#==============================================
45
# OpenShift or non-sudo environments support
56
# https://docs.openshift.com/container-platform/3.11/creating_images/guidelines.html#openshift-specific-guidelines
@@ -17,6 +18,10 @@ SUPERVISOR_PID=$!
1718

1819
function shutdown {
1920
echo "Trapped SIGTERM/SIGINT/x so shutting down supervisord..."
21+
if [ "${SE_NODE_GRACEFUL_SHUTDOWN}" = "true" ]; then
22+
echo "Waiting for Selenium Node to shutdown gracefully..."
23+
bash ${NODE_CONFIG_DIRECTORY}/nodePreStop.sh
24+
fi
2025
kill -s SIGTERM ${SUPERVISOR_PID}
2126
wait ${SUPERVISOR_PID}
2227
echo "Shutdown complete"

Makefile

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ build: all
6868
ci: build test
6969

7070
base:
71+
rm -rf ./Base/configs/node && mkdir -p ./Base/configs/node && cp -r ./charts/selenium-grid/configs/node ./Base/configs
7172
cd ./Base && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) --build-arg VERSION=$(BASE_VERSION) --build-arg RELEASE=$(BASE_RELEASE) --build-arg AUTHORS=$(AUTHORS) -t $(NAME)/base:$(TAG_VERSION) .
7273

7374
base_nightly:
74-
cd ./Base && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) --build-arg VERSION=$(BASE_VERSION_NIGHTLY) --build-arg RELEASE=$(BASE_RELEASE_NIGHTLY) --build-arg AUTHORS=$(AUTHORS) -t $(NAME)/base:$(TAG_VERSION) .
75+
BASE_VERSION=$(BASE_VERSION_NIGHTLY) BASE_RELEASE=$(BASE_RELEASE_NIGHTLY) make base
7576

7677
hub: base
7778
cd ./Hub && docker buildx build --platform $(PLATFORMS) $(BUILD_ARGS) $(FROM_IMAGE_ARGS) -t $(NAME)/hub:$(TAG_VERSION) .
@@ -557,7 +558,8 @@ test_parallel: hub chrome firefox edge chromium
557558
cd ./tests || true ; \
558559
echo TAG=$(TAG_VERSION) > .env ; \
559560
echo TEST_DRAIN_AFTER_SESSION_COUNT=$(or $(TEST_DRAIN_AFTER_SESSION_COUNT), 0) >> .env ; \
560-
echo TEST_PARALLEL_HARDENING=$(or $(TEST_PARALLEL_HARDENING), "false") >> .env ; \
561+
echo TEST_PARALLEL_HARDENING=$(or $(TEST_PARALLEL_HARDENING), "true") >> .env ; \
562+
echo TEST_PARALLEL_COUNT=$(or $(TEST_PARALLEL_COUNT), 5) >> .env ; \
561563
echo LOG_LEVEL=$(or $(LOG_LEVEL), "INFO") >> .env ; \
562564
echo REQUEST_TIMEOUT=$(or $(REQUEST_TIMEOUT), 300) >> .env ; \
563565
echo NODE=$$node >> .env ; \
@@ -569,11 +571,14 @@ test_parallel: hub chrome firefox edge chromium
569571
echo NODE_CHROME=chromium >> .env ; \
570572
fi; \
571573
echo TEST_PLATFORMS=$(PLATFORMS) >> .env ; \
572-
DOCKER_DEFAULT_PLATFORM=$(PLATFORMS) docker compose --profile $(PLATFORMS) -f docker-compose-v3-test-parallel.yml up --no-log-prefix --exit-code-from tests ; \
573-
done
574+
export $$(cat .env | xargs) ; \
575+
DOCKER_DEFAULT_PLATFORM=$(PLATFORMS) docker compose --profile $(PLATFORMS) -f docker-compose-v3-test-parallel.yml up -d --no-log-prefix ; \
576+
RUN_IN_DOCKER_COMPOSE=true bash ./bootstrap.sh $$node ; \
577+
done ; \
578+
docker compose -f docker-compose-v3-test-parallel.yml down
574579

575580
test_video_dynamic_name:
576-
VIDEO_FILE_NAME=auto TEST_DELAY_AFTER_TEST=10 \
581+
VIDEO_FILE_NAME=auto TEST_DELAY_AFTER_TEST=0 \
577582
make test_video
578583

579584
# This should run on its own CI job. There is no need to combine it with the other tests.
@@ -636,7 +641,7 @@ test_node_relay: hub node_base standalone_firefox
636641
echo ANDROID_BASED_IMAGE=$(or $(ANDROID_BASED_IMAGE),docker-android) >> .env ; \
637642
echo ANDROID_BASED_TAG=$(or $(ANDROID_BASED_TAG),emulator_14.0) >> .env ; \
638643
echo ANDROID_PLATFORM_API=$(or $(ANDROID_PLATFORM_API),14) >> .env ; \
639-
echo TEST_DELAY_AFTER_TEST=$(or $(TEST_DELAY_AFTER_TEST), 15) >> .env ; \
644+
echo TEST_DELAY_AFTER_TEST=$(or $(TEST_DELAY_AFTER_TEST), 0) >> .env ; \
640645
echo NODE=$$node >> .env ; \
641646
echo TEST_NODE_RELAY=$$node >> .env ; \
642647
echo UID=$$(id -u) >> .env ; \
@@ -688,7 +693,7 @@ test_node_docker: hub standalone_docker standalone_chrome standalone_firefox sta
688693
echo LOG_LEVEL=$(or $(LOG_LEVEL), "INFO") >> .env ; \
689694
echo REQUEST_TIMEOUT=$(or $(REQUEST_TIMEOUT), 300) >> .env ; \
690695
echo SELENIUM_ENABLE_MANAGED_DOWNLOADS=$(or $(SELENIUM_ENABLE_MANAGED_DOWNLOADS), "false") >> .env ; \
691-
echo TEST_DELAY_AFTER_TEST=$(or $(TEST_DELAY_AFTER_TEST), 5) >> .env ; \
696+
echo TEST_DELAY_AFTER_TEST=$(or $(TEST_DELAY_AFTER_TEST), 0) >> .env ; \
692697
echo NODE=$$node >> .env ; \
693698
echo UID=$$(id -u) >> .env ; \
694699
echo BINDING_VERSION=$(BINDING_VERSION) >> .env ; \
@@ -765,7 +770,7 @@ chart_test_template:
765770
./tests/charts/bootstrap.sh
766771

767772
chart_test_autoscaling_disabled:
768-
PLATFORMS=$(PLATFORMS) TEST_CHROMIUM=true RELEASE_NAME=selenium SELENIUM_GRID_AUTOSCALING=false TEST_DELAY_AFTER_TEST=15 CHART_ENABLE_TRACING=true \
773+
PLATFORMS=$(PLATFORMS) TEST_CHROMIUM=true RELEASE_NAME=selenium SELENIUM_GRID_AUTOSCALING=false TEST_DELAY_AFTER_TEST=0 CHART_ENABLE_TRACING=true \
769774
SECURE_INGRESS_ONLY_GENERATE=true SELENIUM_GRID_PROTOCOL=https SELENIUM_GRID_HOST=$$(hostname -i) SELENIUM_GRID_PORT=443 \
770775
VERSION=$(TAG_VERSION) VIDEO_TAG=$(FFMPEG_TAG_VERSION)-$(BUILD_DATE) NAMESPACE=$(NAMESPACE) BINDING_VERSION=$(BINDING_VERSION) \
771776
./tests/charts/make/chart_test.sh NoAutoscaling

NodeBase/selenium.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ stderr_capture_maxbytes=50MB
5757
priority=15
5858
command=bash -c "/opt/bin/start-selenium-node.sh; EXIT_CODE=$?; kill -s SIGINT `cat /var/run/supervisor/supervisord.pid`; exit $EXIT_CODE"
5959
stopasgroup = true
60+
killasgroup=true
6061
autostart=true
6162
autorestart=false
6263
startsecs=0

NodeChromium/Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ LABEL authors=${AUTHORS}
77
USER root
88

99
# Install Chromium
10-
RUN apt-get update -qqy \
11-
&& apt-get install -y software-properties-common \
12-
&& add-apt-repository ppa:xtradeb/apps \
10+
RUN echo "deb http://deb.debian.org/debian/ sid main" >> /etc/apt/sources.list \
11+
&& apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131 \
12+
&& apt-get update -qqy \
1313
&& apt-get -qqy install chromium chromium-l10n \
1414
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
1515

Video/supervisord.conf

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ minprocs=200 ; (min. avail process descriptors;
1414
[program:video-recording]
1515
priority=0
1616
command=/opt/bin/video.sh
17+
stopasgroup = true
18+
killasgroup=true
1719
autostart=true
20+
startsecs=0
1821
autorestart=true
19-
stopsignal=INT
2022

2123
;Logs (all activity redirected to stdout so it can be seen through "docker logs"
2224
redirect_stderr=true
@@ -28,7 +30,6 @@ priority=5
2830
command=python3 /opt/bin/video_ready.py
2931
autostart=true
3032
autorestart=true
31-
stopsignal=INT
3233

3334
;Logs (all activity redirected to stdout so it can be seen through "docker logs"
3435
redirect_stderr=true
@@ -40,7 +41,6 @@ priority=10
4041
command=bash -c "if [ ${SE_VIDEO_INTERNAL_UPLOAD} = "true" ]; then /opt/bin/upload.sh; fi"
4142
autostart=%(ENV_SE_VIDEO_INTERNAL_UPLOAD)s
4243
autorestart=%(ENV_SE_VIDEO_INTERNAL_UPLOAD)s
43-
stopsignal=INT
4444

4545
;Logs (all activity redirected to stdout so it can be seen through "docker logs"
4646
redirect_stderr=true

charts/selenium-grid/configs/distributor/distributorProbe.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ max_time=3
44
retry_time=3
55
probe_name="Probe.${1:-"Liveness"}"
66
ts_format=${SE_LOG_TIMESTAMP_FORMAT:-"+%T.%3N"}
7-
ROUTER_CONFIG_DIRECTORY=${ROUTER_CONFIG_DIRECTORY:-"/opt/selenium"}
7+
ROUTER_CONFIG_DIRECTORY=${ROUTER_CONFIG_DIRECTORY:-$SE_OPT_BIN}
88

99
GRID_GRAPHQL_URL=$(bash ${ROUTER_CONFIG_DIRECTORY}/routerGraphQLUrl.sh)
1010

charts/selenium-grid/configs/node/nodeGridUrl.sh

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33
max_time=3
44

5+
if [ -n "${SE_ROUTER_USERNAME}" ] && [ -n "${SE_ROUTER_PASSWORD}" ]; then
6+
BASIC_AUTH="${SE_ROUTER_USERNAME}:${SE_ROUTER_PASSWORD}@"
7+
fi
8+
if [ "${SE_SUB_PATH}" = "/" ]; then
9+
SE_SUB_PATH=""
10+
fi
11+
512
if [ -z "${SE_HUB_HOST:-$SE_ROUTER_HOST}" ] || [ -z "${SE_HUB_PORT:-$SE_ROUTER_PORT}" ]; then
613
grid_url=""
714
else
8-
if [ -n "${SE_ROUTER_USERNAME}" ] && [ -n "${SE_ROUTER_PASSWORD}" ]; then
9-
BASIC_AUTH="${SE_ROUTER_USERNAME}:${SE_ROUTER_PASSWORD}@"
10-
fi
11-
if [ "${SE_SUB_PATH}" = "/" ]; then
12-
SE_SUB_PATH=""
13-
fi
1415
grid_url=${SE_SERVER_PROTOCOL}://${BASIC_AUTH}${SE_HUB_HOST:-$SE_ROUTER_HOST}:${SE_HUB_PORT:-$SE_ROUTER_PORT}${SE_SUB_PATH}
1516
fi
1617

@@ -19,7 +20,7 @@ if [ -z "${grid_url}" ]; then
1920
fi
2021

2122
if [ -z "${grid_url}" ]; then
22-
return 0
23+
grid_url="${SE_SERVER_PROTOCOL}://${BASIC_AUTH}127.0.0.1:4444${SE_SUB_PATH}" # For standalone mode
2324
fi
2425

2526
grid_url_checks=$(curl --noproxy "*" -m ${max_time} -s -k -o /dev/null -w "%{http_code}" ${grid_url})

charts/selenium-grid/configs/node/nodePreStop.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#!/bin/bash
22

33
probe_name="lifecycle.${1:-"preStop"}"
4-
NODE_CONFIG_DIRECTORY=${NODE_CONFIG_DIRECTORY:-"/opt/selenium"}
4+
SE_NODE_PORT=${SE_NODE_PORT:-"5555"}
5+
NODE_CONFIG_DIRECTORY=${NODE_CONFIG_DIRECTORY:-$SE_OPT_BIN}
56

67
max_time=3
78
retry_time=5

0 commit comments

Comments
 (0)