Przeglądaj źródła

Merge branch 'release-50' into file-transfer

* release-50:
  fix(limiter): fix an error when setting `max_conn_rate` in a listener
  chore: bump erlcloud dependencies vsns
  chore: rename dynamo template files
  refactor(dynamo): move dynamo bridge into its own app
  chore: update changes && bump app versions
  fix: issues with the RabbitMQ config
  refactor(pgsql): move pgsql && matrix && timescale bridges into their own app
  fix: the iotdb password field so it has the password format
  chore: update changes
  refactor(tdengine): move tdengine bridge into its own app
  feat: deprecate listeners's authn http api
Ilya Averyanov 2 lat temu
rodzic
commit
5b5d7ceac5
57 zmienionych plików z 174 dodań i 106 usunięć
  1. 2 1
      apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl
  2. 28 21
      apps/emqx/src/emqx_listeners.erl
  3. 1 1
      apps/emqx_authn/src/emqx_authn.app.src
  4. 12 0
      apps/emqx_authn/src/emqx_authn_api.erl
  5. 1 0
      apps/emqx_authn/src/emqx_authn_user_import_api.erl
  6. 2 0
      apps/emqx_bridge_dynamo/docker-ct
  7. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_acked.json
  8. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_client.json
  9. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_clientid_msg_map.json
  10. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_msg.json
  11. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_retain.json
  12. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_sub.json
  13. 0 0
      apps/emqx_bridge_dynamo/priv/dynamo/mqtt_topic_msg_map.json
  14. 11 0
      apps/emqx_bridge_dynamo/rebar.config
  15. 2 2
      apps/emqx_bridge_dynamo/src/emqx_bridge_dynamo.app.src
  16. 2 2
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_dynamo.erl
  17. 4 4
      lib-ee/emqx_ee_connector/src/emqx_ee_connector_dynamo.erl
  18. 2 1
      lib-ee/emqx_ee_connector/src/emqx_ee_connector_dynamo_client.erl
  19. 11 3
      lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_dynamo_SUITE.erl
  20. 1 0
      apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl
  21. 7 0
      apps/emqx_bridge_matrix/rebar.config
  22. 1 1
      apps/emqx_bridge_matrix/src/emqx_bridge_matrix.app.src
  23. 4 4
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_matrix.erl
  24. 2 0
      apps/emqx_bridge_pgsql/docker-ct
  25. 7 0
      apps/emqx_bridge_pgsql/rebar.config
  26. 1 1
      apps/emqx_bridge_pgsql/src/emqx_bridge_pgsql.app.src
  27. 2 2
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_pgsql.erl
  28. 1 1
      lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_pgsql_SUITE.erl
  29. 1 1
      apps/emqx_bridge_rabbitmq/src/emqx_bridge_rabbitmq.erl
  30. 1 16
      apps/emqx_bridge_rabbitmq/src/emqx_bridge_rabbitmq_connector.erl
  31. 2 0
      apps/emqx_bridge_tdengine/docker-ct
  32. 8 0
      apps/emqx_bridge_tdengine/rebar.config
  33. 2 2
      apps/emqx_bridge_tdengine/src/emqx_bridge_tdengine.app.src
  34. 3 2
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_tdengine.erl
  35. 1 1
      lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl
  36. 1 1
      lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_tdengine_SUITE.erl
  37. 7 0
      apps/emqx_bridge_timescale/rebar.config
  38. 1 1
      apps/emqx_bridge_timescale/src/emqx_bridge_timescale.app.src
  39. 4 4
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_timescale.erl
  40. 1 0
      changes/ee/feat-10650.en.md
  41. 1 0
      changes/ee/feat-10662.en.md
  42. 0 3
      lib-ee/emqx_ee_bridge/docker-ct
  43. 3 1
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge.app.src
  44. 15 15
      lib-ee/emqx_ee_bridge/src/emqx_ee_bridge.erl
  45. 1 2
      lib-ee/emqx_ee_connector/rebar.config
  46. 1 3
      lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src
  47. 7 0
      mix.exs
  48. 1 1
      rel/i18n/emqx_ee_bridge_dynamo.hocon
  49. 1 1
      rel/i18n/emqx_ee_connector_dynamo.hocon
  50. 1 1
      rel/i18n/emqx_ee_bridge_pgsql.hocon
  51. 1 1
      rel/i18n/emqx_ee_bridge_tdengine.hocon
  52. 1 1
      rel/i18n/emqx_ee_connector_tdengine.hocon
  53. 1 1
      rel/i18n/zh/emqx_ee_bridge_dynamo.hocon
  54. 1 1
      rel/i18n/zh/emqx_ee_connector_dynamo.hocon
  55. 1 1
      rel/i18n/zh/emqx_ee_bridge_pgsql.hocon
  56. 1 1
      rel/i18n/zh/emqx_ee_bridge_tdengine.hocon
  57. 1 1
      rel/i18n/zh/emqx_ee_connector_tdengine.hocon

+ 2 - 1
apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl

@@ -286,7 +286,8 @@ default_client_config() ->
 default_bucket_config() ->
     #{
         rate => infinity,
