Просмотр исходного кода

fix: restart bridges via HTTP APIs to wrong node

Shawn 3 лет назад
Родитель
Сommit
9a033af2e8

+ 2 - 2
apps/emqx_bridge/i18n/emqx_bridge_api.conf

@@ -13,8 +13,8 @@ emqx_bridge_api {
 
 
     desc_param_path_operation_on_node {
     desc_param_path_operation_on_node {
                    desc {
                    desc {
-                         en: """Operations can be one of: start, stop, restart"""
-                         zh: """节点可用操作:启动、停止、重新启动"""
+                         en: """Operations can be one of: stop, restart"""
+                         zh: """节点可用操作:停止、重新启动"""
                         }
                         }
                    label: {
                    label: {
                            en: "Node Operation "
                            en: "Node Operation "

+ 9 - 4
apps/emqx_bridge/src/emqx_bridge_api.erl

@@ -486,20 +486,21 @@ lookup_from_local_node(BridgeType, BridgeName) ->
 
 
 '/nodes/:node/bridges/:id/operation/:operation'(post, #{
 '/nodes/:node/bridges/:id/operation/:operation'(post, #{
     bindings :=
     bindings :=
-        #{id := Id, operation := Op}
+        #{id := Id, operation := Op, node := Node}
 }) ->
 }) ->
     ?TRY_PARSE_ID(
     ?TRY_PARSE_ID(
         Id,
         Id,
-        case operation_func(Op) of
+        case node_operation_func(Op) of
             invalid ->
             invalid ->
                 {400, error_msg('BAD_REQUEST', <<"invalid operation">>)};
                 {400, error_msg('BAD_REQUEST', <<"invalid operation">>)};
-            OperFunc when OperFunc == restart; OperFunc == stop ->
+            OperFunc ->
+                TargetNode = binary_to_atom(Node, utf8),
                 ConfMap = emqx:get_config([bridges, BridgeType, BridgeName]),
                 ConfMap = emqx:get_config([bridges, BridgeType, BridgeName]),
                 case maps:get(enable, ConfMap, false) of
                 case maps:get(enable, ConfMap, false) of
                     false ->
                     false ->
                         {403, error_msg('FORBIDDEN_REQUEST', <<"forbidden operation">>)};
                         {403, error_msg('FORBIDDEN_REQUEST', <<"forbidden operation">>)};
                     true ->
                     true ->
-                        case emqx_bridge:OperFunc(BridgeType, BridgeName) of
+                        case emqx_bridge_proto_v1:OperFunc(TargetNode, BridgeType, BridgeName) of
                             ok -> {200};
                             ok -> {200};
                             {error, Reason} -> {500, error_msg('INTERNAL_ERROR', Reason)}
                             {error, Reason} -> {500, error_msg('INTERNAL_ERROR', Reason)}
                         end
                         end
@@ -507,6 +508,10 @@ lookup_from_local_node(BridgeType, BridgeName) ->
         end
         end
     ).
     ).
 
 
+node_operation_func(<<"stop">>) -> stop_bridge_to_node;
+node_operation_func(<<"restart">>) -> restart_bridge_to_node;
+node_operation_func(_) -> invalid.
+
 operation_func(<<"stop">>) -> stop;
 operation_func(<<"stop">>) -> stop;
 operation_func(<<"restart">>) -> restart;
 operation_func(<<"restart">>) -> restart;
 operation_func(<<"enable">>) -> enable;
 operation_func(<<"enable">>) -> enable;

+ 24 - 0
apps/emqx_bridge/src/proto/emqx_bridge_proto_v1.erl

@@ -22,6 +22,8 @@
     introduced_in/0,
     introduced_in/0,
 
 
     list_bridges/1,
     list_bridges/1,
+    restart_bridge_to_node/3,
+    stop_bridge_to_node/3,
     lookup_from_all_nodes/3,
     lookup_from_all_nodes/3,
     restart_bridges_to_all_nodes/3,
     restart_bridges_to_all_nodes/3,
     stop_bridges_to_all_nodes/3
     stop_bridges_to_all_nodes/3
@@ -40,6 +42,28 @@ list_bridges(Node) ->
 
 
 -type key() :: atom() | binary() | [byte()].
 -type key() :: atom() | binary() | [byte()].
 
 
+-spec restart_bridge_to_node(node(), key(), key()) ->
+    term().
+restart_bridge_to_node(Node, BridgeType, BridgeName) ->
+    rpc:call(
+        Node,
+        emqx_bridge,
+        restart,
+        [BridgeType, BridgeName],
+        ?TIMEOUT
+    ).
+
+-spec stop_bridge_to_node(node(), key(), key()) ->
+    term().
+stop_bridge_to_node(Node, BridgeType, BridgeName) ->
+    rpc:call(
+        Node,
+        emqx_bridge,
+        stop,
+        [BridgeType, BridgeName],
+        ?TIMEOUT
+    ).
+
 -spec restart_bridges_to_all_nodes([node()], key(), key()) ->
 -spec restart_bridges_to_all_nodes([node()], key(), key()) ->
     emqx_rpc:erpc_multicall().
     emqx_rpc:erpc_multicall().
 restart_bridges_to_all_nodes(Nodes, BridgeType, BridgeName) ->
 restart_bridges_to_all_nodes(Nodes, BridgeType, BridgeName) ->