Merge pull request #5379 from DDDHuang/listeners_api_fix

fix: listeners id param name
This commit is contained in:
DDDHuang 2021-08-04 14:39:45 +08:00 committed by GitHub
commit b99ec04267
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 62 deletions

View File

@ -502,10 +502,10 @@ listener_id_filter(Identifier, Listeners) ->
-spec manage_listener(Operation :: start_listener|stop_listener|restart_listener, Param :: map()) -> -spec manage_listener(Operation :: start_listener|stop_listener|restart_listener, Param :: map()) ->
ok | {error, Reason :: term()}. ok | {error, Reason :: term()}.
manage_listener(Operation, #{identifier := Identifier, node := Node}) when Node =:= node()-> manage_listener(Operation, #{id := ID, node := Node}) when Node =:= node()->
erlang:apply(emqx_listeners, Operation, [Identifier]); erlang:apply(emqx_listeners, Operation, [ID]);
manage_listener(Operation, Param = #{node := Node}) -> manage_listener(Operation, Param = #{node := Node}) ->
rpc_call(Node, restart_listener, [Operation, Param]). rpc_call(Node, manage_listener, [Operation, Param]).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Get Alarms %% Get Alarms

View File

@ -35,7 +35,7 @@ api_spec() ->
{ {
[ [
listeners_api(), listeners_api(),
restart_listeners_api(), listener_api(),
nodes_listeners_api(), nodes_listeners_api(),
nodes_listener_api(), nodes_listener_api(),
manage_listeners_api(), manage_listeners_api(),
@ -53,21 +53,21 @@ listener_schema() ->
type => string, type => string,
description => <<"Node">>, description => <<"Node">>,
example => node()}, example => node()},
identifier => #{ id => #{
type => string, type => string,
description => <<"Identifier">>}, description => <<"Identifier">>},
acceptors => #{ acceptors => #{
type => integer, type => integer,
description => <<"Number of Acceptor proce">>}, description => <<"Number of Acceptor process">>},
max_conn => #{ max_conn => #{
type => integer, type => integer,
description => <<"Maximum number of allowed connection">>}, description => <<"Maximum number of allowed connection">>},
type => #{ type => #{
type => string, type => string,
description => <<"Plugin decription">>}, description => <<"Listener type">>},
listen_on => #{ listen_on => #{
type => string, type => string,
description => <<"Litening port">>}, description => <<"Listening port">>},
running => #{ running => #{
type => boolean, type => boolean,
description => <<"Open or close">>}, description => <<"Open or close">>},
@ -84,24 +84,24 @@ listeners_api() ->
emqx_mgmt_util:response_array_schema(<<"List all listeners">>, listener)}}}, emqx_mgmt_util:response_array_schema(<<"List all listeners">>, listener)}}},
{"/listeners", Metadata, listeners}. {"/listeners", Metadata, listeners}.
restart_listeners_api() -> listener_api() ->
Metadata = #{ Metadata = #{
get => #{ get => #{
description => <<"List listeners by listener ID">>, description => <<"List listeners by listener ID">>,
parameters => [param_path_identifier()], parameters => [param_path_id()],
responses => #{ responses => #{
<<"404">> => <<"404">> =>
emqx_mgmt_util:response_error_schema(<<"Listener id not found">>, ['BAD_LISTENER_ID']), emqx_mgmt_util:response_error_schema(<<"Listener id not found">>, ['BAD_LISTENER_ID']),
<<"200">> => <<"200">> =>
emqx_mgmt_util:response_array_schema(<<"List listener info ok">>, listener)}}}, emqx_mgmt_util:response_array_schema(<<"List listener info ok">>, listener)}}},
{"/listeners/:identifier", Metadata, listener}. {"/listeners/:id", Metadata, listener}.
manage_listeners_api() -> manage_listeners_api() ->
Metadata = #{ Metadata = #{
get => #{ get => #{
description => <<"Restart listeners in cluster">>, description => <<"Restart listeners in cluster">>,
parameters => [ parameters => [
param_path_identifier(), param_path_id(),
param_path_operation()], param_path_operation()],
responses => #{ responses => #{
<<"500">> => <<"500">> =>
@ -114,15 +114,15 @@ manage_listeners_api() ->
['BAD_REQUEST']), ['BAD_REQUEST']),
<<"200">> => <<"200">> =>
emqx_mgmt_util:response_schema(<<"Operation success">>)}}}, emqx_mgmt_util:response_schema(<<"Operation success">>)}}},
{"/listeners/:identifier/:operation", Metadata, manage_listeners}. {"/listeners/:id/:operation", Metadata, manage_listeners}.
manage_nodes_listeners_api() -> manage_nodes_listeners_api() ->
Metadata = #{ Metadata = #{
get => #{ put => #{
description => <<"Restart listeners in cluster">>, description => <<"Restart listeners in cluster">>,
parameters => [ parameters => [
param_path_node(), param_path_node(),
param_path_identifier(), param_path_id(),
param_path_operation()], param_path_operation()],
responses => #{ responses => #{
<<"500">> => <<"500">> =>
@ -135,20 +135,20 @@ manage_nodes_listeners_api() ->
['BAD_REQUEST']), ['BAD_REQUEST']),
<<"200">> => <<"200">> =>
emqx_mgmt_util:response_schema(<<"Operation success">>)}}}, emqx_mgmt_util:response_schema(<<"Operation success">>)}}},
{"/node/:node/listeners/:identifier/:operation", Metadata, manage_nodes_listeners}. {"/node/:node/listeners/:id/:operation", Metadata, manage_nodes_listeners}.
nodes_listeners_api() -> nodes_listeners_api() ->
Metadata = #{ Metadata = #{
get => #{ get => #{
description => <<"Get listener info in one node">>, description => <<"Get listener info in one node">>,
parameters => [param_path_node(), param_path_identifier()], parameters => [param_path_node(), param_path_id()],
responses => #{ responses => #{
<<"404">> => <<"404">> =>
emqx_mgmt_util:response_error_schema(<<"Node name or listener id not found">>, emqx_mgmt_util:response_error_schema(<<"Node name or listener id not found">>,
['BAD_NODE_NAME', 'BAD_LISTENER_ID']), ['BAD_NODE_NAME', 'BAD_LISTENER_ID']),
<<"200">> => <<"200">> =>
emqx_mgmt_util:response_schema(<<"Get listener info ok">>, listener)}}}, emqx_mgmt_util:response_schema(<<"Get listener info ok">>, listener)}}},
{"/nodes/:node/listeners/:identifier", Metadata, node_listener}. {"/nodes/:node/listeners/:id", Metadata, node_listener}.
nodes_listener_api() -> nodes_listener_api() ->
Metadata = #{ Metadata = #{
@ -172,10 +172,10 @@ param_path_node() ->
example => node() example => node()
}. }.
param_path_identifier() -> param_path_id() ->
{Example,_} = hd(emqx_mgmt:list_listeners(node())), {Example,_} = hd(emqx_mgmt:list_listeners(node())),
#{ #{
name => identifier, name => id,
in => path, in => path,
schema => #{type => string}, schema => #{type => string},
required => true, required => true,
@ -199,8 +199,8 @@ listeners(get, _Request) ->
list(). list().
listener(get, Request) -> listener(get, Request) ->
ListenerID = binary_to_atom(cowboy_req:binding(identifier, Request)), ID = binary_to_atom(cowboy_req:binding(id, Request)),
get_listeners(#{identifier => ListenerID}). get_listeners(#{id => ID}).
node_listeners(get, Request) -> node_listeners(get, Request) ->
Node = binary_to_atom(cowboy_req:binding(node, Request)), Node = binary_to_atom(cowboy_req:binding(node, Request)),
@ -208,19 +208,19 @@ node_listeners(get, Request) ->
node_listener(get, Request) -> node_listener(get, Request) ->
Node = binary_to_atom(cowboy_req:binding(node, Request)), Node = binary_to_atom(cowboy_req:binding(node, Request)),
ListenerID = binary_to_atom(cowboy_req:binding(identifier, Request)), ID = binary_to_atom(cowboy_req:binding(id, Request)),
get_listeners(#{node => Node, identifier => ListenerID}). get_listeners(#{node => Node, id => ID}).
manage_listeners(_, Request) -> manage_listeners(_, Request) ->
Identifier = binary_to_atom(cowboy_req:binding(identifier, Request)), ID = binary_to_atom(cowboy_req:binding(id, Request)),
Operation = binary_to_atom(cowboy_req:binding(operation, Request)), Operation = binary_to_atom(cowboy_req:binding(operation, Request)),
manage(Operation, #{identifier => Identifier}). manage(Operation, #{id => ID}).
manage_nodes_listeners(_, Request) -> manage_nodes_listeners(_, Request) ->
Node = binary_to_atom(cowboy_req:binding(node, Request)), Node = binary_to_atom(cowboy_req:binding(node, Request)),
Identifier = binary_to_atom(cowboy_req:binding(identifier, Request)), ID = binary_to_atom(cowboy_req:binding(id, Request)),
Operation = binary_to_atom(cowboy_req:binding(operation, Request)), Operation = binary_to_atom(cowboy_req:binding(operation, Request)),
manage(Operation, #{identifier => Identifier, node => Node}). manage(Operation, #{id => ID, node => Node}).
%%%============================================================================================== %%%==============================================================================================
@ -231,8 +231,8 @@ list() ->
get_listeners(Param) -> get_listeners(Param) ->
case list_listener(Param) of case list_listener(Param) of
{error, not_found} -> {error, not_found} ->
Identifier = maps:get(identifier, Param), ID = maps:get(id, Param),
Reason = list_to_binary(io_lib:format("Error listener identifier ~p", [Identifier])), Reason = list_to_binary(io_lib:format("Error listener id ~p", [ID])),
{404, #{code => 'BAD_LISTENER_ID', message => Reason}}; {404, #{code => 'BAD_LISTENER_ID', message => Reason}};
{error, nodedown} -> {error, nodedown} ->
Node = maps:get(node, Param), Node = maps:get(node, Param),
@ -240,8 +240,8 @@ get_listeners(Param) ->
Response = #{code => 'BAD_NODE_NAME', message => Reason}, Response = #{code => 'BAD_NODE_NAME', message => Reason},
{404, Response}; {404, Response};
[] -> [] ->
Identifier = maps:get(identifier, Param), ID = maps:get(id, Param),
Reason = list_to_binary(io_lib:format("Error listener identifier ~p", [Identifier])), Reason = list_to_binary(io_lib:format("Error listener id ~p", [ID])),
{404, #{code => 'BAD_LISTENER_ID', message => Reason}}; {404, #{code => 'BAD_LISTENER_ID', message => Reason}};
Data -> Data ->
{200, Data} {200, Data}
@ -252,8 +252,8 @@ manage(Operation0, Param) ->
Operation = maps:get(Operation0, OperationMap), Operation = maps:get(Operation0, OperationMap),
case list_listener(Param) of case list_listener(Param) of
{error, not_found} -> {error, not_found} ->
Identifier = maps:get(identifier, Param), ID = maps:get(id, Param),
Reason = list_to_binary(io_lib:format("Error listener identifier ~p", [Identifier])), Reason = list_to_binary(io_lib:format("Error listener id ~p", [ID])),
{404, #{code => 'BAD_LISTENER_ID', message => Reason}}; {404, #{code => 'BAD_LISTENER_ID', message => Reason}};
{error, nodedown} -> {error, nodedown} ->
Node = maps:get(node, Param), Node = maps:get(node, Param),
@ -261,8 +261,8 @@ manage(Operation0, Param) ->
Response = #{code => 'BAD_NODE_NAME', message => Reason}, Response = #{code => 'BAD_NODE_NAME', message => Reason},
{404, Response}; {404, Response};
[] -> [] ->
Identifier = maps:get(identifier, Param), ID = maps:get(id, Param),
Reason = list_to_binary(io_lib:format("Error listener identifier ~p", [Identifier])), Reason = list_to_binary(io_lib:format("Error listener id ~p", [ID])),
{404, #{code => 'RESOURCE_NOT_FOUND', message => Reason}}; {404, #{code => 'RESOURCE_NOT_FOUND', message => Reason}};
ListenersOrSingleListener -> ListenersOrSingleListener ->
manage_(Operation, ListenersOrSingleListener) manage_(Operation, ListenersOrSingleListener)
@ -278,14 +278,14 @@ manage_(Operation, Listeners) when is_list(Listeners) ->
Errors -> Errors ->
case lists:filter(fun({error, {already_started, _}}) -> false; (_) -> true end, Results) of case lists:filter(fun({error, {already_started, _}}) -> false; (_) -> true end, Results) of
[] -> [] ->
Identifier = maps:get(identifier, hd(Listeners)), ID = maps:get(id, hd(Listeners)),
Message = list_to_binary(io_lib:format("Already Started: ~s", [Identifier])), Message = list_to_binary(io_lib:format("Already Started: ~s", [ID])),
{400, #{code => 'BAD_REQUEST', message => Message}}; {400, #{code => 'BAD_REQUEST', message => Message}};
_ -> _ ->
case lists:filter(fun({error,not_found}) -> false; (_) -> true end, Results) of case lists:filter(fun({error,not_found}) -> false; (_) -> true end, Results) of
[] -> [] ->
Identifier = maps:get(identifier, hd(Listeners)), ID = maps:get(id, hd(Listeners)),
Message = list_to_binary(io_lib:format("Already Stoped: ~s", [Identifier])), Message = list_to_binary(io_lib:format("Already Stopped: ~s", [ID])),
{400, #{code => 'BAD_REQUEST', message => Message}}; {400, #{code => 'BAD_REQUEST', message => Message}};
_ -> _ ->
Reason = list_to_binary(io_lib:format("~p", [Errors])), Reason = list_to_binary(io_lib:format("~p", [Errors])),
@ -299,9 +299,9 @@ manage_(Operation, Listeners) when is_list(Listeners) ->
list_listener(Params) -> list_listener(Params) ->
format(list_listener_(Params)). format(list_listener_(Params)).
list_listener_(#{node := Node, identifier := Identifier}) -> list_listener_(#{node := Node, id := Identifier}) ->
emqx_mgmt:get_listener(Node, Identifier); emqx_mgmt:get_listener(Node, Identifier);
list_listener_(#{identifier := Identifier}) -> list_listener_(#{id := Identifier}) ->
emqx_mgmt:list_listeners_by_id(Identifier); emqx_mgmt:list_listeners_by_id(Identifier);
list_listener_(#{node := Node}) -> list_listener_(#{node := Node}) ->
emqx_mgmt:list_listeners(Node); emqx_mgmt:list_listeners(Node);
@ -314,9 +314,9 @@ format(Listeners) when is_list(Listeners) ->
format({error, Reason}) -> format({error, Reason}) ->
{error, Reason}; {error, Reason};
format({Identifier, Conf}) -> format({ID, Conf}) ->
#{ #{
identifier => Identifier, id => ID,
node => maps:get(node, Conf), node => maps:get(node, Conf),
acceptors => maps:get(acceptors, Conf), acceptors => maps:get(acceptors, Conf),
max_conn => maps:get(max_connections, Conf), max_conn => maps:get(max_connections, Conf),

View File

@ -49,36 +49,41 @@ t_list_node_listeners(_) ->
t_get_listeners(_) -> t_get_listeners(_) ->
LocalListener = emqx_mgmt_api_listeners:format(hd(emqx_mgmt:list_listeners())), LocalListener = emqx_mgmt_api_listeners:format(hd(emqx_mgmt:list_listeners())),
Identifier = maps:get(identifier, LocalListener), ID = maps:get(id, LocalListener),
Path = emqx_mgmt_api_test_util:api_path(["listeners", atom_to_list(Identifier)]), Path = emqx_mgmt_api_test_util:api_path(["listeners", atom_to_list(ID)]),
get_api(Path). get_api(Path).
t_get_node_listeners(_) -> t_get_node_listeners(_) ->
LocalListener = emqx_mgmt_api_listeners:format(hd(emqx_mgmt:list_listeners())), LocalListener = emqx_mgmt_api_listeners:format(hd(emqx_mgmt:list_listeners())),
Identifier = maps:get(identifier, LocalListener), ID = maps:get(id, LocalListener),
Path = emqx_mgmt_api_test_util:api_path( Path = emqx_mgmt_api_test_util:api_path(
["nodes", atom_to_binary(node(), utf8), "listeners", atom_to_list(Identifier)]), ["nodes", atom_to_binary(node(), utf8), "listeners", atom_to_list(ID)]),
get_api(Path). get_api(Path).
t_stop_listener(_) -> t_manage_listener(_) ->
LocalListener = emqx_mgmt_api_listeners:format(hd(emqx_mgmt:list_listeners())), ID = "default:mqtt_tcp",
Identifier = maps:get(identifier, LocalListener), manage_listener(ID, "stop", false),
Path = emqx_mgmt_api_test_util:api_path(["listeners", atom_to_list(Identifier), "stop"]), manage_listener(ID, "start", true),
manage_listener(ID, "restart", true).
manage_listener(ID, Operation, Running) ->
Path = emqx_mgmt_api_test_util:api_path(["listeners", ID, Operation]),
{ok, _} = emqx_mgmt_api_test_util:request_api(get, Path), {ok, _} = emqx_mgmt_api_test_util:request_api(get, Path),
GetPath = emqx_mgmt_api_test_util:api_path(["listeners", atom_to_list(Identifier)]), timer:sleep(500),
GetPath = emqx_mgmt_api_test_util:api_path(["listeners", ID]),
{ok, ListenersResponse} = emqx_mgmt_api_test_util:request_api(get, GetPath), {ok, ListenersResponse} = emqx_mgmt_api_test_util:request_api(get, GetPath),
Listeners = emqx_json:decode(ListenersResponse, [return_maps]), Listeners = emqx_json:decode(ListenersResponse, [return_maps]),
[listener_stats(Listener, false) || Listener <- Listeners]. [listener_stats(Listener, Running) || Listener <- Listeners].
get_api(Path) -> get_api(Path) ->
{ok, ListenersData} = emqx_mgmt_api_test_util:request_api(get, Path), {ok, ListenersData} = emqx_mgmt_api_test_util:request_api(get, Path),
LocalListeners = emqx_mgmt_api_listeners:format(emqx_mgmt:list_listeners()), LocalListeners = emqx_mgmt_api_listeners:format(emqx_mgmt:list_listeners()),
case emqx_json:decode(ListenersData, [return_maps]) of case emqx_json:decode(ListenersData, [return_maps]) of
[Listener] -> [Listener] ->
Identifier = binary_to_atom(maps:get(<<"identifier">>, Listener), utf8), ID = binary_to_atom(maps:get(<<"id">>, Listener), utf8),
Filter = Filter =
fun(Local) -> fun(Local) ->
maps:get(identifier, Local) =:= Identifier maps:get(id, Local) =:= ID
end, end,
LocalListener = hd(lists:filter(Filter, LocalListeners)), LocalListener = hd(lists:filter(Filter, LocalListeners)),
comparison_listener(LocalListener, Listener); comparison_listener(LocalListener, Listener);
@ -86,28 +91,28 @@ get_api(Path) ->
?assertEqual(erlang:length(LocalListeners), erlang:length(Listeners)), ?assertEqual(erlang:length(LocalListeners), erlang:length(Listeners)),
Fun = Fun =
fun(LocalListener) -> fun(LocalListener) ->
Identifier = maps:get(identifier, LocalListener), ID = maps:get(id, LocalListener),
IdentifierBinary = atom_to_binary(Identifier, utf8), IDBinary = atom_to_binary(ID, utf8),
Filter = Filter =
fun(Listener) -> fun(Listener) ->
maps:get(<<"identifier">>, Listener) =:= IdentifierBinary maps:get(<<"id">>, Listener) =:= IDBinary
end, end,
Listener = hd(lists:filter(Filter, Listeners)), Listener = hd(lists:filter(Filter, Listeners)),
comparison_listener(LocalListener, Listener) comparison_listener(LocalListener, Listener)
end, end,
lists:foreach(Fun, LocalListeners); lists:foreach(Fun, LocalListeners);
Listener when is_map(Listener) -> Listener when is_map(Listener) ->
Identifier = binary_to_atom(maps:get(<<"identifier">>, Listener), utf8), ID = binary_to_atom(maps:get(<<"id">>, Listener), utf8),
Filter = Filter =
fun(Local) -> fun(Local) ->
maps:get(identifier, Local) =:= Identifier maps:get(id, Local) =:= ID
end, end,
LocalListener = hd(lists:filter(Filter, LocalListeners)), LocalListener = hd(lists:filter(Filter, LocalListeners)),
comparison_listener(LocalListener, Listener) comparison_listener(LocalListener, Listener)
end. end.
comparison_listener(Local, Response) -> comparison_listener(Local, Response) ->
?assertEqual(maps:get(identifier, Local), binary_to_atom(maps:get(<<"identifier">>, Response))), ?assertEqual(maps:get(id, Local), binary_to_atom(maps:get(<<"id">>, Response))),
?assertEqual(maps:get(node, Local), binary_to_atom(maps:get(<<"node">>, Response))), ?assertEqual(maps:get(node, Local), binary_to_atom(maps:get(<<"node">>, Response))),
?assertEqual(maps:get(acceptors, Local), maps:get(<<"acceptors">>, Response)), ?assertEqual(maps:get(acceptors, Local), maps:get(<<"acceptors">>, Response)),
?assertEqual(maps:get(max_conn, Local), maps:get(<<"max_conn">>, Response)), ?assertEqual(maps:get(max_conn, Local), maps:get(<<"max_conn">>, Response)),