-        burst => 0
+        burst => 0,
+        initial => 0
     }.
 
 get_listener_opts(Conf) ->

+ 28 - 21
apps/emqx/src/emqx_listeners.erl

@@ -347,7 +347,8 @@ do_start_listener(Type, ListenerName, #{bind := ListenOn} = Opts) when
     Type == tcp; Type == ssl
 ->
     Id = listener_id(Type, ListenerName),
-    add_limiter_bucket(Id, Opts),
+    Limiter = limiter(Opts),
+    add_limiter_bucket(Id, Limiter),
     esockd:open(
         Id,
         ListenOn,
@@ -356,7 +357,7 @@ do_start_listener(Type, ListenerName, #{bind := ListenOn} = Opts) when
             #{
                 listener => {Type, ListenerName},
                 zone => zone(Opts),
-                limiter => limiter(Opts),
+                limiter => Limiter,
                 enable_authn => enable_authn(Opts)
             }
         ]}
@@ -366,9 +367,10 @@ do_start_listener(Type, ListenerName, #{bind := ListenOn} = Opts) when
     Type == ws; Type == wss
 ->
     Id = listener_id(Type, ListenerName),
-    add_limiter_bucket(Id, Opts),
+    Limiter = limiter(Opts),
+    add_limiter_bucket(Id, Limiter),
     RanchOpts = ranch_opts(Type, ListenOn, Opts),
-    WsOpts = ws_opts(Type, ListenerName, Opts),
+    WsOpts = ws_opts(Type, ListenerName, Opts, Limiter),
     case Type of
         ws -> cowboy:start_clear(Id, RanchOpts, WsOpts);
         wss -> cowboy:start_tls(Id, RanchOpts, WsOpts)
@@ -415,20 +417,22 @@ do_start_listener(quic, ListenerName, #{bind := Bind} = Opts) ->
                         Password -> [{password, str(Password)}]
                     end ++
                     optional_quic_listener_opts(Opts),
+            Limiter = limiter(Opts),
             ConnectionOpts = #{
                 conn_callback => emqx_quic_connection,
                 peer_unidi_stream_count => maps:get(peer_unidi_stream_count, Opts, 1),
                 peer_bidi_stream_count => maps:get(peer_bidi_stream_count, Opts, 10),
                 zone => zone(Opts),
                 listener => {quic, ListenerName},
-                limiter => limiter(Opts)
+                limiter => Limiter
             },
             StreamOpts = #{
                 stream_callback => emqx_quic_stream,
                 active => 1
             },
+
             Id = listener_id(quic, ListenerName),
-            add_limiter_bucket(Id, Opts),
+            add_limiter_bucket(Id, Limiter),
             quicer:start_listener(
                 Id,
                 ListenOn,
@@ -532,12 +536,12 @@ esockd_opts(ListenerId, Type, Opts0) ->
         end
     ).
 
-ws_opts(Type, ListenerName, Opts) ->
+ws_opts(Type, ListenerName, Opts, Limiter) ->
     WsPaths = [
         {emqx_utils_maps:deep_get([websocket, mqtt_path], Opts, "/mqtt"), emqx_ws_connection, #{
             zone => zone(Opts),
             listener => {Type, ListenerName},
-            limiter => limiter(Opts),
+            limiter => Limiter,
             enable_authn => enable_authn(Opts)
         }}
     ],
@@ -653,26 +657,29 @@ zone(Opts) ->
 limiter(Opts) ->
     emqx_limiter_schema:get_listener_opts(Opts).
 
-add_limiter_bucket(Id, #{limiter := Limiter}) ->
+add_limiter_bucket(_Id, undefined) ->
+    ok;
+add_limiter_bucket(Id, Limiter) ->
     maps:fold(
         fun(Type, Cfg, _) ->
             emqx_limiter_server:add_bucket(Id, Type, Cfg)
         end,
         ok,
         maps:without([client], Limiter)
-    );
-add_limiter_bucket(_Id, _Cfg) ->
-    ok.
+    ).
 
-del_limiter_bucket(Id, #{limiter := Limiters}) ->
-    lists:foreach(
-        fun(Type) ->
-            emqx_limiter_server:del_bucket(Id, Type)
-        end,
-        maps:keys(Limiters)
-    );
-del_limiter_bucket(_Id, _Cfg) ->
-    ok.
+del_limiter_bucket(Id, Conf) ->
+    case limiter(Conf) of
+        undefined ->
+            ok;
+        Limiter ->
+            lists:foreach(
+                fun(Type) ->
+                    emqx_limiter_server:del_bucket(Id, Type)
+                end,
+                maps:keys(Limiter)
+            )
+    end.
 
 enable_authn(Opts) ->
     maps:get(enable_authn, Opts, true).

+ 1 - 1
apps/emqx_authn/src/emqx_authn.app.src

@@ -1,7 +1,7 @@
 %% -*- mode: erlang -*-
 {application, emqx_authn, [
     {description, "EMQX Authentication"},
-    {vsn, "0.1.18"},
+    {vsn, "0.1.19"},
     {modules, []},
     {registered, [emqx_authn_sup, emqx_authn_registry]},
     {applications, [kernel, stdlib, emqx_resource, emqx_connector, ehttpc, epgsql, mysql, jose]},

+ 12 - 0
apps/emqx_authn/src/emqx_authn_api.erl

@@ -228,6 +228,7 @@ schema("/listeners/:listener_id/authentication") ->
         'operationId' => listener_authenticators,
         get => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_get),
             parameters => [param_listener_id()],
             responses => #{
@@ -239,6 +240,7 @@ schema("/listeners/:listener_id/authentication") ->
         },
         post => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_post),
             parameters => [param_listener_id()],
             'requestBody' => emqx_dashboard_swagger:schema_with_examples(
@@ -260,6 +262,7 @@ schema("/listeners/:listener_id/authentication/:id") ->
         'operationId' => listener_authenticator,
         get => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_get),
             parameters => [param_listener_id(), param_auth_id()],
             responses => #{
