diff options
| author | Michael Klishin <michael@novemberain.com> | 2017-04-25 13:09:06 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-04-25 13:09:06 +0200 |
| commit | b03a14fc1649d2d79ec01c55d39884dce7c2d748 (patch) | |
| tree | 3baad871ba470b1ca32224564453c41d9b4018df | |
| parent | 261efd9458afb7c1f2eb6c23405415afd4e73740 (diff) | |
| parent | 0bb59f8df0a5c8dffa2677db3fb46c719c85eb6a (diff) | |
| download | rabbitmq-server-git-b03a14fc1649d2d79ec01c55d39884dce7c2d748.tar.gz | |
Merge pull request #1189 from rabbitmq/rabbitmq-server-1171
Add IPv6 support for DNS discovery
| -rw-r--r-- | src/rabbit_peer_discovery_dns.erl | 21 | ||||
| -rw-r--r-- | test/peer_discovery_dns_SUITE.erl | 34 |
2 files changed, 41 insertions, 14 deletions
diff --git a/src/rabbit_peer_discovery_dns.erl b/src/rabbit_peer_discovery_dns.erl index 5bc85d340d..f048a40c89 100644 --- a/src/rabbit_peer_discovery_dns.erl +++ b/src/rabbit_peer_discovery_dns.erl @@ -75,14 +75,25 @@ discover_nodes(SeedHostname, LongNamesUsed) -> H <- discover_hostnames(SeedHostname, LongNamesUsed)]. discover_hostnames(SeedHostname, LongNamesUsed) -> - %% TODO: IPv6 support - IPs = inet_res:lookup(SeedHostname, in, a), - rabbit_log:info("Addresses discovered via A records of ~s: ~s", - [SeedHostname, string:join([inet_parse:ntoa(IP) || IP <- IPs], ", ")]), + lookup(SeedHostname, LongNamesUsed, ipv4) ++ + lookup(SeedHostname, LongNamesUsed, ipv6). + +decode_record(ipv4) -> + a; +decode_record(ipv6) -> + aaaa. + +lookup(SeedHostname, LongNamesUsed, IPv) -> + IPs = inet_res:lookup(SeedHostname, in, decode_record(IPv)), + rabbit_log:info("Addresses discovered via ~s records of ~s: ~s", + [string:to_upper(atom_to_list(decode_record(IPv))), + SeedHostname, + string:join([inet_parse:ntoa(IP) || IP <- IPs], ", ")]), Hosts = [extract_host(inet:gethostbyaddr(A), LongNamesUsed, A) || - A <- IPs], + A <- IPs], lists:filter(fun(E) -> E =/= error end, Hosts). + %% long node names are used extract_host({ok, {hostent, FQDN, _, _, _, _}}, true, _Address) -> FQDN; diff --git a/test/peer_discovery_dns_SUITE.erl b/test/peer_discovery_dns_SUITE.erl index 687569890f..7deb38ba97 100644 --- a/test/peer_discovery_dns_SUITE.erl +++ b/test/peer_discovery_dns_SUITE.erl @@ -33,7 +33,8 @@ groups() -> hostname_discovery_with_long_node_names, hostname_discovery_with_short_node_names, node_discovery_with_long_node_names, - node_discovery_with_short_node_names + node_discovery_with_short_node_names, + test_aaaa_record_hostname_discovery ]} ]. @@ -54,7 +55,9 @@ suite() -> %% * One does not resolve to a [typically] non-reachable IP %% * One does not support reverse lookup queries --define(DISCOVERY_ENDPOINT, "peer_discovery.tests.rabbitmq.net"). +-define(DISCOVERY_ENDPOINT_RECORD_A, "peer_discovery.tests.rabbitmq.net"). + +-define(DISCOVERY_ENDPOINT_RECORD_AAAA, "www.v6.facebook.com"). init_per_suite(Config) -> rabbit_ct_helpers:log_environment(), @@ -63,17 +66,26 @@ init_per_suite(Config) -> end_per_suite(Config) -> rabbit_ct_helpers:run_teardown_steps(Config). + +init_per_testcase(test_aaaa_record, Config) -> + case inet_res:lookup(?DISCOVERY_ENDPOINT_RECORD_AAAA, in, aaaa) of + [] -> + {skip, "pre-configured AAAA record does not resolve, skipping"}; + [_ | _] -> + Config + end; + init_per_testcase(_Testcase, Config) -> - %% TODO: support IPv6-only environments - case inet_res:lookup(?DISCOVERY_ENDPOINT, in, a) of + case inet_res:lookup(?DISCOVERY_ENDPOINT_RECORD_A, in, a) of [] -> {skip, "pre-configured *.rabbitmq.net record does not resolve, skipping"}; [_ | _] -> Config end. + end_per_testcase(_Testcase, Config) -> - case inet_res:lookup(?DISCOVERY_ENDPOINT, in, a) of + case inet_res:lookup(?DISCOVERY_ENDPOINT_RECORD_A, in, a) of [] -> {skip, "pre-configured *.rabbitmq.net record does not resolve, skipping"}; [_ | _] -> @@ -85,18 +97,22 @@ end_per_testcase(_Testcase, Config) -> %% Test cases %% ------------------------------------------------------------------- +test_aaaa_record_hostname_discovery(_) -> + Result = rabbit_peer_discovery_dns:discover_hostnames(?DISCOVERY_ENDPOINT_RECORD_AAAA, true), + ?assert(string:str(lists:flatten(Result), "facebook.com") > 0). + hostname_discovery_with_long_node_names(_) -> - Result = rabbit_peer_discovery_dns:discover_hostnames(?DISCOVERY_ENDPOINT, true), + Result = rabbit_peer_discovery_dns:discover_hostnames(?DISCOVERY_ENDPOINT_RECORD_A, true), ?assert(lists:member("www.rabbitmq.com", Result)). hostname_discovery_with_short_node_names(_) -> - Result = rabbit_peer_discovery_dns:discover_hostnames(?DISCOVERY_ENDPOINT, false), + Result = rabbit_peer_discovery_dns:discover_hostnames(?DISCOVERY_ENDPOINT_RECORD_A, false), ?assert(lists:member("www", Result)). node_discovery_with_long_node_names(_) -> - Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT, true), + Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT_RECORD_A, true), ?assert(lists:member('ct_rabbit@www.rabbitmq.com', Result)). node_discovery_with_short_node_names(_) -> - Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT, false), + Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT_RECORD_A, false), ?assert(lists:member(ct_rabbit@www, Result)). |
