Skip to content

Commit 7323abc

Browse files
Merge pull request #12165 from rabbitmq/run-selenium-on-cluster
Run Selenium suites against a cluster of nodes
2 parents 3dbff1b + 77b63d6 commit 7323abc

File tree

19 files changed

+279
-53
lines changed

19 files changed

+279
-53
lines changed

.github/workflows/test-selenium.yaml

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,36 @@ jobs:
8585
cd ${SELENIUM_DIR}
8686
docker build -t mocha-test --target test .
8787
88-
- name: Run Suites
88+
- name: Run full ui suites on a standalone rabbitmq server
8989
run: |
90-
RABBITMQ_DOCKER_IMAGE=bazel/packaging/docker-image:rabbitmq-amd64 ${SELENIUM_DIR}/run-suites.sh
90+
RABBITMQ_DOCKER_IMAGE=bazel/packaging/docker-image:rabbitmq-amd64 \
91+
${SELENIUM_DIR}/run-suites.sh
92+
mkdir -p /tmp/full-suite
93+
mv /tmp/selenium/* /tmp/full-suite
94+
mkdir -p /tmp/full-suite/logs
95+
mv ${SELENIUM_DIR}/logs/* /tmp/full-suite/logs
96+
mkdir -p /tmp/full-suite/screens
97+
mv ${SELENIUM_DIR}/screens/* /tmp/full-suite/screens
98+
99+
- name: Run short ui suite on a 3-node rabbitmq cluster
100+
run: |
101+
RABBITMQ_DOCKER_IMAGE=bazel/packaging/docker-image:rabbitmq-amd64 \
102+
ADDON_PROFILES=cluster ${SELENIUM_DIR}/run-suites.sh short-suite-management-ui
103+
mkdir -p /tmp/short-suite
104+
mv /tmp/selenium/* /tmp/short-suite
105+
mkdir -p /tmp/short-suite/logs
106+
mv ${SELENIUM_DIR}/logs/* /tmp/short-suite/logs
107+
mkdir -p /tmp/short-suite/screens
108+
mv ${SELENIUM_DIR}/screens/* /tmp/short-suite/screens
91109
92110
- name: Upload Test Artifacts
93111
if: always()
94112
uses: actions/upload-artifact@v4.3.2
95113
with:
96114
name: test-artifacts-${{ matrix.browser }}-${{ matrix.erlang_version }}
97115
path: |
98-
logs/*
99-
screens/*
100-
/tmp/selenium/*
116+
/tmp/full-suite
117+
/tmp/short-suite
101118
102119
summary-selenium:
103120
needs:

deps/rabbitmq_management/selenium/bin/components/rabbitmq

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,42 @@ init_rabbitmq() {
1010
[[ -z "${OAUTH_SERVER_CONFIG_DIR}" ]] || print "> OAUTH_SERVER_CONFIG_DIR: ${OAUTH_SERVER_CONFIG_DIR}"
1111

1212
}
13+
1314
start_rabbitmq() {
1415
if [[ "$PROFILES" == *"docker"* ]]; then
15-
start_docker_rabbitmq
16+
if [[ "$PROFILES" == *"cluster"* ]]; then
17+
start_docker_cluster_rabbitmq
18+
else
19+
start_docker_rabbitmq
20+
fi
1621
else
1722
start_local_rabbitmq
1823
fi
1924
}
20-
25+
stop_rabbitmq() {
26+
if [[ "$PROFILES" == *"docker"* ]]; then
27+
if [[ "$PROFILES" == *"cluster"* ]]; then
28+
docker compose -f $CONF_DIR/rabbitmq/compose.yml kill
29+
else
30+
kill_container_if_exist "$component"
31+
fi
32+
else
33+
stop_local_rabbitmq
34+
fi
35+
}
36+
stop_local_rabbitmq() {
37+
RABBITMQ_SERVER_ROOT=$(realpath $TEST_DIR/../../../../)
38+
gmake --directory=${RABBITMQ_SERVER_ROOT} stop-node
39+
}
40+
save_logs_rabbitmq() {
41+
if [[ "$PROFILES" == *"docker"* ]]; then
42+
if [[ "$PROFILES" == *"cluster"* ]]; then
43+
docker compose -f $CONF_DIR/rabbitmq/compose.yml logs > $LOGS/rabbitmq.log
44+
else
45+
save_container_logs "rabbitmq"
46+
fi
47+
fi
48+
}
2149
start_local_rabbitmq() {
2250
begin "Starting rabbitmq ..."
2351

@@ -31,22 +59,76 @@ start_local_rabbitmq() {
3159

3260
print "> EFFECTIVE RABBITMQ_CONFIG_FILE: /tmp$MOUNT_RABBITMQ_CONF"
3361
${BIN_DIR}/gen-advanced-config ${RABBITMQ_CONFIG_DIR} $ENV_FILE /tmp$MOUNT_ADVANCED_CONFIG
62+
cp ${RABBITMQ_CONFIG_DIR}/enabled_plugins /tmp/etc/rabbitmq/
3463
RESULT=$?
3564
if [ $RESULT -eq 0 ]; then
3665
print "> EFFECTIVE RABBITMQ_CONFIG_FILE: /tmp$MOUNT_ADVANCED_CONFIG"
3766
gmake --directory=${RABBITMQ_SERVER_ROOT} run-broker \
38-
RABBITMQ_ENABLED_PLUGINS_FILE=${RABBITMQ_CONFIG_DIR}/enabled_plugins \
67+
RABBITMQ_ENABLED_PLUGINS_FILE=/tmp/etc/rabbitmq/enabled_plugins \
3968
RABBITMQ_CONFIG_FILE=/tmp$MOUNT_RABBITMQ_CONF \
4069
RABBITMQ_ADVANCED_CONFIG_FILE=/tmp$MOUNT_ADVANCED_CONFIG
4170
else
4271
gmake --directory=${RABBITMQ_SERVER_ROOT} run-broker \
43-
RABBITMQ_ENABLED_PLUGINS_FILE=${RABBITMQ_CONFIG_DIR}/enabled_plugins \
72+
RABBITMQ_ENABLED_PLUGINS_FILE=/tmp/etc/rabbitmq/enabled_plugins \
4473
RABBITMQ_CONFIG_FILE=/tmp$MOUNT_RABBITMQ_CONF
4574
fi
4675
print "> RABBITMQ_TEST_DIR: ${RABBITMQ_CONFIG_DIR}"
4776

4877

4978
}
79+
start_docker_cluster_rabbitmq() {
80+
begin "Starting rabbitmq cluster in docker ..."
81+
init_rabbitmq
82+
kill_container_if_exist rabbitmq
83+
kill_container_if_exist rabbitmq1
84+
kill_container_if_exist rabbitmq2
85+
86+
mkdir -p $CONF_DIR/rabbitmq
87+
MOUNT_RABBITMQ_CONF="/etc/rabbitmq/rabbitmq.conf"
88+
MOUNT_ADVANCED_CONFIG="/etc/rabbitmq/advanced.config"
89+
90+
RABBITMQ_TEST_DIR="/var/rabbitmq" ${BIN_DIR}/gen-rabbitmq-conf ${RABBITMQ_CONFIG_DIR} $ENV_FILE $CONF_DIR/rabbitmq/rabbitmq.conf
91+
print "> EFFECTIVE RABBITMQ_CONFIG_FILE: $CONF_DIR/rabbitmq/rabbitmq.conf"
92+
${BIN_DIR}/gen-advanced-config ${RABBITMQ_CONFIG_DIR} $ENV_FILE /$CONF_DIR/rabbitmq/advanced.config
93+
RESULT=$?
94+
if [ $RESULT -eq 0 ]; then
95+
if [ -s $RESULT ]; then
96+
print "> EFFECTIVE ADVANCED_CONFIG_FILE: $CONF_DIR/rabbitmq/advanced.config"
97+
else
98+
rm $CONF_DIR/rabbitmq/advanced.config
99+
fi
100+
fi
101+
mkdir -p $CONF_DIR/rabbitmq/conf.d/
102+
cp ${RABBITMQ_CONFIG_DIR}/logging.conf $CONF_DIR/rabbitmq/conf.d/
103+
if [ -f ${RABBITMQ_CONFIG_DIR}/enabled_plugins ]; then
104+
cp ${RABBITMQ_CONFIG_DIR}/enabled_plugins $CONF_DIR/rabbitmq
105+
fi
106+
if [ -d ${RABBITMQ_CONFIG_DIR}/certs ]; then
107+
cp -r ${RABBITMQ_CONFIG_DIR}/certs $CONF_DIR/rabbitmq
108+
fi
109+
if [ -d ${RABBITMQ_CONFIG_DIR}/imports ]; then
110+
cp -r ${RABBITMQ_CONFIG_DIR}/imports $CONF_DIR/rabbitmq
111+
fi
112+
113+
cat > $CONF_DIR/rabbitmq/image_compose.yml <<EOF
114+
x-rabbitmq_image: &rabbitmq_image
115+
image: ${RABBITMQ_DOCKER_IMAGE}
116+
volumes:
117+
- $CONF_DIR/rabbitmq/:/etc/rabbitmq
118+
- $CONF_DIR/rabbitmq/:/var/rabbitmq
119+
- ${TEST_DIR}:/config
120+
EOF
121+
cat $CONF_DIR/rabbitmq/image_compose.yml > $CONF_DIR/rabbitmq/compose.yml
122+
cat ${BIN_DIR}/components/../rabbit-compose.yml >> $CONF_DIR/rabbitmq/compose.yml
123+
124+
docker compose -f $CONF_DIR/rabbitmq/compose.yml up -d
125+
126+
wait_for_message rabbitmq "Server startup complete"
127+
wait_for_message rabbitmq1 "Server startup complete"
128+
wait_for_message rabbitmq2 "Server startup complete"
129+
end "RabbitMQ cluster ready"
130+
}
131+
50132
start_docker_rabbitmq() {
51133
begin "Starting rabbitmq in docker ..."
52134

deps/rabbitmq_management/selenium/bin/components/selenium

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

3-
arch=$(uname -i)
3+
arch=$(uname -a)
44
if [[ $arch == arm* ]]; then
55
SELENIUM_DOCKER_IMAGE=selenium/standalone-chrome:123.0
66
else
77
SELENIUM_DOCKER_IMAGE=seleniarm/standalone-chromium:123.0
8-
fi
8+
fi
99

1010
start_selenium() {
1111
begin "Starting selenium ..."

deps/rabbitmq_management/selenium/bin/gen-advanced-config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ then
2828
fi
2929
if [ "$FOUND_TEMPLATES_COUNT" -lt 1 ]
3030
then
31+
rm $FINAL_CONFIG_FILE
3132
exit -1
3233
fi
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
3+
# https://docs.docker.com/compose/compose-file/#networks
4+
networks:
5+
rabbitmq_net:
6+
name: rabbitmq_net
7+
external: true
8+
9+
services:
10+
rmq0: &rabbitmq
11+
# https://hub.docker.com/r/pivotalrabbitmq/rabbitmq-prometheus/tags
12+
<< : *rabbitmq_image
13+
networks:
14+
- "rabbitmq_net"
15+
ports:
16+
- "5672:5672"
17+
- "15672:15672"
18+
- "15692:15692"
19+
# https://unix.stackexchange.com/questions/71940/killing-tcp-connection-in-linux
20+
# https://en.wikipedia.org/wiki/Tcpkill
21+
# https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands#block-an-ip-address
22+
cap_add:
23+
- ALL
24+
hostname: rabbitmq
25+
container_name: rabbitmq
26+
environment:
27+
RABBITMQ_ERLANG_COOKIE: rmq0
28+
29+
# we want to simulate hitting thresholds
30+
ulimits:
31+
nofile:
32+
soft: "2000"
33+
hard: "2000"
34+
rmq1:
35+
<< : *rabbitmq
36+
container_name: rabbitmq1
37+
hostname: rabbitmq1
38+
ports:
39+
- "5677:5672"
40+
- "15677:15672"
41+
- "15697:15692"
42+
rmq2:
43+
<< : *rabbitmq
44+
hostname: rabbitmq2
45+
container_name: rabbitmq2
46+
ports:
47+
- "5678:5672"
48+
- "15678:15672"
49+
- "15698:15692"

deps/rabbitmq_management/selenium/bin/suite_template

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ SCREENS=${SELENIUM_ROOT_FOLDER}/screens/${SUITE}
3232
CONF_DIR=/tmp/selenium/${SUITE}
3333
ENV_FILE=$CONF_DIR/.env
3434

35+
rm -rf $CONF_DIR
36+
3537
for f in $SCRIPT/components/*; do
3638
if [[ ! "$f" == *README.md ]]
3739
then
@@ -54,6 +56,9 @@ parse_arguments() {
5456
elif [[ "$1" == "stop-others" ]]
5557
then
5658
echo "stop-others"
59+
elif [[ "$1" == "stop-rabbitmq" ]]
60+
then
61+
echo "stop-rabbitmq"
5762
elif [[ "$1" == "test" ]]
5863
then
5964
echo "test $2"
@@ -107,7 +112,10 @@ init_suite() {
107112
print "> TEST_CASES_DIR: ${TEST_CASES_DIR} "
108113
print "> TEST_CONFIG_DIR: ${TEST_CONFIG_DIR} "
109114
print "> DOCKER_NETWORK: ${DOCKER_NETWORK} "
110-
print "> PROFILES: ${PROFILES} "
115+
print "> initial PROFILES: ${PROFILES} "
116+
print "> (+) ADDON_PROFILES: ${ADDON_PROFILES} "
117+
PROFILES="${PROFILES} ${ADDON_PROFILES}"
118+
print "> (=) final PROFILES: ${PROFILES} "
111119
print "> ENV_FILE: ${ENV_FILE} "
112120
print "> COMMAND: ${COMMAND}"
113121
end "Initialized suite"
@@ -239,25 +247,68 @@ wait_for_url_docker() {
239247
done
240248
}
241249

242-
250+
test_on_cluster() {
251+
IFS=', ' read -r -a array <<< "$RABBITMQ_CLUSTER_NODES"
252+
begin "Running against all nodes in cluster $RABBITMQ_CLUSTER_NODES :"
253+
for item in "${array[@]}"
254+
do
255+
RMQ_HOST_0=${RABBITMQ_HOST:-rabbitmq:15672}
256+
RMQ_HOST=$(rewrite_rabbitmq_hostname ${item} $RMQ_HOST_0)
257+
PUBLIC_RMQ_HOST_0=${PUBLIC_RABBITMQ_HOST:-$RMQ_HOST}
258+
PUBLIC_RMQ_HOST=$(rewrite_rabbitmq_hostname ${item} $PUBLIC_RMQ_HOST_0)
259+
RMQ_URL=$(calculate_rabbitmq_url $PUBLIC_RMQ_HOST)
260+
RMQ_HOSTNAME=${item}
261+
_test $RMQ_HOST \
262+
$PUBLIC_RMQ_HOST \
263+
$RMQ_URL \
264+
$RMQ_HOSTNAME
265+
TEST_RESULT=$?
266+
if [ $TEST_RESULT -ne 0 ]; then
267+
break
268+
fi
269+
done
270+
end "Finishing running test ($TEST_RESULT)"
271+
}
272+
rewrite_rabbitmq_hostname() {
273+
IFS=':' read -r -a array <<< "$2"
274+
if [ "${array[0]}" == "rabbitmq" ]; then
275+
echo "${2//rabbitmq/$1}"
276+
else
277+
echo "$2"
278+
fi
279+
}
243280
test() {
281+
if [[ "$PROFILES" == *"cluster"* && ! -z "$RABBITMQ_CLUSTER_NODES" ]]; then
282+
test_on_cluster
283+
else
284+
RMQ_HOST=${RABBITMQ_HOST:-rabbitmq:15672}
285+
PUBLIC_RMQ_HOST=${PUBLIC_RABBITMQ_HOST:-$RMQ_HOST}
286+
_test $RABBITMQ_HOST \
287+
$PUBLIC_RMQ_HOST \
288+
$(calculate_rabbitmq_url $PUBLIC_RMQ_HOST) \
289+
${RABBITMQ_HOSTNAME:-rabbitmq}
290+
fi
291+
}
292+
293+
_test() {
294+
RMQ_HOST=$1
295+
PUBLIC_RMQ_HOST=$2
296+
RMQ_URL=$3
297+
RMQ_HOSTNAME=$4
298+
244299
kill_container_if_exist mocha
245-
begin "Running tests with env variables:"
300+
begin "Running tests against $RMQ_HOSTNAME with these env variable:"
246301

247-
RABBITMQ_HOST=${RABBITMQ_HOST:-rabbitmq:15672}
248-
PUBLIC_RABBITMQ_HOST=${PUBLIC_RABBITMQ_HOST:-$RABBITMQ_HOST}
249-
RABBITMQ_URL=$(calculate_rabbitmq_url $PUBLIC_RABBITMQ_HOST)
250-
RABBITMQ_HOSTNAME=${RABBITMQ_HOSTNAME:-rabbitmq}
251302
SELENIUM_TIMEOUT=${SELENIUM_TIMEOUT:-20000}
252303
SELENIUM_POLLING=${SELENIUM_POLLING:-500}
253304

254305
print "> SELENIUM_TIMEOUT: ${SELENIUM_TIMEOUT}"
255306
print "> SELENIUM_POLLING: ${SELENIUM_POLLING}"
256-
print "> RABBITMQ_HOST: ${RABBITMQ_HOST}"
257-
print "> RABBITMQ_HOSTNAME: ${RABBITMQ_HOSTNAME}"
258-
print "> PUBLIC_RABBITMQ_HOST: ${PUBLIC_RABBITMQ_HOST}"
307+
print "> RABBITMQ_HOST: ${RMQ_HOST}"
308+
print "> RABBITMQ_HOSTNAME: ${RMQ_HOSTNAME}"
309+
print "> PUBLIC_RABBITMQ_HOST: ${PUBLIC_RMQ_HOST}"
259310
print "> RABBITMQ_PATH: ${RABBITMQ_PATH}"
260-
print "> RABBITMQ_URL: ${RABBITMQ_URL}"
311+
print "> RABBITMQ_URL: ${RMQ_URL}"
261312
print "> UAA_URL: ${UAA_URL}"
262313
print "> FAKEPORTAL_URL: ${FAKEPORTAL_URL}"
263314
mocha_test_tag=($(md5sum $SELENIUM_ROOT_FOLDER/package.json))
@@ -270,8 +321,8 @@ test() {
270321
--rm \
271322
--name mocha \
272323
--net ${DOCKER_NETWORK} \
273-
--env RABBITMQ_URL=${RABBITMQ_URL} \
274-
--env RABBITMQ_HOSTNAME=${RABBITMQ_HOSTNAME} \
324+
--env RABBITMQ_URL=${RMQ_URL} \
325+
--env RABBITMQ_HOSTNAME=${RMQ_HOSTNAME} \
275326
--env UAA_URL=${UAA_URL} \
276327
--env FAKE_PORTAL_URL=${FAKEPORTAL_URL} \
277328
--env RUN_LOCAL=false \
@@ -354,6 +405,9 @@ run_local_with() {
354405
elif [[ "$COMMAND" == "stop-others" ]]
355406
then
356407
teardown_local_others
408+
elif [[ "$COMMAND" == "stop-rabbitmq" ]]
409+
then
410+
stop_local_rabbitmq
357411
elif [[ "$COMMAND" =~ test[[:space:]]*([^[:space:]]*) ]]
358412
then
359413
test_local ${BASH_REMATCH[1]}
@@ -466,13 +520,15 @@ start_components() {
466520
$start
467521
done
468522
}
523+
469524
teardown_components() {
470525
begin "Tear down ..."
471526
for i in "${REQUIRED_COMPONENTS[@]}"
472527
do
473528
local component="$i"
529+
stop="stop_$i"
530+
type "$stop" &>/dev/null && $stop || kill_container_if_exist "$component"
474531
print "Tear down $component"
475-
kill_container_if_exist "$component"
476532
done
477533
end "Finished teardown"
478534
}
@@ -481,8 +537,9 @@ save_components_logs() {
481537
for i in "${REQUIRED_COMPONENTS[@]}"
482538
do
483539
local component="$i"
540+
save="save_logs_$i"
541+
type "$save" &>/dev/null && $save || save_container_logs "$component"
484542
print "Saving logs for component $component"
485-
save_container_logs "$component"
486543
done
487544
end "Finished saving logs"
488545
}

0 commit comments

Comments
 (0)