@@ -272,6 +275,7 @@ schema("/listeners/:listener_id/authentication/:id") ->
         },
         put => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_put),
             parameters => [param_listener_id(), param_auth_id()],
             'requestBody' => emqx_dashboard_swagger:schema_with_examples(
@@ -287,6 +291,7 @@ schema("/listeners/:listener_id/authentication/:id") ->
         },
         delete => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_delete),
             parameters => [param_listener_id(), param_auth_id()],
             responses => #{
@@ -300,6 +305,7 @@ schema("/listeners/:listener_id/authentication/:id/status") ->
         'operationId' => listener_authenticator_status,
         get => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_status_get),
             parameters => [param_listener_id(), param_auth_id()],
             responses => #{
@@ -330,6 +336,7 @@ schema("/listeners/:listener_id/authentication/:id/position/:position") ->
         'operationId' => listener_authenticator_position,
         put => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_position_put),
             parameters => [param_listener_id(), param_auth_id(), param_position()],
             responses => #{
@@ -393,6 +400,7 @@ schema("/listeners/:listener_id/authentication/:id/users") ->
         'operationId' => listener_authenticator_users,
         post => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_users_post),
             parameters => [param_auth_id(), param_listener_id()],
             'requestBody' => emqx_dashboard_swagger:schema_with_examples(
@@ -410,6 +418,7 @@ schema("/listeners/:listener_id/authentication/:id/users") ->
         },
         get => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_users_get),
             parameters => [
                 param_listener_id(),
@@ -479,6 +488,7 @@ schema("/listeners/:listener_id/authentication/:id/users/:user_id") ->
         'operationId' => listener_authenticator_user,
         get => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_users_user_id_get),
             parameters => [param_listener_id(), param_auth_id(), param_user_id()],
             responses => #{
@@ -491,6 +501,7 @@ schema("/listeners/:listener_id/authentication/:id/users/:user_id") ->
         },
         put => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_users_user_id_put),
             parameters => [param_listener_id(), param_auth_id(), param_user_id()],
             'requestBody' => emqx_dashboard_swagger:schema_with_example(
@@ -508,6 +519,7 @@ schema("/listeners/:listener_id/authentication/:id/users/:user_id") ->
         },
         delete => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_users_user_id_delete),
             parameters => [param_listener_id(), param_auth_id(), param_user_id()],
             responses => #{

+ 1 - 0
apps/emqx_authn/src/emqx_authn_user_import_api.erl

@@ -72,6 +72,7 @@ schema("/listeners/:listener_id/authentication/:id/import_users") ->
         'operationId' => listener_authenticator_import_users,
         post => #{
             tags => ?API_TAGS_SINGLE,
+            deprecated => true,
             description => ?DESC(listeners_listener_id_authentication_id_import_users_post),
             parameters => [emqx_authn_api:param_listener_id(), emqx_authn_api:param_auth_id()],
             'requestBody' => emqx_dashboard_swagger:file_schema(filename),

+ 2 - 0
apps/emqx_bridge_dynamo/docker-ct

@@ -0,0 +1,2 @@
+toxiproxy
+dynamo

lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_acked.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_acked.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_client.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_client.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_clientid_msg_map.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_clientid_msg_map.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_msg.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_msg.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_retain.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_retain.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_sub.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_sub.json


lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_topic_msg_map.json → apps/emqx_bridge_dynamo/priv/dynamo/mqtt_topic_msg_map.json


+ 11 - 0
apps/emqx_bridge_dynamo/rebar.config

@@ -0,0 +1,11 @@
+%% -*- mode: erlang; -*-
+{erl_opts, [debug_info]}.
+{deps, [ {erlcloud, {git, "https://github.com/emqx/erlcloud.git", {tag, "3.5.16-emqx-1"}}}
+       , {emqx_connector, {path, "../../apps/emqx_connector"}}
+       , {emqx_resource, {path, "../../apps/emqx_resource"}}
+       , {emqx_bridge, {path, "../../apps/emqx_bridge"}}
+       ]}.
+
+{shell, [
+    {apps, [emqx_bridge_dynamo]}
+]}.

