Forráskód Böngészése

Merge pull request #9951 from sstrigler/EMQX-8929-handle-error-results-in-bridge-api-for-multicall-operations

fix(emqx_bridge): unwrap rpc multicall result
Stefan Strigler 3 éve
szülő
commit
be615a2bb1

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

@@ -856,7 +856,7 @@ unpack_bridge_conf(Type, PackedConf) ->
 
 is_ok(ok) ->
     ok;
-is_ok({ok, _} = OkResult) ->
+is_ok(OkResult = {ok, _}) ->
     OkResult;
 is_ok(Error = {error, _}) ->
     Error;
@@ -933,7 +933,9 @@ maybe_try_restart(_, _, _) ->
     {501}.
 
 do_bpapi_call(all, Call, Args) ->
-    do_bpapi_call_vsn(emqx_bpapi:supported_version(emqx_bridge), Call, Args);
+    maybe_unwrap(
+        do_bpapi_call_vsn(emqx_bpapi:supported_version(emqx_bridge), Call, Args)
+    );
 do_bpapi_call(Node, Call, Args) ->
     do_bpapi_call_vsn(emqx_bpapi:supported_version(Node, emqx_bridge), Call, Args).
 
@@ -945,6 +947,11 @@ do_bpapi_call_vsn(SupportedVersion, Call, Args) ->
             {error, not_implemented}
     end.
 
+maybe_unwrap({error, not_implemented}) ->
+    {error, not_implemented};
+maybe_unwrap(RpcMulticallResult) ->
+    emqx_rpc:unwrap_erpc(RpcMulticallResult).
+
 supported_versions(start_bridge_to_node) -> [2];
 supported_versions(start_bridges_to_all_nodes) -> [2];
 supported_versions(_Call) -> [1, 2].

+ 26 - 2
apps/emqx_bridge/test/emqx_bridge_api_SUITE.erl

@@ -38,12 +38,16 @@
     <<"type">> => TYPE,
     <<"name">> => NAME
 }).
--define(MQTT_BRIDGE(SERVER), ?BRIDGE(<<"mqtt_egress_test_bridge">>, <<"mqtt">>)#{
+
+-define(BRIDGE_TYPE_MQTT, <<"mqtt">>).
+-define(MQTT_BRIDGE(SERVER, NAME), ?BRIDGE(NAME, ?BRIDGE_TYPE_MQTT)#{
     <<"server">> => SERVER,
     <<"username">> => <<"user1">>,
     <<"password">> => <<"">>,
     <<"proto_ver">> => <<"v5">>
 }).
+-define(MQTT_BRIDGE(SERVER), ?MQTT_BRIDGE(SERVER, <<"mqtt_egress_test_bridge">>)).
+
 -define(HTTP_BRIDGE(URL, TYPE, NAME), ?BRIDGE(NAME, TYPE)#{
     <<"url">> => URL,
     <<"local_topic">> => <<"emqx_webhook/#">>,
@@ -536,7 +540,27 @@ do_start_stop_bridges(Type, Config) ->
     ?assertMatch(#{<<"status">> := <<"connected">>}, jsx:decode(Bridge4)),
     %% delete the bridge
     {ok, 204, <<>>} = request(delete, uri(["bridges", BridgeID]), []),
-    {ok, 200, <<"[]">>} = request(get, uri(["bridges"]), []).
+    {ok, 200, <<"[]">>} = request(get, uri(["bridges"]), []),
+
+    %% Create broken bridge
+    BadServer = <<"nohost">>,
+    BadName = <<"bad_", (atom_to_binary(Type))/binary>>,
+    {ok, 201, BadBridge1} = request(
+        post,
+        uri(["bridges"]),
+        ?MQTT_BRIDGE(BadServer, BadName)
+    ),
+    #{
+        <<"type">> := ?BRIDGE_TYPE_MQTT,
+        <<"name">> := BadName,
+        <<"enable">> := true,
+        <<"server">> := BadServer,
+        <<"status">> := <<"disconnected">>,
+        <<"node_status">> := [_ | _]
+    } = jsx:decode(BadBridge1),
+    BadBridgeID = emqx_bridge_resource:bridge_id(?BRIDGE_TYPE_MQTT, BadName),
+    {ok, 500, _} = request(post, operation_path(Type, start, BadBridgeID), <<"">>),
+    ok.
 
 t_enable_disable_bridges(Config) ->
     %% assert we there's no bridges at first

+ 1 - 0
changes/v5.0.17/fix-9951.en.md

@@ -0,0 +1 @@
+Propagate errors from operations (`start|stop|restart`) on bridges API if called for all nodes.

+ 1 - 0
changes/v5.0.17/fix-9951.zh.md

@@ -0,0 +1 @@
+返回桥接 API 操作(`start|stop|restart`) 的多节点远程调用的错误信息。