From b0b518067acfe9a85ddd2c6897d55649cf684261 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Fri, 13 Oct 2023 07:37:46 +0200 Subject: [PATCH] fix: remove connector as well on Bridge V1 remove For backwards compatibility we remove the connector for the Bridge V2 bridge when performing the remove operation but only if no other channels depend on the connector. --- apps/emqx_bridge/src/emqx_bridge.erl | 6 ++++- apps/emqx_bridge/src/emqx_bridge_v2.erl | 34 +++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/emqx_bridge/src/emqx_bridge.erl b/apps/emqx_bridge/src/emqx_bridge.erl index c8a91e1b3..8777274bd 100644 --- a/apps/emqx_bridge/src/emqx_bridge.erl +++ b/apps/emqx_bridge/src/emqx_bridge.erl @@ -398,7 +398,11 @@ remove_v1(BridgeType, BridgeName) -> check_deps_and_remove(BridgeType, BridgeName, RemoveDeps) -> case emqx_bridge_v2:is_bridge_v2_type(BridgeType) of true -> - emqx_bridge_v2:check_deps_and_remove(BridgeType, BridgeName, RemoveDeps); + emqx_bridge_v2:check_deps_and_remove_transform_to_bridge_v1( + BridgeType, + BridgeName, + RemoveDeps + ); false -> check_deps_and_remove_v1(BridgeType, BridgeName, RemoveDeps) end. diff --git a/apps/emqx_bridge/src/emqx_bridge_v2.erl b/apps/emqx_bridge/src/emqx_bridge_v2.erl index dd158aee2..96f227f2c 100644 --- a/apps/emqx_bridge/src/emqx_bridge_v2.erl +++ b/apps/emqx_bridge/src/emqx_bridge_v2.erl @@ -647,13 +647,43 @@ check_deps_and_remove(BridgeType, BridgeName, RemoveDeps) -> end. check_deps_and_remove_transform_to_bridge_v1(BridgeType, BridgeName, RemoveDeps) -> + check_deps_and_remove_transform_to_bridge_v1( + BridgeType, + BridgeName, + RemoveDeps, + lookup_raw_conf(BridgeType, BridgeName) + ). + +check_deps_and_remove_transform_to_bridge_v1( + BridgeType, + BridgeName, + RemoveDeps, + #{connector := ConnectorName} +) -> case check_deps_and_remove(BridgeType, BridgeName, RemoveDeps) of {error, _} = Error -> Error; Result -> - %% TODO: We should call emqx_connector:check_deps_and_remove here - %% to remain as backward compatible as possible. + %% Check if there are other channels that depends on the same connector + case connector_has_channels(BridgeType, ConnectorName) of + false -> + ConnectorType = bridge_v2_type_to_connector_type(BridgeType), + emqx_connector:remove(ConnectorType, ConnectorName); + true -> + ok + end, Result + end; +check_deps_and_remove_transform_to_bridge_v1(_BridgeType, _BridgeName, _RemoveDeps, Error) -> + Error. + +connector_has_channels(BridgeV2Type, ConnectorName) -> + ConnectorType = bridge_v2_type_to_connector_type(BridgeV2Type), + case emqx_connector_resource:get_channels(ConnectorType, ConnectorName) of + {ok, []} -> + false; + _ -> + true end. %% NOTE: We depends on the `emqx_bridge:pre_config_update/3` to restart/stop the