start-relup-test-cluster.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ## EMQX can only start with longname (https://erlang.org/doc/reference_manual/distributed.html)
  4. ## The host name part of EMQX's node name has to be static, this means we should either
  5. ## pre-assign static IP for containers, or ensure containers can communiate with each other by name
  6. ## this is why a docker network is created, and the containers's names have a dot.
  7. # ensure dir
  8. cd -P -- "$(dirname -- "$0")/../.."
  9. set -x
  10. IMAGE="${1}"
  11. PKG="$(readlink -f "${2}")"
  12. NET='emqx.io'
  13. NODE1="node1.$NET"
  14. NODE2="node2.$NET"
  15. WEBHOOK="webhook.$NET"
  16. BENCH="bench.$NET"
  17. COOKIE='this-is-a-secret'
  18. ## Erlang image is needed to run webhook server and emqtt-bench
  19. ERLANG_IMAGE="ghcr.io/emqx/emqx-builder/5.0-26:1.13.4-24.3.4.2-1-ubuntu20.04"
  20. # builder has emqtt-bench installed
  21. BENCH_IMAGE="$ERLANG_IMAGE"
  22. ## clean up
  23. docker rm -f "$BENCH" >/dev/null 2>&1 || true
  24. docker rm -f "$WEBHOOK" >/dev/null 2>&1 || true
  25. docker rm -f "$NODE1" >/dev/null 2>&1 || true
  26. docker rm -f "$NODE2" >/dev/null 2>&1 || true
  27. docker network rm "$NET" >/dev/null 2>&1 || true
  28. docker network create "$NET"
  29. docker run -d -t --name "$NODE1" \
  30. --net "$NET" \
  31. -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=warning \
  32. -e EMQX_NODE_NAME="emqx@$NODE1" \
  33. -e EMQX_NODE_COOKIE="$COOKIE" \
  34. -p 18083:18083 \
  35. -v "$PKG:/emqx.tar.gz" \
  36. -v "$(pwd)/scripts/relup-test/run-pkg.sh:/run-pkg.sh" \
  37. "$IMAGE" /run-pkg.sh emqx.tar.gz
  38. docker run -d -t --name "$NODE2" \
  39. --net "$NET" \
  40. -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=warning \
  41. -e EMQX_NODE_NAME="emqx@$NODE2" \
  42. -e EMQX_NODE_COOKIE="$COOKIE" \
  43. -p 18084:18083 \
  44. -v "$PKG:/emqx.tar.gz" \
  45. -v "$(pwd)/scripts/relup-test/run-pkg.sh:/run-pkg.sh" \
  46. "$IMAGE" /run-pkg.sh emqx.tar.gz
  47. docker run -d -t --name "$WEBHOOK" \
  48. --net "$NET" \
  49. -v "$(pwd)/.ci/fvt_tests/http_server:/http_server" \
  50. -w /http_server \
  51. -p 7077:7077 \
  52. "$ERLANG_IMAGE" bash -c 'rebar3 compile; erl -pa _build/default/lib/*/ebin -eval "http_server:start()"'
  53. docker run -d -t --name "$BENCH" \
  54. --net "$NET" \
  55. "$BENCH_IMAGE" \
  56. bash -c 'sleep 10000; exit 1'
  57. wait_limit=60
  58. wait_for_emqx() {
  59. wait_sec=0
  60. container="$1"
  61. wait_limit="$2"
  62. set +x
  63. while ! docker exec "$container" emqx_ctl status >/dev/null 2>&1; do
  64. wait_sec=$(( wait_sec + 1 ))
  65. if [ $wait_sec -gt "$wait_limit" ]; then
  66. echo "timeout wait for EMQX"
  67. exit 1
  68. fi
  69. echo -n '.'
  70. sleep 1
  71. done
  72. }
  73. wait_for_webhook() {
  74. wait_sec=0
  75. wait_limit="$1"
  76. set +x
  77. while ! curl -f -s localhost:7077; do
  78. wait_sec=$(( wait_sec + 1 ))
  79. if [ $wait_sec -gt "$wait_limit" ]; then
  80. echo "timeout wait for webhook"
  81. exit 1
  82. fi
  83. echo -n '.'
  84. sleep 1
  85. done
  86. }
  87. # wait for webhook http server to start,
  88. # it may take a while because it needs to compile from source code
  89. wait_for_webhook 120
  90. # after webhook start, it should not cost more than 30 seconds
  91. wait_for_emqx $NODE1 30
  92. # afer node1 is up, it should not cost more than 10 seconds
  93. wait_for_emqx $NODE2 10
  94. echo
  95. docker exec $NODE1 emqx_ctl cluster join "emqx@$NODE2"