Skip to content

Commit 51e6004

Browse files
Inject DQT into GET /api/definitions and /api/vhosts
References #12776
1 parent 3a5d057 commit 51e6004

File tree

5 files changed

+82
-11
lines changed

5 files changed

+82
-11
lines changed

deps/rabbit/src/rabbit_queue_type.erl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
-behaviour(rabbit_registry_class).
1212

1313
-include("amqqueue.hrl").
14+
-include("vhost.hrl").
1415
-include_lib("rabbit_common/include/rabbit.hrl").
1516
-include_lib("amqp10_common/include/amqp10_types.hrl").
1617

@@ -23,6 +24,8 @@
2324
to_binary/1,
2425
default/0,
2526
fallback/0,
27+
inject_dqt/1,
28+
vhosts_with_dqt/1,
2629
is_enabled/1,
2730
is_compatible/4,
2831
declare/2,
@@ -319,6 +322,15 @@ short_alias_of(rabbit_stream_queue) ->
319322
%% AMQP 1.0 management client
320323
short_alias_of({utf8, <<"stream">>}) ->
321324
<<"stream">>;
325+
%% for cases where this function is used for
326+
%% formatting of values that already might use these
327+
%% short aliases
328+
short_alias_of(<<"quorum">>) ->
329+
<<"quorum">>;
330+
short_alias_of(<<"classic">>) ->
331+
<<"classic">>;
332+
short_alias_of(<<"stream">>) ->
333+
<<"stream">>;
322334
short_alias_of(_Other) ->
323335
undefined.
324336

@@ -841,6 +853,29 @@ known_queue_type_names() ->
841853
QTypeBins = lists:map(fun(X) -> atom_to_binary(X) end, QueueTypes),
842854
?KNOWN_QUEUE_TYPES ++ QTypeBins.
843855

