From 03d3fc42c70b3c983da5d29f3a9f2111f5fc9d16 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Fri, 17 Jun 2022 14:52:23 +0800 Subject: [PATCH 1/3] fix(mgmt): avoid to HTTP dispatch failure due to an URI defination conflict Since we bave defined - `listeners/{listener_id}/authentication` in emqx_authn_api.erl - and `listeners/{id}/{action}` in emqx_mgmt_api_listeners.erl The HTTP Router always dispatch the `.../authentication` request to `listeners/{id}/{action}`, which cause a no_union_member checking error. In this PR, we make a workaround to avoid this dispatch error --- .../src/emqx_mgmt_api_listeners.erl | 73 +++++++++++++++---- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl index 5ff76062f..88f071580 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">>, @@ -158,21 +192,12 @@ fields(listener_id) -> {id, ?HOCON(atom(), #{ desc => "Listener id", - example => 'tcp:demo', + example => 'tcp:default', validator => fun validate_id/1, required => true, 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], From 5bde280b5ff527484c401429822f999ae9d44fbc Mon Sep 17 00:00:00 2001 From: JianBo He Date: Fri, 17 Jun 2022 17:48:22 +0800 Subject: [PATCH 2/3] chore: update apps/emqx_management/src/emqx_mgmt_api_listeners.erl --- apps/emqx_management/src/emqx_mgmt_api_listeners.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl index 88f071580..fc01764aa 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_listeners.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_listeners.erl @@ -192,7 +192,7 @@ fields(listener_id) -> {id, ?HOCON(atom(), #{ desc => "Listener id", - example => 'tcp:default', + example => 'tcp:demo', validator => fun validate_id/1, required => true, in => path From 403ee13e178a9eb3d5584487196d4f1be3ac68e8 Mon Sep 17 00:00:00 2001 From: JianBo He Date: Fri, 17 Jun 2022 20:00:38 +0800 Subject: [PATCH 3/3] test: increase waiting time --- apps/emqx/test/emqx_ws_connection_SUITE.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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.