| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/usr/bin/env bash
- ## Test two-nodes cluster discover each other using DNS A records lookup result.
- set -euo pipefail
- cd -P -- "$(dirname -- "$0")/.."
- IMAGE="${1:-}"
- if [ -z "$IMAGE" ]; then
- echo "Usage: $0 <EMQX_IMAGE_TAG>"
- echo "e.g. $0 docker.io/emqx/emqx:5.0.8"
- exit 1
- fi
- NET='test_node_discovery_dns'
- NODE1='emqx1'
- NODE2='emqx2'
- COOKIE='this-is-a-secret'
- # cleanup
- docker rm -f dnsmasq >/dev/null 2>&1 || true
- docker rm -f "$NODE1" >/dev/null 2>&1 || true
- docker rm -f "$NODE2" >/dev/null 2>&1 || true
- docker network rm "$NET" >/dev/null 2>&1 || true
- docker network create --subnet=172.18.0.0/16 $NET
- IP0="172.18.0.100"
- IP1="172.18.0.101"
- IP2="172.18.0.102"
- DOMAIN="dnstest.mynet"
- # create configs for dnsmasq
- cat <<-EOF > "/tmp/dnsmasq.conf"
- conf-dir=/etc/dnsmasq,*.conf
- addn-hosts=/etc/hosts.$DOMAIN
- EOF
- cat <<-EOF > "/tmp/hosts.$DOMAIN"
- $IP1 $DOMAIN
- $IP2 $DOMAIN
- EOF
- cat <<-EOF > /tmp/dnsmasq.base.conf
- domain-needed
- bogus-priv
- no-hosts
- keep-in-foreground
- no-resolv
- expand-hosts
- server=8.8.8.8
- EOF
- docker run -d -t --name dnsmasq \
- --net "$NET" \
- --ip "$IP0" \
- -v /tmp/dnsmasq.conf:/etc/dnsmasq.conf \
- -v "/tmp/hosts.$DOMAIN:/etc/hosts.$DOMAIN" \
- -v "/tmp/dnsmasq.base.conf:/etc/dnsmasq/0.base.conf" \
- --cap-add=NET_ADMIN \
- storytel/dnsmasq dnsmasq --no-daemon --log-queries
- # Node names (the part before '@') should be all the same in the cluster
- # e.g. emqx@${IP}
- start_emqx_v5() {
- NAME="$1"
- IP="$2"
- DASHBOARD_PORT="$3"
- docker run -d -t \
- --name "$NAME" \
- --net "$NET" \
- --ip "$IP" \
- --dns "$IP0" \
- -p "$DASHBOARD_PORT:18083" \
- -e EMQX_NODE_NAME="emqx@${IP}" \
- -e EMQX_LOG__CONSOLE_HANDLER__LEVEL=debug \
- -e EMQX_NODE_COOKIE="$COOKIE" \
- -e EMQX_cluster__discovery_strategy='dns' \
- -e EMQX_cluster__dns__name="$DOMAIN" \
- -e EMQX_cluster__dns__record_type="a" \
- "$IMAGE"
- }
- ## EMQX v4 has different configuration schema:
- # EMQX_NODE_NAME="emqx@${IP}":
- # This is necessary because 4.x docker entrypoint
- # by default uses docker container ID as node name
- # (the part before @ of e.g. emqx@172.18.0.101)
- # EMQX_cluster__dns__app
- # This must be the same as node name in 4.x
- # EMQX_cluster__discovery
- # This in 5.0 is EMQX_cluster__discovery_strategy
- # EMQX_cluster__dns__name
- # The DNS domain to lookup for peer nodes
- # EMQX_cluster__dns__record_type
- # The DNS record type. (only 'a' type is tested)
- start_emqx_v4() {
- NAME="$1"
- IP="$2"
- APP_NAME="emqx"
- DASHBOARD_PORT="$3"
- docker run -d -t \
- --name "$NAME" \
- --net "$NET" \
- --ip "$IP" \
- --dns "$IP0" \
- -p "$DASHBOARD_PORT:18083" \
- -e EMQX_NODE_NAME="${APP_NAME}@${IP}" \
- -e EMQX_LOG__LEVEL=debug \
- -e EMQX_NODE_COOKIE="$COOKIE" \
- -e EMQX_cluster__discovery='dns' \
- -e EMQX_cluster__dns__name="$DOMAIN" \
- -e EMQX_cluster__dns__app="${APP_NAME}" \
- -e EMQX_cluster__dns__record_type="a" \
- "$IMAGE"
- }
- case "${IMAGE}" in
- *emqx:4.*|*emqx-ee:4.*)
- start_emqx_v4 "$NODE1" "$IP1" 18083
- start_emqx_v4 "$NODE2" "$IP2" 18084
- ;;
- *)
- start_emqx_v5 "$NODE1" "$IP1" 18083
- start_emqx_v5 "$NODE2" "$IP2" 18084
- ;;
- esac
|