fix(mgmt): $queue shared topics format in mgmt topics api

This commit is contained in:
JimMoen 2024-04-09 16:40:39 +08:00
parent 04ba2aaf8a
commit 47e0f3bb1f
No known key found for this signature in database
4 changed files with 36 additions and 7 deletions

View File

@ -673,7 +673,6 @@ end).
-define(SHARE, "$share").
-define(QUEUE, "$queue").
-define(SHARE(Group, Topic), emqx_topic:join([<<?SHARE>>, Group, Topic])).
-define(REDISPATCH_TO(GROUP, TOPIC), {GROUP, TOPIC}).

View File

@ -1004,9 +1004,9 @@ t_different_groups_same_topic(Config) when is_list(Config) ->
GroupB = <<"bb">>,
Topic = <<"t/1">>,
SharedTopicGroupA = ?SHARE(GroupA, Topic),
SharedTopicGroupA = format_share(GroupA, Topic),
?UPDATE_SUB_QOS(C, SharedTopicGroupA, ?QOS_2),
SharedTopicGroupB = ?SHARE(GroupB, Topic),
SharedTopicGroupB = format_share(GroupB, Topic),
?UPDATE_SUB_QOS(C, SharedTopicGroupB, ?QOS_2),
?retry(
@ -1050,11 +1050,11 @@ t_different_groups_update_subopts(Config) when is_list(Config) ->
Topic = <<"t/1">>,
GroupA = <<"aa">>,
GroupB = <<"bb">>,
SharedTopicGroupA = ?SHARE(GroupA, Topic),
SharedTopicGroupB = ?SHARE(GroupB, Topic),
SharedTopicGroupA = format_share(GroupA, Topic),
SharedTopicGroupB = format_share(GroupB, Topic),
Fun = fun(Group, QoS) ->
?UPDATE_SUB_QOS(C, ?SHARE(Group, Topic), QoS),
?UPDATE_SUB_QOS(C, format_share(Group, Topic), QoS),
?assertMatch(
#{qos := QoS},
emqx_broker:get_subopts(ClientId, emqx_topic:make_shared_record(Group, Topic))
@ -1153,6 +1153,9 @@ t_queue_subscription(Config) when is_list(Config) ->
%% help functions
%%--------------------------------------------------------------------
format_share(Group, Topic) ->
emqx_topic:maybe_format_share(emqx_topic:make_shared_record(Group, Topic)).
kill_process(Pid) ->
kill_process(Pid, fun(_) -> erlang:exit(Pid, kill) end).

View File

@ -225,7 +225,10 @@ format_response_meta(Meta, _Query, #{hasnext := HasNext}) ->
Meta#{hasnext => HasNext}.
format(#route{topic = Topic, dest = {Group, Node}}) ->
#{topic => ?SHARE(Group, Topic), node => Node};
#{
topic => emqx_topic:maybe_format_share(emqx_topic:make_shared_record(Group, Topic)),
node => Node
};
format(#route{topic = Topic, dest = Node}) when is_atom(Node) ->
#{topic => Topic, node => Node};
format(#route{topic = Topic, dest = SessionId}) when is_binary(SessionId) ->

View File

@ -187,6 +187,30 @@ t_shared_topics(_Configs) ->
ok = emqtt:stop(Client).
t_queue_topics(_Configs) ->
Node = atom_to_binary(node(), utf8),
RealTopic = <<"t/+">>,
Topic = <<"$queue/", RealTopic/binary>>,
Client = client(?FUNCTION_NAME),
{ok, _, _} = emqtt:subscribe(Client, Topic),
{ok, _, _} = emqtt:subscribe(Client, RealTopic),
%% exact match with shared topic
MatchData = request_json(get, ["topics"], [
{"topic", Topic},
{"node", atom_to_list(node())}
]),
?assertMatch(
#{
<<"data">> := [#{<<"topic">> := Topic, <<"node">> := Node}],
<<"meta">> := #{<<"page">> := 1, <<"limit">> := 100, <<"count">> := 1}
},
MatchData
),
ok = emqtt:stop(Client).
t_shared_topics_invalid(_Config) ->
%% no real topic
InvalidShareTopicFilter = <<"$share/group">>,