fix(client mgmt api): allow projecting `client_attrs` from client fields

Fixes https://emqx.atlassian.net/browse/EMQX-12511
This commit is contained in:
Thales Macedo Garitezi 2024-06-11 17:14:33 -03:00
parent 51810c6919
commit 0874768c1d
2 changed files with 11 additions and 1 deletions

View File

@ -815,7 +815,8 @@ fields(mqueue_message) ->
fields(requested_client_fields) -> fields(requested_client_fields) ->
%% NOTE: some Client fields actually returned in response are missing in schema: %% NOTE: some Client fields actually returned in response are missing in schema:
%% enable_authn, is_persistent, listener, peerport %% enable_authn, is_persistent, listener, peerport
ClientFields = [element(1, F) || F <- fields(client)], ClientFields0 = [element(1, F) || F <- fields(client)],
ClientFields = [client_attrs | ClientFields0],
[ [
{fields, {fields,
hoconsc:mk( hoconsc:mk(

View File

@ -1032,6 +1032,7 @@ t_query_multiple_clients_urlencode(_) ->
t_query_clients_with_fields(_) -> t_query_clients_with_fields(_) ->
process_flag(trap_exit, true), process_flag(trap_exit, true),
TCBin = atom_to_binary(?FUNCTION_NAME), TCBin = atom_to_binary(?FUNCTION_NAME),
APIPort = 18083,
ClientId = <<TCBin/binary, "_client">>, ClientId = <<TCBin/binary, "_client">>,
Username = <<TCBin/binary, "_user">>, Username = <<TCBin/binary, "_user">>,
{ok, C} = emqtt:start_link(#{clientid => ClientId, username => Username}), {ok, C} = emqtt:start_link(#{clientid => ClientId, username => Username}),
@ -1040,6 +1041,13 @@ t_query_clients_with_fields(_) ->
Auth = emqx_mgmt_api_test_util:auth_header_(), Auth = emqx_mgmt_api_test_util:auth_header_(),
?assertEqual([#{<<"clientid">> => ClientId}], get_clients_all_fields(Auth, "fields=clientid")), ?assertEqual([#{<<"clientid">> => ClientId}], get_clients_all_fields(Auth, "fields=clientid")),
?assertMatch(
{ok,
{{_, 200, _}, _, #{
<<"data">> := [#{<<"client_attrs">> := #{}}]
}}},
list_request(APIPort, "fields=client_attrs")
),
?assertEqual( ?assertEqual(
[#{<<"clientid">> => ClientId, <<"username">> => Username}], [#{<<"clientid">> => ClientId, <<"username">> => Username}],
get_clients_all_fields(Auth, "fields=clientid,username") get_clients_all_fields(Auth, "fields=clientid,username")
@ -1072,6 +1080,7 @@ get_clients(Auth, Qs, ExpectError, ClientIdOnly) ->
Resp = emqx_mgmt_api_test_util:request_api(get, ClientsPath, Qs, Auth), Resp = emqx_mgmt_api_test_util:request_api(get, ClientsPath, Qs, Auth),
case ExpectError of case ExpectError of
false -> false ->
ct:pal("get clients response:\n ~p", [Resp]),
{ok, Body} = Resp, {ok, Body} = Resp,
#{<<"data">> := Clients} = emqx_utils_json:decode(Body), #{<<"data">> := Clients} = emqx_utils_json:decode(Body),
case ClientIdOnly of case ClientIdOnly of