Skip to content

Commit 750497c

Browse files
committed
rabbitmq_peer_discovery_consul: Populate Erlang node name during registration
[Why] This allows other nodes to discover the actual node names, instead of deriving one from the Consul agent node name and their own node name. This permits to register several RabbitMQ nodes in the same Consul agent. This is at least handy for testsuites. [How] The Erlang node name is added to the `Meta` properties list as long as the RabbitMQ cluster name. Note that this also fixes when the cluster name is added to `Meta`: before this commit, a non-default cluster name was not added if the user-configured properties list was empty at the beginning.
1 parent 684ec76 commit 750497c

File tree

2 files changed

+68
-42
lines changed

2 files changed

+68
-42
lines changed

deps/rabbitmq_peer_discovery_consul/src/rabbit_peer_discovery_consul.erl

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434

3535
-define(CONSUL_CHECK_NOTES, "RabbitMQ Consul-based peer discovery plugin TTL check").
3636

37+
-define(META_KEY_CLUSTER_NAME, <<"cluster">>).
38+
-define(META_KEY_ERLANG_NODENAME, <<"erlang-node-name">>).
39+
3740
%%
3841
%% API
3942
%%
@@ -260,15 +263,21 @@ extract_nodes(Data) -> extract_nodes(Data, []).
260263
-> list().
261264
extract_nodes([], Nodes) -> Nodes;
262265
extract_nodes([H | T], Nodes) ->
263-
Service = maps:get(<<"Service">>, H),
264-
Value = maps:get(<<"Address">>, Service),
265-
NodeName = case ?UTIL_MODULE:as_string(Value) of
266-
"" ->
267-
NodeData = maps:get(<<"Node">>, H),
268-
Node = maps:get(<<"Node">>, NodeData),
269-
maybe_add_domain(?UTIL_MODULE:node_name(Node));
270-
Address ->
271-
?UTIL_MODULE:node_name(Address)
266+
Service = maps:get(<<"Service">>, H),
267+
Meta = maps:get(<<"Meta">>, Service, #{}),
268+
NodeName = case Meta of
269+
#{?META_KEY_ERLANG_NODENAME := Node} ->
270+
binary_to_atom(Node);
271+
_ ->
272+
Value = maps:get(<<"Address">>, Service),
273+
case ?UTIL_MODULE:as_string(Value) of
274+
"" ->
275+
NodeData = maps:get(<<"Node">>, H),
276+
Node = maps:get(<<"Node">>, NodeData),
277+
maybe_add_domain(?UTIL_MODULE:node_name(Node));
278+
Address ->
279+
?UTIL_MODULE:node_name(Address)
280+
end
272281
end,
273282
extract_nodes(T, lists:merge(Nodes, [NodeName])).
274283

@@ -417,24 +426,19 @@ registration_body_maybe_add_tag(Payload, Cluster, Tags) ->
417426

418427
-spec registration_body_maybe_add_meta(Payload :: list()) -> list().
419428
registration_body_maybe_add_meta(Payload) ->
420-
M = ?CONFIG_MODULE:config_map(?BACKEND_CONFIG_KEY),
421-
ClusterName = get_config_key(cluster_name, M),
422-
Meta = ?UTIL_MODULE:as_list(get_config_key(consul_svc_meta, M)),
423-
registration_body_maybe_add_meta(Payload, ClusterName, Meta).
424-
425-
-spec registration_body_maybe_add_meta(Payload :: list(),
426-
ClusterName :: string(),
427-
Meta :: list()) -> list().
428-
registration_body_maybe_add_meta(Payload, "default", []) ->
429-
Payload;
430-
registration_body_maybe_add_meta(Payload, "default", Meta) ->
431-
lists:append(Payload, [{<<"meta">>, Meta}]);
432-
registration_body_maybe_add_meta(Payload, _ClusterName, []) ->
433-
Payload;
434-
registration_body_maybe_add_meta(Payload, ClusterName, Meta) ->
435-
Merged = maps:to_list(maps:merge(#{<<"cluster">> => rabbit_data_coercion:to_binary(ClusterName)}, maps:from_list(Meta))),
436-
lists:append(Payload, [{<<"meta">>, Merged}]).
437-
429+
M = ?CONFIG_MODULE:config_map(?BACKEND_CONFIG_KEY),
430+
Meta0 = ?UTIL_MODULE:as_list(get_config_key(consul_svc_meta, M)),
431+
Meta1 = maps:from_list(Meta0),
432+
Meta2 = Meta1#{?META_KEY_ERLANG_NODENAME => atom_to_binary(node())},
433+
Meta3 = case get_config_key(cluster_name, M) of
434+
"default" ->
435+
Meta2;
436+
ClusterName ->
437+
ClusterName1 = rabbit_data_coercion:to_binary(ClusterName),
438+
Meta2#{?META_KEY_CLUSTER_NAME => ClusterName1}
439+
end,
440+
Merged = maps:to_list(Meta3),
441+
lists:append(Payload, [{'Meta', Merged}]).
438442

439443
-spec validate_addr_parameters(false | true, false | true) -> false | true.
440444
validate_addr_parameters(false, true) ->

deps/rabbitmq_peer_discovery_consul/test/rabbitmq_peer_discovery_consul_SUITE.erl

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ registration_body_simple_case(_Config) ->
155155
{'Check',
156156
[{'Notes', ?CONSUL_CHECK_NOTES},
157157
{'TTL', '30s'},
158-
{'Status', 'passing'}]}],
158+
{'Status', 'passing'}]},
159+
{'Meta',
160+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
159161
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
160162

161163
registration_body_svc_addr_set_via_env_var(_Config) ->
@@ -167,7 +169,9 @@ registration_body_svc_addr_set_via_env_var(_Config) ->
167169
{'Check',
168170
[{'Notes', ?CONSUL_CHECK_NOTES},
169171
{'TTL', '30s'},
170-
{'Status', 'passing'}]}],
172+
{'Status', 'passing'}]},
173+
{'Meta',
174+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
171175
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
172176

173177
registration_body_svc_ttl_set_via_env_var(_Config) ->
@@ -178,7 +182,9 @@ registration_body_svc_ttl_set_via_env_var(_Config) ->
178182
{'Check',
179183
[{'Notes', ?CONSUL_CHECK_NOTES},
180184
{'TTL', '257s'},
181-
{'Status', 'passing'}]}],
185+
{'Status', 'passing'}]},
186+
{'Meta',
187+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
182188
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
183189

184190
registration_body_svc_tags_set_via_env_var(_Config) ->
@@ -190,7 +196,9 @@ registration_body_svc_tags_set_via_env_var(_Config) ->
190196
[{'Notes', ?CONSUL_CHECK_NOTES},
191197
{'TTL', '30s'},
192198
{'Status', 'passing'}]},
193-
{'Tags',['urlprefix-:5672 proto=tcp',mq,'mq server']}],
199+
{'Tags',['urlprefix-:5672 proto=tcp',mq,'mq server']},
200+
{'Meta',
201+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
194202
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
195203

196204
registration_body_deregister_after_set_via_env_var(_Config) ->
@@ -202,15 +210,19 @@ registration_body_deregister_after_set_via_env_var(_Config) ->
202210
[{'Notes', ?CONSUL_CHECK_NOTES},
203211
{'TTL','30s'},
204212
{'Status', 'passing'},
205-
{'DeregisterCriticalServiceAfter','520s'}]}],
213+
{'DeregisterCriticalServiceAfter','520s'}]},
214+
{'Meta',
215+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
206216
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
207217

208218
registration_body_ttl_and_deregister_after_both_unset_via_env_var(_Config) ->
209219
os:putenv("CONSUL_DEREGISTER_AFTER", ""),
210220
os:putenv("CONSUL_SVC_TTL", ""),
211221
Expectation = [{'ID', 'rabbitmq'},
212222
{'Name', rabbitmq},
213-
{'Port', 5672}],
223+
{'Port', 5672},
224+
{'Meta',
225+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
214226
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
215227

216228
%% "deregister after" won't be enabled if TTL isn't set
@@ -219,7 +231,9 @@ registration_body_ttl_unset_and_deregister_after_set_via_env_var(_Config) ->
219231
os:putenv("CONSUL_SVC_TTL", ""),
220232
Expectation = [{'ID', 'rabbitmq'},
221233
{'Name', rabbitmq},
222-
{'Port', 5672}],
234+
{'Port', 5672},
235+
{'Meta',
236+
[{<<"erlang-node-name">>, atom_to_binary(node())}]}],
223237
?assertEqual(Expectation, rabbit_peer_discovery_consul:build_registration_body()).
224238

225239
service_id_all_defaults_test(_Config) ->
@@ -450,7 +464,8 @@ registration_with_all_default_values_test(_Config) ->
450464
?assertEqual("v1/agent/service/register", Path),
451465
?assertEqual([], Args),
452466
?assertEqual([], Headers),
453-
Expect = <<"{\"ID\":\"rabbitmq\",\"Name\":\"rabbitmq\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
467+
Node = atom_to_binary(node()),
468+
Expect = <<"{\"ID\":\"rabbitmq\",\"Name\":\"rabbitmq\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
454469
?assertEqual(Expect, Body),
455470
{ok, []}
456471
end),
@@ -467,7 +482,8 @@ registration_with_cluster_name_test(_Config) ->
467482
?assertEqual("v1/agent/service/register", Path),
468483
?assertEqual([], Args),
469484
?assertEqual([], Headers),
470-
Expect = <<"{\"ID\":\"rabbitmq\",\"Name\":\"rabbitmq\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Tags\":[\"test-rabbit\"]}">>,
485+
Node = atom_to_binary(node()),
486+
Expect = <<"{\"ID\":\"rabbitmq\",\"Name\":\"rabbitmq\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Tags\":[\"test-rabbit\"],\"Meta\":{\"cluster\":\"test-rabbit\",\"erlang-node-name\":\"", Node/binary, "\"}}">>,
471487
?assertEqual(Expect, Body),
472488
{ok, []}
473489
end),
@@ -484,7 +500,8 @@ registration_without_acl_token_test(_Config) ->
484500
?assertEqual("v1/agent/service/register", Path),
485501
?assertEqual([], Args),
486502
?assertEqual([], Headers),
487-
Expect = <<"{\"ID\":\"rabbit:10.0.0.1\",\"Name\":\"rabbit\",\"Address\":\"10.0.0.1\",\"Port\":5671,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
503+
Node = atom_to_binary(node()),
504+
Expect = <<"{\"ID\":\"rabbit:10.0.0.1\",\"Name\":\"rabbit\",\"Address\":\"10.0.0.1\",\"Port\":5671,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
488505
?assertEqual(Expect, Body),
489506
{ok, []}
490507
end),
@@ -506,7 +523,8 @@ registration_with_acl_token_test(_Config) ->
506523
?assertEqual("v1/agent/service/register", Path),
507524
?assertEqual([], Args),
508525
?assertEqual([], Headers),
509-
Expect = <<"{\"ID\":\"rabbit:10.0.0.1\",\"Name\":\"rabbit\",\"Address\":\"10.0.0.1\",\"Port\":5671,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
526+
Node = atom_to_binary(node()),
527+
Expect = <<"{\"ID\":\"rabbit:10.0.0.1\",\"Name\":\"rabbit\",\"Address\":\"10.0.0.1\",\"Port\":5671,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
510528
?assertEqual(Expect, Body),
511529
{ok, []}
512530
end),
@@ -531,7 +549,8 @@ registration_with_auto_addr_test(_Config) ->
531549
?assertEqual("v1/agent/service/register", Path),
532550
?assertEqual([], Args),
533551
?assertEqual([{"X-Consul-Token", "token-value"}], Headers),
534-
Expect = <<"{\"ID\":\"rabbitmq:bob\",\"Name\":\"rabbitmq\",\"Address\":\"bob\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
552+
Node = atom_to_binary(node()),
553+
Expect = <<"{\"ID\":\"rabbitmq:bob\",\"Name\":\"rabbitmq\",\"Address\":\"bob\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
535554
?assertEqual(Expect, Body),
536555
{ok, []}
537556
end),
@@ -555,7 +574,8 @@ registration_with_auto_addr_from_nodename_test(_Config) ->
555574
?assertEqual("v1/agent/service/register", Path),
556575
?assertEqual([], Args),
557576
?assertEqual([{"X-Consul-Token", "token-value"}], Headers),
558-
Expect = <<"{\"ID\":\"rabbitmq:bob.consul.node\",\"Name\":\"rabbitmq\",\"Address\":\"bob.consul.node\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
577+
Node = atom_to_binary(node()),
578+
Expect = <<"{\"ID\":\"rabbitmq:bob.consul.node\",\"Name\":\"rabbitmq\",\"Address\":\"bob.consul.node\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
559579
?assertEqual(Expect, Body),
560580
{ok, []}
561581
end),
@@ -583,7 +603,8 @@ registration_with_auto_addr_nic_test(_Config) ->
583603
?assertEqual("v1/agent/service/register", Path),
584604
?assertEqual([], Args),
585605
?assertEqual([{"X-Consul-Token", "token-value"}], Headers),
586-
Expect = <<"{\"ID\":\"rabbitmq:172.16.4.50\",\"Name\":\"rabbitmq\",\"Address\":\"172.16.4.50\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
606+
Node = atom_to_binary(node()),
607+
Expect = <<"{\"ID\":\"rabbitmq:172.16.4.50\",\"Name\":\"rabbitmq\",\"Address\":\"172.16.4.50\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
587608
?assertEqual(Expect, Body),
588609
{ok, []}
589610
end),
@@ -611,7 +632,8 @@ registration_with_auto_addr_nic_issue_12_test(_Config) ->
611632
?assertEqual("v1/agent/service/register", Path),
612633
?assertEqual([], Args),
613634
?assertEqual([{"X-Consul-Token", "token-value"}], Headers),
614-
Expect = <<"{\"ID\":\"rabbitmq:172.16.4.50\",\"Name\":\"rabbitmq\",\"Address\":\"172.16.4.50\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"}}">>,
635+
Node = atom_to_binary(node()),
636+
Expect = <<"{\"ID\":\"rabbitmq:172.16.4.50\",\"Name\":\"rabbitmq\",\"Address\":\"172.16.4.50\",\"Port\":5672,\"Check\":{\"Notes\":\"RabbitMQ Consul-based peer discovery plugin TTL check\",\"TTL\":\"30s\",\"Status\":\"passing\"},\"Meta\":{\"erlang-node-name\":\"", Node/binary, "\"}}">>,
615637
?assertEqual(Expect, Body),
616638
{ok, []}
617639
end),

0 commit comments

Comments
 (0)