+ 2 - 2
apps/emqx_bridge_dynamo/src/emqx_bridge_dynamo.app.src

@@ -1,8 +1,8 @@
 {application, emqx_bridge_dynamo, [
     {description, "EMQX Enterprise Dynamo Bridge"},
-    {vsn, "0.1.0"},
+    {vsn, "0.1.1"},
     {registered, []},
-    {applications, [kernel, stdlib]},
+    {applications, [kernel, stdlib, erlcloud]},
     {env, []},
     {modules, []},
     {links, []}

+ 2 - 2
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_dynamo.erl

@@ -1,7 +1,7 @@
 %%--------------------------------------------------------------------
 %% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_bridge_dynamo).
+-module(emqx_bridge_dynamo).
 
 -include_lib("typerefl/include/types.hrl").
 -include_lib("hocon/include/hoconsc.hrl").
@@ -89,7 +89,7 @@ fields("config") ->
                 }
             )}
     ] ++
-        (emqx_ee_connector_dynamo:fields(config) --
+        (emqx_bridge_dynamo_connector:fields(config) --
             emqx_connector_schema_lib:prepare_statement_fields());
 fields("creation_opts") ->
     emqx_resource_schema:fields("creation_opts");

+ 4 - 4
lib-ee/emqx_ee_connector/src/emqx_ee_connector_dynamo.erl

@@ -2,7 +2,7 @@
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
 
--module(emqx_ee_connector_dynamo).
+-module(emqx_bridge_dynamo_connector).
 
 -behaviour(emqx_resource).
 
@@ -131,7 +131,7 @@ on_batch_query(_InstanceId, Query, _State) ->
 
 on_get_status(_InstanceId, #{pool_name := Pool}) ->
     Health = emqx_resource_pool:health_check_workers(
-        Pool, {emqx_ee_connector_dynamo_client, is_connected, []}
+        Pool, {emqx_bridge_dynamo_connector_client, is_connected, []}
     ),
     status_result(Health).
 
@@ -154,7 +154,7 @@ do_query(
     ),
     Result = ecpool:pick_and_do(
         PoolName,
-        {emqx_ee_connector_dynamo_client, query, [Table, Query, Templates]},
+        {emqx_bridge_dynamo_connector_client, query, [Table, Query, Templates]},
         no_handover
     ),
 
@@ -181,7 +181,7 @@ do_query(
 
 connect(Opts) ->
     Options = proplists:get_value(config, Opts),
-    {ok, _Pid} = Result = emqx_ee_connector_dynamo_client:start_link(Options),
+    {ok, _Pid} = Result = emqx_bridge_dynamo_connector_client:start_link(Options),
     Result.
 
 parse_template(Config) ->

+ 2 - 1
lib-ee/emqx_ee_connector/src/emqx_ee_connector_dynamo_client.erl

@@ -1,7 +1,8 @@
 %%--------------------------------------------------------------------
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_connector_dynamo_client).
+
+-module(emqx_bridge_dynamo_connector_client).
 
 -behaviour(gen_server).
 

+ 11 - 3
lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_dynamo_SUITE.erl

@@ -2,7 +2,7 @@
 %% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
 
--module(emqx_ee_bridge_dynamo_SUITE).
+-module(emqx_bridge_dynamo_SUITE).
 
 -compile(nowarn_export_all).
 -compile(export_all).
@@ -24,6 +24,14 @@
 
 -define(GET_CONFIG(KEY__, CFG__), proplists:get_value(KEY__, CFG__)).
 
+%% How to run it locally (all commands are run in $PROJ_ROOT dir):
+%% run ct in docker container
+%% run script:
+%% ```bash
+%% ./scripts/ct/run.sh --ci --app apps/emqx_bridge_dynamo -- \
+%%                     --name 'test@127.0.0.1' -c -v --readable true \
+%%                     --suite apps/emqx_bridge_dynamo/test/emqx_bridge_dynamo_SUITE.erl
+
 %%------------------------------------------------------------------------------
 %% CT boilerplate
 %%------------------------------------------------------------------------------
@@ -224,7 +232,7 @@ query_resource(Config, Request) ->
     ResourceID = emqx_bridge_resource:resource_id(BridgeType, Name),
     emqx_resource:query(ResourceID, Request, #{timeout => 1_000}).
 
-%% create a table, use the lib-ee/emqx_ee_bridge/priv/dynamo/mqtt_msg.json as template
+%% create a table, use the apps/emqx_bridge_dynamo/priv/dynamo/mqtt_msg.json as template
 create_table(Config) ->
     directly_setup_dynamo(),
     delete_table(Config),
@@ -251,7 +259,7 @@ directly_setup_dynamo() ->
 
 directly_query(Query) ->
     directly_setup_dynamo(),
-    emqx_ee_connector_dynamo_client:execute(Query, ?TABLE_BIN).
+    emqx_bridge_dynamo_connector_client:execute(Query, ?TABLE_BIN).
 
 directly_get_payload(Key) ->
     case directly_query({get_item, {<<"id">>, Key}}) of

+ 1 - 0
apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl

@@ -54,6 +54,7 @@ fields(auth_basic) ->
             mk(binary(), #{
                 required => true,
                 desc => ?DESC("config_auth_basic_password"),
+                format => <<"password">>,
                 sensitive => true,
                 converter => fun emqx_schema:password_converter/2
             })}

+ 7 - 0
apps/emqx_bridge_matrix/rebar.config

@@ -0,0 +1,7 @@
+{erl_opts, [debug_info]}.
+
+{deps, [
+    {emqx_connector, {path, "../../apps/emqx_connector"}},
+    {emqx_resource, {path, "../../apps/emqx_resource"}},
+    {emqx_bridge, {path, "../../apps/emqx_bridge"}}
+]}.

+ 1 - 1
apps/emqx_bridge_matrix/src/emqx_bridge_matrix.app.src

@@ -1,6 +1,6 @@
 {application, emqx_bridge_matrix, [
     {description, "EMQX Enterprise MatrixDB Bridge"},
-    {vsn, "0.1.0"},
+    {vsn, "0.1.1"},
     {registered, []},
     {applications, [kernel, stdlib]},
     {env, []},

+ 4 - 4
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_matrix.erl

@@ -1,7 +1,7 @@
 %%--------------------------------------------------------------------
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_bridge_matrix).
+-module(emqx_bridge_matrix).
 
 -export([
     conn_bridge_examples/1
@@ -22,7 +22,7 @@ conn_bridge_examples(Method) ->
         #{
             <<"matrix">> => #{
                 summary => <<"Matrix Bridge">>,
-                value => emqx_ee_bridge_pgsql:values(Method, matrix)
+                value => emqx_bridge_pgsql:values(Method, matrix)
             }
         }
     ].
@@ -34,9 +34,9 @@ namespace() -> "bridge_matrix".
 roots() -> [].
 
 fields("post") ->
-    emqx_ee_bridge_pgsql:fields("post", matrix);
+    emqx_bridge_pgsql:fields("post", matrix);
 fields(Method) ->
-    emqx_ee_bridge_pgsql:fields(Method).
+    emqx_bridge_pgsql:fields(Method).
 
 desc(_) ->
     undefined.

+ 2 - 0
apps/emqx_bridge_pgsql/docker-ct

@@ -0,0 +1,2 @@
+toxiproxy
+pgsql

+ 7 - 0
apps/emqx_bridge_pgsql/rebar.config

@@ -0,0 +1,7 @@
+{erl_opts, [debug_info]}.
+
+{deps, [
+    {emqx_connector, {path, "../../apps/emqx_connector"}},
+    {emqx_resource, {path, "../../apps/emqx_resource"}},
+    {emqx_bridge, {path, "../../apps/emqx_bridge"}}
+]}.

+ 1 - 1
apps/emqx_bridge_pgsql/src/emqx_bridge_pgsql.app.src

@@ -1,6 +1,6 @@
 {application, emqx_bridge_pgsql, [
     {description, "EMQX Enterprise PostgreSQL Bridge"},
-    {vsn, "0.1.0"},
+    {vsn, "0.1.1"},
     {registered, []},
     {applications, [kernel, stdlib]},
     {env, []},

+ 2 - 2
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_pgsql.erl

@@ -1,7 +1,7 @@
 %%--------------------------------------------------------------------
-%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
+%% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_bridge_pgsql).
+-module(emqx_bridge_pgsql).
 
 -include_lib("typerefl/include/types.hrl").
 -include_lib("hocon/include/hoconsc.hrl").

+ 1 - 1
lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_pgsql_SUITE.erl

@@ -2,7 +2,7 @@
 %% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
 
--module(emqx_ee_bridge_pgsql_SUITE).
+-module(emqx_bridge_pgsql_SUITE).
 
 -compile(nowarn_export_all).
 -compile(export_all).

+ 1 - 1
apps/emqx_bridge_rabbitmq/src/emqx_bridge_rabbitmq.erl

@@ -95,7 +95,7 @@ fields("config") ->
 fields("creation_opts") ->
     emqx_resource_schema:fields("creation_opts");
 fields("post") ->
-    fields("post", clickhouse);
+    fields("post", rabbitmq);
 fields("put") ->
     fields("config");
 fields("get") ->

+ 1 - 16
apps/emqx_bridge_rabbitmq/src/emqx_bridge_rabbitmq_connector.erl

@@ -72,14 +72,7 @@ fields(config) ->
                     desc => ?DESC("username")
                 }
             )},
-        {password,
-            hoconsc:mk(
-                typerefl:binary(),
-                #{
-                    required => true,
-                    desc => ?DESC("password")
-                }
-            )},
+        {password, fun emqx_connector_schema_lib:password/1},
         {pool_size,
             hoconsc:mk(
                 typerefl:pos_integer(),
@@ -129,14 +122,6 @@ fields(config) ->
                     desc => ?DESC("heartbeat")
                 }
             )},
-        {auto_reconnect,
-            hoconsc:mk(
-                emqx_schema:duration_ms(),
-                #{
-                    default => <<"2s">>,
-                    desc => ?DESC("auto_reconnect")
-                }
-            )},
         %% Things related to sending messages to RabbitMQ
         {exchange,
             hoconsc:mk(

+ 2 - 0
apps/emqx_bridge_tdengine/docker-ct

@@ -0,0 +1,2 @@
+toxiproxy
+tdengine

+ 8 - 0
apps/emqx_bridge_tdengine/rebar.config

@@ -0,0 +1,8 @@
+{erl_opts, [debug_info]}.
+
+{deps, [
+    {tdengine, {git, "https://github.com/emqx/tdengine-client-erl", {tag, "0.1.6"}}},
+    {emqx_connector, {path, "../../apps/emqx_connector"}},
+    {emqx_resource, {path, "../../apps/emqx_resource"}},
+    {emqx_bridge, {path, "../../apps/emqx_bridge"}}
+]}.

+ 2 - 2
apps/emqx_bridge_tdengine/src/emqx_bridge_tdengine.app.src

@@ -1,8 +1,8 @@
 {application, emqx_bridge_tdengine, [
     {description, "EMQX Enterprise TDEngine Bridge"},
-    {vsn, "0.1.0"},
+    {vsn, "0.1.1"},
     {registered, []},
-    {applications, [kernel, stdlib]},
+    {applications, [kernel, stdlib, tdengine]},
     {env, []},
     {modules, []},
     {links, []}

+ 3 - 2
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_tdengine.erl

@@ -1,7 +1,7 @@
 %%--------------------------------------------------------------------
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_bridge_tdengine).
+-module(emqx_bridge_tdengine).
 
 -include_lib("typerefl/include/types.hrl").
 -include_lib("hocon/include/hoconsc.hrl").
@@ -81,7 +81,8 @@ fields("config") ->
                 binary(),
                 #{desc => ?DESC("local_topic"), default => undefined}
             )}
-    ] ++ emqx_resource_schema:fields("resource_opts") ++ emqx_ee_connector_tdengine:fields(config);
+    ] ++ emqx_resource_schema:fields("resource_opts") ++
+        emqx_bridge_tdengine_connector:fields(config);
 fields("post") ->
     [type_field(), name_field() | fields("config")];
 fields("put") ->

+ 1 - 1
lib-ee/emqx_ee_connector/src/emqx_ee_connector_tdengine.erl

@@ -2,7 +2,7 @@
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
 
--module(emqx_ee_connector_tdengine).
+-module(emqx_bridge_tdengine_connector).
 
 -behaviour(emqx_resource).
 

+ 1 - 1
lib-ee/emqx_ee_bridge/test/emqx_ee_bridge_tdengine_SUITE.erl

@@ -2,7 +2,7 @@
 %% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
 
--module(emqx_ee_bridge_tdengine_SUITE).
+-module(emqx_bridge_tdengine_SUITE).
 
 -compile(nowarn_export_all).
 -compile(export_all).

+ 7 - 0
apps/emqx_bridge_timescale/rebar.config

@@ -0,0 +1,7 @@
+{erl_opts, [debug_info]}.
+
+{deps, [
+    {emqx_connector, {path, "../../apps/emqx_connector"}},
+    {emqx_resource, {path, "../../apps/emqx_resource"}},
+    {emqx_bridge, {path, "../../apps/emqx_bridge"}}
+]}.

+ 1 - 1
apps/emqx_bridge_timescale/src/emqx_bridge_timescale.app.src

@@ -1,6 +1,6 @@
 {application, emqx_bridge_timescale, [
     {description, "EMQX Enterprise TimescaleDB Bridge"},
-    {vsn, "0.1.0"},
+    {vsn, "0.1.1"},
     {registered, []},
     {applications, [kernel, stdlib]},
     {env, []},

+ 4 - 4
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_timescale.erl

@@ -1,7 +1,7 @@
 %%--------------------------------------------------------------------
 %% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
 %%--------------------------------------------------------------------
--module(emqx_ee_bridge_timescale).
+-module(emqx_bridge_timescale).
 
 -export([
     conn_bridge_examples/1
@@ -22,7 +22,7 @@ conn_bridge_examples(Method) ->
         #{
             <<"timescale">> => #{
                 summary => <<"Timescale Bridge">>,
-                value => emqx_ee_bridge_pgsql:values(Method, timescale)
+                value => emqx_bridge_pgsql:values(Method, timescale)
             }
         }
     ].
@@ -34,9 +34,9 @@ namespace() -> "bridge_timescale".
 roots() -> [].
 
 fields("post") ->
-    emqx_ee_bridge_pgsql:fields("post", timescale);
+    emqx_bridge_pgsql:fields("post", timescale);
 fields(Method) ->
-    emqx_ee_bridge_pgsql:fields(Method).
+    emqx_bridge_pgsql:fields(Method).
 
 desc(_) ->
     undefined.

+ 1 - 0
changes/ee/feat-10650.en.md

@@ -0,0 +1 @@
+Refactor the directory structure of the TDEngine data bridge.

+ 1 - 0
changes/ee/feat-10662.en.md

@@ -0,0 +1 @@
+Refactor the directory structure of the PostgreSQL && Matrix && Timescale data bridges.

+ 0 - 3
lib-ee/emqx_ee_bridge/docker-ct

@@ -5,7 +5,4 @@ mongo_rs_sharded
 mysql
 redis
 redis_cluster
-pgsql
-tdengine
 clickhouse
-dynamo

+ 3 - 1
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge.app.src

@@ -12,9 +12,11 @@
         emqx_bridge_cassandra,
         emqx_bridge_opents,
         emqx_bridge_pulsar,
+        emqx_bridge_dynamo,
         emqx_bridge_sqlserver,
         emqx_bridge_rocketmq,
-        emqx_bridge_rabbitmq
+        emqx_bridge_rabbitmq,
+        emqx_bridge_tdengine
     ]},
     {env, []},
     {modules, []},

+ 15 - 15
lib-ee/emqx_ee_bridge/src/emqx_ee_bridge.erl

@@ -19,7 +19,7 @@ api_schemas(Method) ->
         ref(emqx_bridge_kafka, Method ++ "_producer"),
         ref(emqx_bridge_cassandra, Method),
         ref(emqx_ee_bridge_mysql, Method),
-        ref(emqx_ee_bridge_pgsql, Method),
+        ref(emqx_bridge_pgsql, Method),
         ref(emqx_ee_bridge_mongodb, Method ++ "_rs"),
         ref(emqx_ee_bridge_mongodb, Method ++ "_sharded"),
         ref(emqx_ee_bridge_mongodb, Method ++ "_single"),
@@ -29,11 +29,11 @@ api_schemas(Method) ->
         ref(emqx_ee_bridge_redis, Method ++ "_single"),
         ref(emqx_ee_bridge_redis, Method ++ "_sentinel"),
         ref(emqx_ee_bridge_redis, Method ++ "_cluster"),
-        ref(emqx_ee_bridge_timescale, Method),
-        ref(emqx_ee_bridge_matrix, Method),
-        ref(emqx_ee_bridge_tdengine, Method),
+        ref(emqx_bridge_timescale, Method),
+        ref(emqx_bridge_matrix, Method),
+        ref(emqx_bridge_tdengine, Method),
         ref(emqx_ee_bridge_clickhouse, Method),
-        ref(emqx_ee_bridge_dynamo, Method),
+        ref(emqx_bridge_dynamo, Method),
         ref(emqx_bridge_rocketmq, Method),
         ref(emqx_bridge_sqlserver, Method),
         ref(emqx_bridge_opents, Method),
@@ -53,12 +53,12 @@ schema_modules() ->
         emqx_ee_bridge_mongodb,
         emqx_ee_bridge_mysql,
         emqx_ee_bridge_redis,
-        emqx_ee_bridge_pgsql,
-        emqx_ee_bridge_timescale,
-        emqx_ee_bridge_matrix,
-        emqx_ee_bridge_tdengine,
+        emqx_bridge_pgsql,
+        emqx_bridge_timescale,
+        emqx_bridge_matrix,
+        emqx_bridge_tdengine,
         emqx_ee_bridge_clickhouse,
-        emqx_ee_bridge_dynamo,
+        emqx_bridge_dynamo,
         emqx_bridge_rocketmq,
         emqx_bridge_sqlserver,
         emqx_bridge_opents,
@@ -100,9 +100,9 @@ resource_type(redis_cluster) -> emqx_ee_connector_redis;
 resource_type(pgsql) -> emqx_connector_pgsql;
 resource_type(timescale) -> emqx_connector_pgsql;
 resource_type(matrix) -> emqx_connector_pgsql;
-resource_type(tdengine) -> emqx_ee_connector_tdengine;
+resource_type(tdengine) -> emqx_bridge_tdengine_connector;
 resource_type(clickhouse) -> emqx_ee_connector_clickhouse;
-resource_type(dynamo) -> emqx_ee_connector_dynamo;
+resource_type(dynamo) -> emqx_bridge_dynamo_connector;
 resource_type(rocketmq) -> emqx_bridge_rocketmq_connector;
 resource_type(sqlserver) -> emqx_bridge_sqlserver_connector;
 resource_type(opents) -> emqx_bridge_opents_connector;
@@ -139,7 +139,7 @@ fields(bridges) ->
             )},
         {tdengine,
             mk(
-                hoconsc:map(name, ref(emqx_ee_bridge_tdengine, "config")),
+                hoconsc:map(name, ref(emqx_bridge_tdengine, "config")),
                 #{
                     desc => <<"TDengine Bridge Config">>,
                     required => false
@@ -147,7 +147,7 @@ fields(bridges) ->
             )},
         {dynamo,
             mk(
-                hoconsc:map(name, ref(emqx_ee_bridge_dynamo, "config")),
+                hoconsc:map(name, ref(emqx_bridge_dynamo, "config")),
                 #{
                     desc => <<"Dynamo Bridge Config">>,
                     required => false
@@ -280,7 +280,7 @@ pgsql_structs() ->
     [
         {Type,
             mk(
-                hoconsc:map(name, ref(emqx_ee_bridge_pgsql, "config")),
+                hoconsc:map(name, ref(emqx_bridge_pgsql, "config")),
                 #{
                     desc => <<Name/binary, " Bridge Config">>,
                     required => false

+ 1 - 2
lib-ee/emqx_ee_connector/rebar.config

@@ -1,10 +1,9 @@
+%% -*- mode: erlang -*-
 {erl_opts, [debug_info]}.
 {deps, [
   {hstreamdb_erl, {git, "https://github.com/hstreamdb/hstreamdb_erl.git", {tag, "0.2.5"}}},
   {influxdb, {git, "https://github.com/emqx/influxdb-client-erl", {tag, "1.1.9"}}},
-  {tdengine, {git, "https://github.com/emqx/tdengine-client-erl", {tag, "0.1.6"}}},
   {clickhouse, {git, "https://github.com/emqx/clickhouse-client-erl", {tag, "0.3"}}},
-  {erlcloud, {git, "https://github.com/emqx/erlcloud", {tag, "3.6.8-emqx-1"}}},
   {emqx, {path, "../../apps/emqx"}},
   {emqx_utils, {path, "../../apps/emqx_utils"}}
 ]}.

+ 1 - 3
lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src

@@ -8,9 +8,7 @@
         ecpool,
         hstreamdb_erl,
         influxdb,
-        tdengine,
-        clickhouse,
-        erlcloud
+        clickhouse
     ]},
     {env, []},
     {modules, []},

+ 7 - 0
mix.exs

@@ -192,6 +192,13 @@ defmodule EMQXUmbrella.MixProject do
       {:snappyer, "1.2.8", override: true},
       {:crc32cer, "0.1.8", override: true},
       {:supervisor3, "1.1.12", override: true},
+      {:erlcloud, github: "emqx/erlcloud", tag: "3.5.16-emqx-1", override: true},
+      # erlcloud's rebar.config requires rebar3 and does not support Mix,
+      # so it tries to fetch deps from git. We need to override this.
+      {:lhttpc, tag: "1.6.2", override: true},
+      {:eini, "1.2.9", override: true},
+      {:base16, "1.0.0", override: true},
+      # end of erlcloud's deps
       {:opentsdb, github: "emqx/opentsdb-client-erl", tag: "v0.5.1", override: true},
       # The following two are dependencies of rabbit_common. They are needed here to
       # make mix not complain about conflicting versions

+ 1 - 1
rel/i18n/emqx_ee_bridge_dynamo.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_dynamo {
+emqx_bridge_dynamo {
 
 config_enable.desc:
 """Enable or disable this bridge"""

+ 1 - 1
rel/i18n/emqx_ee_connector_dynamo.hocon

@@ -1,4 +1,4 @@
-emqx_ee_connector_dynamo {
+emqx_bridge_dynamo_connector {
 
 aws_access_key_id.desc:
 """Access Key ID for connecting to DynamoDB."""

+ 1 - 1
rel/i18n/emqx_ee_bridge_pgsql.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_pgsql {
+emqx_bridge_pgsql {
 
 config_enable.desc:
 """Enable or disable this bridge"""

+ 1 - 1
rel/i18n/emqx_ee_bridge_tdengine.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_tdengine {
+emqx_bridge_tdengine {
 
 config_enable.desc:
 """Enable or disable this bridge"""

+ 1 - 1
rel/i18n/emqx_ee_connector_tdengine.hocon

@@ -1,4 +1,4 @@
-emqx_ee_connector_tdengine {
+emqx_bridge_tdengine_connector {
 
 server.desc:
 """The IPv4 or IPv6 address or the hostname to connect to.<br/>

+ 1 - 1
rel/i18n/zh/emqx_ee_bridge_dynamo.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_dynamo {
+emqx_bridge_dynamo {
 
 config_enable.desc:
 """启用/禁用桥接"""

+ 1 - 1
rel/i18n/zh/emqx_ee_connector_dynamo.hocon

@@ -1,4 +1,4 @@
-emqx_ee_connector_dynamo {
+emqx_bridge_dynamo_connector {
 
 aws_access_key_id.desc:
 """DynamoDB 的访问 ID。"""

+ 1 - 1
rel/i18n/zh/emqx_ee_bridge_pgsql.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_pgsql {
+emqx_bridge_pgsql {
 
 config_enable.desc:
 """启用/禁用桥接"""

+ 1 - 1
rel/i18n/zh/emqx_ee_bridge_tdengine.hocon

@@ -1,4 +1,4 @@
-emqx_ee_bridge_tdengine {
+emqx_bridge_tdengine {
 
 config_enable.desc:
 """启用/禁用桥接"""

+ 1 - 1
rel/i18n/zh/emqx_ee_connector_tdengine.hocon

@@ -1,4 +1,4 @@
-emqx_ee_connector_tdengine {
+emqx_bridge_tdengine_connector {
 
 server.desc:
 """将要连接的 IPv4 或 IPv6 地址,或者主机名。<br/>