856+
inject_dqt(VHost) when ?is_vhost(VHost) ->
857+
inject_dqt(vhost:to_map(VHost));
858+
inject_dqt(VHost) when is_list(VHost) ->
859+
inject_dqt(rabbit_data_coercion:to_map(VHost));
860+
inject_dqt(M = #{default_queue_type := undefined}) ->
861+
NQT = short_alias_of(default()),
862+
Meta0 = maps:get(metadata, M, #{}),
863+
Meta = Meta0#{default_queue_type => NQT},
864+
865+
M#{default_queue_type => NQT, metadata => Meta};
866+
inject_dqt(M = #{default_queue_type := DQT}) ->
867+
NQT = short_alias_of(DQT),
868+
Meta0 = maps:get(metadata, M, #{}),
869+
Meta = Meta0#{default_queue_type => NQT},
870+
871+
M#{default_queue_type => NQT, metadata => Meta}.
872+
873+
-spec vhosts_with_dqt([any()]) -> [map()].
874+
vhosts_with_dqt(List) when is_list(List) ->
875+
%% inject DQT (default queue type) at the top level and
876+
%% its metadata
877+
lists:map(fun inject_dqt/1, List).
878+
844879
-spec check_queue_limits(amqqueue:amqqueue()) ->
845880
ok |
846881
{error, queue_limit_exceeded, Reason :: string(), Args :: term()}.

deps/rabbit/src/rabbit_vhost.erl

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -511,13 +511,14 @@ default_queue_type(VirtualHost) ->
511511
default_queue_type(VirtualHost, rabbit_queue_type:fallback()).
512512
-spec default_queue_type(VirtualHost :: vhost:name(), Fallback :: rabbit_queue_type:queue_type()) -> rabbit_queue_type:queue_type().
513513
default_queue_type(VirtualHost, FallbackQueueType) ->
514+
NodeDefault = application:get_env(rabbit, default_queue_type, FallbackQueueType),
514515
case exists(VirtualHost) of
515-
false -> FallbackQueueType;
516+
false -> NodeDefault;
516517
true ->
517518
Record = lookup(VirtualHost),
518519
case vhost:get_default_queue_type(Record) of
519-
undefined -> FallbackQueueType;
520-
<<"undefined">> -> FallbackQueueType;
520+
undefined -> NodeDefault;
521+
<<"undefined">> -> NodeDefault;
521522
Type -> Type
522523
end
523524
end.
@@ -622,8 +623,19 @@ i(tracing, VHost) -> rabbit_trace:enabled(vhost:get_name(VHost));
622623
i(cluster_state, VHost) -> vhost_cluster_state(vhost:get_name(VHost));
623624
i(description, VHost) -> vhost:get_description(VHost);
624625
i(tags, VHost) -> vhost:get_tags(VHost);
625-
i(default_queue_type, VHost) -> vhost:get_default_queue_type(VHost);
626-
i(metadata, VHost) -> vhost:get_metadata(VHost);
626+
i(default_queue_type, VHost) -> rabbit_queue_type:short_alias_of(default_queue_type(vhost:get_name(VHost)));
627+
i(metadata, VHost) ->
628+
DQT = rabbit_queue_type:short_alias_of(default_queue_type(vhost:get_name(VHost))),
629+
case vhost:get_metadata(VHost) of
630+
undefined ->
631+
#{default_queue_type => DQT};
632+
M = #{default_queue_type := undefined} ->
633+
M#{default_queue_type => DQT};
634+
M = #{default_queue_type := QT} ->
635+
M#{default_queue_type => rabbit_queue_type:short_alias_of(QT)};
636+
M when is_map(M) ->
637+
M#{default_queue_type => DQT}
638+
end;
627639
i(Item, VHost) ->
628640
rabbit_log:error("Don't know how to compute a virtual host info item '~ts' for virtual host '~tp'", [Item, VHost]),
629641
throw({bad_argument, Item}).

deps/rabbit/src/vhost.erl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@
2626
get_description/1,
2727
get_tags/1,
2828
get_default_queue_type/1,
29+
2930
set_limits/2,
3031
set_metadata/2,
3132
merge_metadata/2,
3233
new_metadata/3,
33-
is_tagged_with/2
34+
is_tagged_with/2,
35+
36+
to_map/1
3437
]).
3538

3639
-define(record_version, vhost_v2).
@@ -196,3 +199,13 @@ new_metadata(Description, Tags, DefaultQueueType) ->
196199
-spec is_tagged_with(vhost(), tag()) -> boolean().
197200
is_tagged_with(VHost, Tag) ->
198201
lists:member(Tag, get_tags(VHost)).
202+
203+
-spec to_map(vhost()) -> map().
204+
to_map(VHost) ->
205+
#{
206+
name => get_name(VHost),
207+
description => get_description(VHost),
208+
tags => get_tags(VHost),
209+
default_queue_type => get_default_queue_type(VHost),
210+
metadata => get_metadata(VHost)
211+
}.

deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,12 @@ retain_whitelisted(Items) ->
271271
retain_whitelisted_items(Name, List, Allowed) ->
272272
{Name, [only_whitelisted_for_item(I, Allowed) || I <- List]}.
273273

274-
only_whitelisted_for_item(Item, Allowed) ->
274+
only_whitelisted_for_item(Item, Allowed) when is_map(Item) ->
275+
Map1 = maps:with(Allowed, Item),
276+
maps:filter(fun(_Key, Val) ->
277+
Val =/= undefined
278+
end, Map1);
279+
only_whitelisted_for_item(Item, Allowed) when is_list(Item) ->
275280
[{K, Fact} || {K, Fact} <- Item, lists:member(K, Allowed), Fact =/= undefined].
276281

277282
strip_vhost(Item) ->

deps/rabbitmq_management/src/rabbit_mgmt_wm_vhosts.erl

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@ to_json(ReqData, Context = #context{user = User}) ->
3131
try
3232
Basic = [rabbit_vhost:info(V)
3333
|| V <- rabbit_mgmt_util:list_visible_vhosts(User)],
34-
Data = rabbit_mgmt_util:augment_resources(Basic, ?DEFAULT_SORT,
35-
?BASIC_COLUMNS, ReqData,
36-
Context, fun augment/2),
34+
Augmented = rabbit_mgmt_util:augment_resources(Basic, ?DEFAULT_SORT,
35+
?BASIC_COLUMNS, ReqData,
36+
Context, fun augment/2),
37+
%% inject default DQT into virtual host metadata,
38+
%% where necessary
39+
Data = rabbit_queue_type:vhosts_with_dqt(Augmented),
3740
rabbit_mgmt_util:reply(Data, ReqData, Context)
3841
catch
3942
{error, invalid_range_parameters, Reason} ->
@@ -64,4 +67,7 @@ augmented(ReqData, #context{user = User}) ->
6467
end.
6568

6669
basic() ->
67-
rabbit_vhost:info_all([name, description, tags, default_queue_type, metadata]).
70+
Maps = lists:map(
71+
fun maps:from_list/1,
72+
rabbit_vhost:info_all([name, description, tags, default_queue_type, metadata])),
73+
rabbit_queue_type:vhosts_with_dqt(Maps).

0 commit comments

Comments
 (0)