diff --git a/apps/emqx/test/emqx_ws_connection_SUITE.erl b/apps/emqx/test/emqx_ws_connection_SUITE.erl index 4788298fb..89d892c67 100644 --- a/apps/emqx/test/emqx_ws_connection_SUITE.erl +++ b/apps/emqx/test/emqx_ws_connection_SUITE.erl @@ -687,7 +687,7 @@ ws_client(State) -> Message -> ct:pal("Received Unknown Message on Gun: ~p~n", [Message]), ws_client(State) - after 1000 -> + after 5000 -> ct:fail(ws_timeout) end. diff --git a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl index 5ff76062f..fc01764aa 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl @@ -25,6 +25,9 @@ listener_type_status/2, list_listeners/2, crud_listeners_by_id/2, + stop_listeners_by_id/2, + start_listeners_by_id/2, + restart_listeners_by_id/2, action_listeners_by_id/2 ]). @@ -53,7 +56,9 @@ paths() -> "/listeners_status", "/listeners", "/listeners/:id", - "/listeners/:id/:action" + "/listeners/:id/stop", + "/listeners/:id/start", + "/listeners/:id/restart" ]. schema("/listeners_status") -> @@ -136,15 +141,44 @@ schema("/listeners/:id") -> } } }; -schema("/listeners/:id/:action") -> +schema("/listeners/:id/start") -> #{ - 'operationId' => action_listeners_by_id, + 'operationId' => start_listeners_by_id, post => #{ tags => [<<"listeners">>], - desc => <<"Start/stop/restart listeners on all nodes.">>, + desc => <<"Start the listener on all nodes.">>, parameters => [ - ?R_REF(listener_id), - ?R_REF(action) + ?R_REF(listener_id) + ], + responses => #{ + 200 => <<"Updated">>, + 400 => error_codes(['BAD_REQUEST', 'BAD_LISTENER_ID']) + } + } + }; +schema("/listeners/:id/stop") -> + #{ + 'operationId' => stop_listeners_by_id, + post => #{ + tags => [<<"listeners">>], + desc => <<"Stop the listener on all nodes.">>, + parameters => [ + ?R_REF(listener_id) + ], + responses => #{ + 200 => <<"Updated">>, + 400 => error_codes(['BAD_REQUEST', 'BAD_LISTENER_ID']) + } + } + }; +schema("/listeners/:id/restart") -> + #{ + 'operationId' => restart_listeners_by_id, + post => #{ + tags => [<<"listeners">>], + desc => <<"Restart listeners on all nodes.">>, + parameters => [ + ?R_REF(listener_id) ], responses => #{ 200 => <<"Updated">>, @@ -164,15 +198,6 @@ fields(listener_id) -> in => path })} ]; -fields(action) -> - [ - {action, - ?HOCON(?ENUM([start, stop, restart]), #{ - desc => "listener action", - example => start, - in => path - })} - ]; fields(node) -> [ {"node", @@ -371,6 +396,22 @@ parse_listener_conf(Conf0) -> false -> {error, listener_type_inconsistent} end. +stop_listeners_by_id(Method, Body = #{bindings := Bindings}) -> + action_listeners_by_id( + Method, + Body#{bindings := maps:put(action, stop, Bindings)} + ). +start_listeners_by_id(Method, Body = #{bindings := Bindings}) -> + action_listeners_by_id( + Method, + Body#{bindings := maps:put(action, start, Bindings)} + ). +restart_listeners_by_id(Method, Body = #{bindings := Bindings}) -> + action_listeners_by_id( + Method, + Body#{bindings := maps:put(action, restart, Bindings)} + ). + action_listeners_by_id(post, #{bindings := #{id := Id, action := Action}}) -> {ok, #{type := Type, name := Name}} = emqx_listeners:parse_listener_id(Id), Path = [listeners, Type, Name],