diff --git a/apps/emqx_authn/rebar.config b/apps/emqx_authn/rebar.config index fb2f35f41..163d491c9 100644 --- a/apps/emqx_authn/rebar.config +++ b/apps/emqx_authn/rebar.config @@ -4,7 +4,8 @@ {emqx, {path, "../emqx"}}, {emqx_utils, {path, "../emqx_utils"}}, {emqx_connector, {path, "../emqx_connector"}}, - {emqx_mongodb, {path, "../emqx_mongodb"}} + {emqx_mongodb, {path, "../emqx_mongodb"}}, + {emqx_redis, {path, "../emqx_redis"}} ]}. {edoc_opts, [{preprocess, true}]}. diff --git a/apps/emqx_authn/src/emqx_authn.app.src b/apps/emqx_authn/src/emqx_authn.app.src index 1cb4c8eca..8e6807972 100644 --- a/apps/emqx_authn/src/emqx_authn.app.src +++ b/apps/emqx_authn/src/emqx_authn.app.src @@ -5,7 +5,7 @@ {modules, []}, {registered, [emqx_authn_sup, emqx_authn_registry]}, {applications, [ - kernel, stdlib, emqx_resource, emqx_connector, ehttpc, epgsql, mysql, jose, emqx_mongodb + kernel, stdlib, emqx_resource, emqx_connector, ehttpc, epgsql, mysql, jose, emqx_mongodb, emqx_redis ]}, {mod, {emqx_authn_app, []}}, {env, []}, diff --git a/apps/emqx_authn/src/simple_authn/emqx_authn_redis.erl b/apps/emqx_authn/src/simple_authn/emqx_authn_redis.erl index 27d8c540a..f6f02c1bc 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_redis.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_redis.erl @@ -60,11 +60,11 @@ roots() -> ]. fields(redis_single) -> - common_fields() ++ emqx_connector_redis:fields(single); + common_fields() ++ emqx_redis:fields(single); fields(redis_cluster) -> - common_fields() ++ emqx_connector_redis:fields(cluster); + common_fields() ++ emqx_redis:fields(cluster); fields(redis_sentinel) -> - common_fields() ++ emqx_connector_redis:fields(sentinel). + common_fields() ++ emqx_redis:fields(sentinel). desc(redis_single) -> ?DESC(single); @@ -127,7 +127,7 @@ create(Config0) -> {Config, State} -> {ok, _Data} = emqx_authn_utils:create_resource( ResourceId, - emqx_connector_redis, + emqx_redis, Config ), {ok, State#{resource_id => ResourceId}} @@ -135,7 +135,7 @@ create(Config0) -> update(Config0, #{resource_id := ResourceId} = _State) -> {Config, NState} = parse_config(Config0), - case emqx_authn_utils:update_resource(emqx_connector_redis, Config, ResourceId) of + case emqx_authn_utils:update_resource(emqx_redis, Config, ResourceId) of {error, Reason} -> error({load_config_error, Reason}); {ok, _} -> diff --git a/apps/emqx_authn/test/emqx_authn_redis_SUITE.erl b/apps/emqx_authn/test/emqx_authn_redis_SUITE.erl index 1354e06cc..581055755 100644 --- a/apps/emqx_authn/test/emqx_authn_redis_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_redis_SUITE.erl @@ -67,7 +67,7 @@ init_per_suite(Config) -> {ok, _} = emqx_resource:create_local( ?REDIS_RESOURCE, ?RESOURCE_GROUP, - emqx_connector_redis, + emqx_redis, redis_config(), #{} ), diff --git a/apps/emqx_authz/rebar.config b/apps/emqx_authz/rebar.config index 32e344e69..f3d365c47 100644 --- a/apps/emqx_authz/rebar.config +++ b/apps/emqx_authz/rebar.config @@ -5,7 +5,8 @@ {emqx, {path, "../emqx"}}, {emqx_utils, {path, "../emqx_utils"}}, {emqx_connector, {path, "../emqx_connector"}}, - {emqx_mongodb, {path, "../emqx_mongodb"}} + {emqx_mongodb, {path, "../emqx_mongodb"}}, + {emqx_redis, {path, "../emqx_redis"}} ]}. {shell, [ diff --git a/apps/emqx_authz/src/emqx_authz.app.src b/apps/emqx_authz/src/emqx_authz.app.src index db73b4e37..50ea284fe 100644 --- a/apps/emqx_authz/src/emqx_authz.app.src +++ b/apps/emqx_authz/src/emqx_authz.app.src @@ -10,7 +10,8 @@ crypto, emqx_resource, emqx_connector, - emqx_mongodb + emqx_mongodb, + emqx_redis ]}, {env, []}, {modules, []}, diff --git a/apps/emqx_authz/src/emqx_authz_api_schema.erl b/apps/emqx_authz/src/emqx_authz_api_schema.erl index f841fb9b1..01267a7b2 100644 --- a/apps/emqx_authz/src/emqx_authz_api_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_api_schema.erl @@ -77,13 +77,13 @@ fields(postgresql) -> proplists:delete(prepare_statement, emqx_connector_pgsql:fields(config)); fields(redis_single) -> authz_redis_common_fields() ++ - emqx_connector_redis:fields(single); + emqx_redis:fields(single); fields(redis_sentinel) -> authz_redis_common_fields() ++ - emqx_connector_redis:fields(sentinel); + emqx_redis:fields(sentinel); fields(redis_cluster) -> authz_redis_common_fields() ++ - emqx_connector_redis:fields(cluster); + emqx_redis:fields(cluster); fields(position) -> [ {position, diff --git a/apps/emqx_authz/src/emqx_authz_redis.erl b/apps/emqx_authz/src/emqx_authz_redis.erl index 34c2038ab..3b19db832 100644 --- a/apps/emqx_authz/src/emqx_authz_redis.erl +++ b/apps/emqx_authz/src/emqx_authz_redis.erl @@ -52,13 +52,13 @@ create(#{cmd := CmdStr} = Source) -> Cmd = tokens(CmdStr), ResourceId = emqx_authz_utils:make_resource_id(?MODULE), CmdTemplate = emqx_authz_utils:parse_deep(Cmd, ?PLACEHOLDERS), - {ok, _Data} = emqx_authz_utils:create_resource(ResourceId, emqx_connector_redis, Source), + {ok, _Data} = emqx_authz_utils:create_resource(ResourceId, emqx_redis, Source), Source#{annotations => #{id => ResourceId}, cmd_template => CmdTemplate}. update(#{cmd := CmdStr} = Source) -> Cmd = tokens(CmdStr), CmdTemplate = emqx_authz_utils:parse_deep(Cmd, ?PLACEHOLDERS), - case emqx_authz_utils:update_resource(emqx_connector_redis, Source) of + case emqx_authz_utils:update_resource(emqx_redis, Source) of {error, Reason} -> error({load_config_error, Reason}); {ok, Id} -> diff --git a/apps/emqx_authz/src/emqx_authz_schema.erl b/apps/emqx_authz/src/emqx_authz_schema.erl index 18afacb23..e1e85d282 100644 --- a/apps/emqx_authz/src/emqx_authz_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_schema.erl @@ -389,8 +389,13 @@ cmd() -> connector_fields(DB) -> connector_fields(DB, config). +connector_fields(redis = DB, Fields) -> + connector_fields(DB, Fields, emqx); connector_fields(DB, Fields) -> - Mod0 = io_lib:format("~ts_~ts", [emqx_connector, DB]), + connector_fields(DB, Fields, emqx_connector). + +connector_fields(DB, Fields, Prefix) -> + Mod0 = io_lib:format("~ts_~ts", [Prefix, DB]), Mod = try list_to_existing_atom(Mod0) diff --git a/apps/emqx_authz/test/emqx_authz_redis_SUITE.erl b/apps/emqx_authz/test/emqx_authz_redis_SUITE.erl index 35aa0449f..29a352970 100644 --- a/apps/emqx_authz/test/emqx_authz_redis_SUITE.erl +++ b/apps/emqx_authz/test/emqx_authz_redis_SUITE.erl @@ -45,7 +45,7 @@ init_per_suite(Config) -> {ok, _} = emqx_resource:create_local( ?REDIS_RESOURCE, ?RESOURCE_GROUP, - emqx_connector_redis, + emqx_redis, redis_config(), #{} ), diff --git a/apps/emqx_connector/docker-ct b/apps/emqx_connector/docker-ct index 866d0c40d..000346e82 100644 --- a/apps/emqx_connector/docker-ct +++ b/apps/emqx_connector/docker-ct @@ -1,4 +1,2 @@ -redis -redis_cluster mysql pgsql diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index a90cdaa58..59588093c 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -11,9 +11,7 @@ {emqx_resource, {path, "../emqx_resource"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.2"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7.0.1"}}}, - %% NOTE: mind ecpool version when updating eredis_cluster version - {eredis_cluster, {git, "https://github.com/emqx/eredis_cluster", {tag, "0.8.1"}}} + {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7.0.1"}}} ]}. {shell, [ diff --git a/apps/emqx_redis/APL.txt b/apps/emqx_redis/APL.txt new file mode 100644 index 000000000..dcb926a55 --- /dev/null +++ b/apps/emqx_redis/APL.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2016-2023 EMQ Technologies Co., Ltd. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/emqx_redis/README.md b/apps/emqx_redis/README.md new file mode 100644 index 000000000..6eee7c6c6 --- /dev/null +++ b/apps/emqx_redis/README.md @@ -0,0 +1,15 @@ +# Redis Connector + +This application houses the Redis Database connector. +It provides the APIs to connect to Redis Database. + +It is used by the Redis bridge to insert messages and by the emqx_authz and +emqx_authn applications to check user permissions. + +## Contributing + +Please see our [contributing.md](../../CONTRIBUTING.md). + +## License + +See [APL](./APL.txt). diff --git a/apps/emqx_redis/docker-ct b/apps/emqx_redis/docker-ct new file mode 100644 index 000000000..c8f7e4983 --- /dev/null +++ b/apps/emqx_redis/docker-ct @@ -0,0 +1,2 @@ +redis +redis_cluster diff --git a/apps/emqx_redis/rebar.config b/apps/emqx_redis/rebar.config new file mode 100644 index 000000000..c14536384 --- /dev/null +++ b/apps/emqx_redis/rebar.config @@ -0,0 +1,9 @@ +%% -*- mode: erlang; -*- + +{erl_opts, [debug_info]}. +{deps, [ + %% NOTE: mind ecpool version when updating eredis_cluster version + {eredis_cluster, {git, "https://github.com/emqx/eredis_cluster", {tag, "0.8.1"}}}, + {emqx_connector, {path, "../../apps/emqx_connector"}}, + {emqx_resource, {path, "../../apps/emqx_resource"}} +]}. diff --git a/apps/emqx_redis/src/emqx_redis.app.src b/apps/emqx_redis/src/emqx_redis.app.src new file mode 100644 index 000000000..448ce6b45 --- /dev/null +++ b/apps/emqx_redis/src/emqx_redis.app.src @@ -0,0 +1,14 @@ +{application, emqx_redis, [ + {description, "EMQX Enterprise Oracle Database Connector"}, + {vsn, "0.1.0"}, + {registered, []}, + {applications, [ + kernel, + stdlib, + eredis_cluster + ]}, + {env, []}, + {modules, []}, + + {links, []} +]}. diff --git a/apps/emqx_connector/src/emqx_connector_redis.erl b/apps/emqx_redis/src/emqx_redis.erl similarity index 99% rename from apps/emqx_connector/src/emqx_connector_redis.erl rename to apps/emqx_redis/src/emqx_redis.erl index 89aab0a8c..bbcf79a16 100644 --- a/apps/emqx_connector/src/emqx_connector_redis.erl +++ b/apps/emqx_redis/src/emqx_redis.erl @@ -13,9 +13,9 @@ %% See the License for the specific language governing permissions and %% limitations under the License. %%-------------------------------------------------------------------- --module(emqx_connector_redis). +-module(emqx_redis). --include("emqx_connector.hrl"). +-include_lib("emqx_connector/include/emqx_connector.hrl"). -include_lib("typerefl/include/types.hrl"). -include_lib("hocon/include/hoconsc.hrl"). -include_lib("emqx/include/logger.hrl"). diff --git a/apps/emqx_connector/test/emqx_connector_redis_SUITE.erl b/apps/emqx_redis/test/emqx_redis_SUITE.erl similarity index 96% rename from apps/emqx_connector/test/emqx_connector_redis_SUITE.erl rename to apps/emqx_redis/test/emqx_redis_SUITE.erl index e6df4f711..c425f19d9 100644 --- a/apps/emqx_connector/test/emqx_connector_redis_SUITE.erl +++ b/apps/emqx_redis/test/emqx_redis_SUITE.erl @@ -13,7 +13,7 @@ % %% limitations under the License. % %%-------------------------------------------------------------------- --module(emqx_connector_redis_SUITE). +-module(emqx_redis_SUITE). -compile(nowarn_export_all). -compile(export_all). @@ -29,7 +29,7 @@ -define(REDIS_SENTINEL_PORT, 26379). -define(REDIS_CLUSTER_HOST, "redis-cluster-1"). -define(REDIS_CLUSTER_PORT, 6379). --define(REDIS_RESOURCE_MOD, emqx_connector_redis). +-define(REDIS_RESOURCE_MOD, emqx_redis). all() -> emqx_common_test_helpers:all(?MODULE). @@ -83,21 +83,21 @@ wait_for_redis(Checks) -> t_single_lifecycle(_Config) -> perform_lifecycle_check( - <<"emqx_connector_redis_SUITE_single">>, + <<"emqx_redis_SUITE_single">>, redis_config_single(), [<<"PING">>] ). t_cluster_lifecycle(_Config) -> perform_lifecycle_check( - <<"emqx_connector_redis_SUITE_cluster">>, + <<"emqx_redis_SUITE_cluster">>, redis_config_cluster(), [<<"PING">>, <<"PONG">>] ). t_sentinel_lifecycle(_Config) -> perform_lifecycle_check( - <<"emqx_connector_redis_SUITE_sentinel">>, + <<"emqx_redis_SUITE_sentinel">>, redis_config_sentinel(), [<<"PING">>] ). diff --git a/lib-ee/emqx_ee_bridge/rebar.config b/lib-ee/emqx_ee_bridge/rebar.config index 3b3be6ccf..dfc8703f5 100644 --- a/lib-ee/emqx_ee_bridge/rebar.config +++ b/lib-ee/emqx_ee_bridge/rebar.config @@ -4,6 +4,7 @@ , {emqx_resource, {path, "../../apps/emqx_resource"}} , {emqx_bridge, {path, "../../apps/emqx_bridge"}} , {emqx_utils, {path, "../emqx_utils"}} + , {emqx_redis, {path, "../../apps/emqx_redis"}} ]}. {shell, [ diff --git a/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_redis.erl b/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_redis.erl index ff15aa00f..33153e617 100644 --- a/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_redis.erl +++ b/lib-ee/emqx_ee_bridge/src/emqx_ee_bridge_redis.erl @@ -149,7 +149,7 @@ redis_bridge_common_fields(Type) -> connector_fields(Type) -> RedisType = bridge_type_to_redis_conn_type(Type), - emqx_connector_redis:fields(RedisType). + emqx_redis:fields(RedisType). bridge_type_to_redis_conn_type(redis_single) -> single; @@ -190,11 +190,11 @@ desc("config") -> desc(Method) when Method =:= "get"; Method =:= "put"; Method =:= "post" -> ["Configuration for Redis using `", string:to_upper(Method), "` method."]; desc(redis_single) -> - ?DESC(emqx_connector_redis, "single"); + ?DESC(emqx_redis, "single"); desc(redis_sentinel) -> - ?DESC(emqx_connector_redis, "sentinel"); + ?DESC(emqx_redis, "sentinel"); desc(redis_cluster) -> - ?DESC(emqx_connector_redis, "cluster"); + ?DESC(emqx_redis, "cluster"); desc("creation_opts_" ++ _Type) -> ?DESC(emqx_resource_schema, "creation_opts"); desc(_) -> diff --git a/lib-ee/emqx_ee_connector/rebar.config b/lib-ee/emqx_ee_connector/rebar.config index ee1d4e500..ad8bae44e 100644 --- a/lib-ee/emqx_ee_connector/rebar.config +++ b/lib-ee/emqx_ee_connector/rebar.config @@ -3,7 +3,8 @@ {deps, [ {hstreamdb_erl, {git, "https://github.com/hstreamdb/hstreamdb_erl.git", {tag, "0.2.5"}}}, {emqx, {path, "../../apps/emqx"}}, - {emqx_utils, {path, "../../apps/emqx_utils"}} + {emqx_utils, {path, "../../apps/emqx_utils"}}, + {emqx_redis, {path, "../../apps/emqx_redis"}} ]}. {shell, [ diff --git a/lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src b/lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src index 9fe22d020..c3187f807 100644 --- a/lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src +++ b/lib-ee/emqx_ee_connector/src/emqx_ee_connector.app.src @@ -6,7 +6,8 @@ kernel, stdlib, ecpool, - hstreamdb_erl + hstreamdb_erl, + emqx_redis ]}, {env, []}, {modules, []}, diff --git a/lib-ee/emqx_ee_connector/src/emqx_ee_connector_redis.erl b/lib-ee/emqx_ee_connector/src/emqx_ee_connector_redis.erl index 5413ee471..deb2aafea 100644 --- a/lib-ee/emqx_ee_connector/src/emqx_ee_connector_redis.erl +++ b/lib-ee/emqx_ee_connector/src/emqx_ee_connector_redis.erl @@ -25,7 +25,7 @@ callback_mode() -> always_sync. on_start(InstId, #{command_template := CommandTemplate} = Config) -> - case emqx_connector_redis:on_start(InstId, Config) of + case emqx_redis:on_start(InstId, Config) of {ok, RedisConnSt} -> ?tp( redis_ee_connector_start_success, @@ -44,12 +44,12 @@ on_start(InstId, #{command_template := CommandTemplate} = Config) -> end. on_stop(InstId, #{conn_st := RedisConnSt}) -> - emqx_connector_redis:on_stop(InstId, RedisConnSt); + emqx_redis:on_stop(InstId, RedisConnSt); on_stop(InstId, undefined = _State) -> - emqx_connector_redis:on_stop(InstId, undefined). + emqx_redis:on_stop(InstId, undefined). on_get_status(InstId, #{conn_st := RedisConnSt}) -> - emqx_connector_redis:on_get_status(InstId, RedisConnSt). + emqx_redis:on_get_status(InstId, RedisConnSt). on_query( InstId, @@ -111,7 +111,7 @@ on_batch_query( %% ------------------------------------------------------------------------------------------------- query(InstId, Query, RedisConnSt) -> - case emqx_connector_redis:on_query(InstId, Query, RedisConnSt) of + case emqx_redis:on_query(InstId, Query, RedisConnSt) of {ok, _} = Ok -> Ok; {error, no_connection} -> {error, {recoverable_error, no_connection}}; {error, _} = Error -> Error diff --git a/mix.exs b/mix.exs index 97ac0bb76..1eb646c60 100644 --- a/mix.exs +++ b/mix.exs @@ -378,7 +378,8 @@ defmodule EMQXUmbrella.MixProject do emqx_slow_subs: :permanent, emqx_mongodb: :permanent, emqx_plugins: :permanent, - emqx_mix: :none + emqx_mix: :none, + emqx_redis: :permanent ] ++ if(enable_quicer?(), do: [quicer: :permanent], else: []) ++ if(enable_bcrypt?(), do: [bcrypt: :permanent], else: []) ++ diff --git a/rebar.config.erl b/rebar.config.erl index 8aa65a5e8..0343c29d3 100644 --- a/rebar.config.erl +++ b/rebar.config.erl @@ -483,6 +483,7 @@ relx_apps_per_edition(ee) -> emqx_bridge_timescale, emqx_bridge_sqlserver, emqx_oracle, + emqx_redis, emqx_bridge_oracle, emqx_bridge_rabbitmq, emqx_ee_schema_registry, diff --git a/rel/i18n/emqx_connector_redis.hocon b/rel/i18n/emqx_redis.hocon similarity index 98% rename from rel/i18n/emqx_connector_redis.hocon rename to rel/i18n/emqx_redis.hocon index 5dc887b72..af20c5980 100644 --- a/rel/i18n/emqx_connector_redis.hocon +++ b/rel/i18n/emqx_redis.hocon @@ -1,4 +1,4 @@ -emqx_connector_redis { +emqx_redis { cluster.desc: """Cluster mode. Must be set to 'cluster' when Redis server is running in clustered mode."""