summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <michael@novemberain.com>2017-04-25 13:09:06 +0200
committerGitHub <noreply@github.com>2017-04-25 13:09:06 +0200
commitb03a14fc1649d2d79ec01c55d39884dce7c2d748 (patch)
tree3baad871ba470b1ca32224564453c41d9b4018df
parent261efd9458afb7c1f2eb6c23405415afd4e73740 (diff)
parent0bb59f8df0a5c8dffa2677db3fb46c719c85eb6a (diff)
downloadrabbitmq-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.erl21
-rw-r--r--test/peer_discovery_dns_SUITE.erl34
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)).