test-node-discovery-dns.sh 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/usr/bin/env bash
  2. ## Test two-nodes cluster discover each other using DNS A records lookup result.
  3. set -euo pipefail
  4. cd -P -- "$(dirname -- "$0")/.."
  5. IMAGE="${1:-}"
  6. if [ -z "$IMAGE" ]; then
  7. echo "Usage: $0 <EMQX_IMAGE_TAG>"
  8. echo "e.g. $0 docker.io/emqx/emqx:5.0.8"
  9. exit 1
  10. fi
  11. NET='test_node_discovery_dns'
  12. NODE1='emqx1'
  13. NODE2='emqx2'
  14. COOKIE='this-is-a-secret'
  15. # cleanup
  16. docker rm -f dnsmasq >/dev/null 2>&1 || true
  17. docker rm -f "$NODE1" >/dev/null 2>&1 || true
  18. docker rm -f "$NODE2" >/dev/null 2>&1 || true
  19. docker network rm "$NET" >/dev/null 2>&1 || true
  20. docker network create --subnet=172.18.0.0/16 $NET
  21. IP0="172.18.0.100"
  22. IP1="172.18.0.101"
  23. IP2="172.18.0.102"
  24. DOMAIN="dnstest.mynet"
  25. # create configs for dnsmasq
  26. cat <<-EOF > "/tmp/dnsmasq.conf"
  27. conf-dir=/etc/dnsmasq,*.conf
  28. addn-hosts=/etc/hosts.$DOMAIN
  29. EOF
  30. cat <<-EOF > "/tmp/hosts.$DOMAIN"
  31. $IP1 $DOMAIN
  32. $IP2 $DOMAIN
  33. EOF
  34. cat <<-EOF > /tmp/dnsmasq.base.conf
  35. domain-needed
  36. bogus-priv
  37. no-hosts
  38. keep-in-foreground
  39. no-resolv
  40. expand-hosts
  41. server=8.8.8.8
  42. EOF
  43. docker run -d -t --name dnsmasq \
  44. --net "$NET" \
  45. --ip "$IP0" \
  46. -v /tmp/dnsmasq.conf:/etc/dnsmasq.conf \
  47. -v "/tmp/hosts.$DOMAIN:/etc/hosts.$DOMAIN" \
  48. -v "/tmp/dnsmasq.base.conf:/etc/dnsmasq/0.base.conf" \
  49. --cap-add=NET_ADMIN \
  50. storytel/dnsmasq dnsmasq --no-daemon --log-queries
  51. # Node names (the part before '@') should be all the same in the cluster
  52. # e.g. emqx@${IP}
  53. start_emqx_v5() {
  54. NAME="$1"
  55. IP="$2"
  56. DASHBOARD_PORT="$3"
  57. docker run -d -t \
  58. --name "$NAME" \
  59. --net "$NET" \
  60. --ip "$IP" \
  61. --dns "$IP0" \
  62. -p "$DASHBOARD_PORT:18083" \
  63. -e EMQX_NODE_NAME="emqx@${IP}" \
  64. -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug \
  65. -e EMQX_NODE_COOKIE="$COOKIE" \
  66. -e EMQX_cluster__discovery_strategy='dns' \
  67. -e EMQX_cluster__dns__name="$DOMAIN" \
  68. -e EMQX_cluster__dns__record_type="a" \
  69. "$IMAGE"
  70. }
  71. ## EMQX v4 has different configuration schema:
  72. # EMQX_NODE_NAME="emqx@${IP}":
  73. # This is necessary because 4.x docker entrypoint
  74. # by default uses docker container ID as node name
  75. # (the part before @ of e.g. emqx@172.18.0.101)
  76. # EMQX_cluster__dns__app
  77. # This must be the same as node name in 4.x
  78. # EMQX_cluster__discovery
  79. # This in 5.0 is EMQX_cluster__discovery_strategy
  80. # EMQX_cluster__dns__name
  81. # The DNS domain to lookup for peer nodes
  82. # EMQX_cluster__dns__record_type
  83. # The DNS record type. (only 'a' type is tested)
  84. start_emqx_v4() {
  85. NAME="$1"
  86. IP="$2"
  87. APP_NAME="emqx"
  88. DASHBOARD_PORT="$3"
  89. docker run -d -t \
  90. --name "$NAME" \
  91. --net "$NET" \
  92. --ip "$IP" \
  93. --dns "$IP0" \
  94. -p "$DASHBOARD_PORT:18083" \
  95. -e EMQX_NODE_NAME="${APP_NAME}@${IP}" \
  96. -e EMQX_LOG__LEVEL=debug \
  97. -e EMQX_NODE_COOKIE="$COOKIE" \
  98. -e EMQX_cluster__discovery='dns' \
  99. -e EMQX_cluster__dns__name="$DOMAIN" \
  100. -e EMQX_cluster__dns__app="${APP_NAME}" \
  101. -e EMQX_cluster__dns__record_type="a" \
  102. "$IMAGE"
  103. }
  104. case "${IMAGE}" in
  105. *emqx:4.*|*emqx-ee:4.*)
  106. start_emqx_v4 "$NODE1" "$IP1" 18083
  107. start_emqx_v4 "$NODE2" "$IP2" 18084
  108. ;;
  109. *)
  110. start_emqx_v5 "$NODE1" "$IP1" 18083
  111. start_emqx_v5 "$NODE2" "$IP2" 18084
  112. ;;
  113. esac