|
|
@@ -11,6 +11,8 @@
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
|
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
|
|
|
|
|
|
+-import(emqx_utils_conv, [bin/1]).
|
|
|
+
|
|
|
%%------------------------------------------------------------------------------
|
|
|
%% CT boilerplate
|
|
|
%%------------------------------------------------------------------------------
|
|
|
@@ -96,14 +98,27 @@ init_per_group(Type = single, Config) ->
|
|
|
true ->
|
|
|
ok = start_apps(),
|
|
|
emqx_mgmt_api_test_util:init_suite(),
|
|
|
- {Name, MongoConfig} = mongo_config(MongoHost, MongoPort, Type, Config),
|
|
|
+ %% NOTE: `mongo-single` has auth enabled, see `credentials.env`.
|
|
|
+ AuthSource = bin(os:getenv("MONGO_AUTHSOURCE", "admin")),
|
|
|
+ Username = bin(os:getenv("MONGO_USERNAME", "")),
|
|
|
+ Password = bin(os:getenv("MONGO_PASSWORD", "")),
|
|
|
+ Passfile = filename:join(?config(priv_dir, Config), "passfile"),
|
|
|
+ ok = file:write_file(Passfile, Password),
|
|
|
+ NConfig = [
|
|
|
+ {mongo_authsource, AuthSource},
|
|
|
+ {mongo_username, Username},
|
|
|
+ {mongo_password, Password},
|
|
|
+ {mongo_passfile, Passfile}
|
|
|
+ | Config
|
|
|
+ ],
|
|
|
+ {Name, MongoConfig} = mongo_config(MongoHost, MongoPort, Type, NConfig),
|
|
|
[
|
|
|
{mongo_host, MongoHost},
|
|
|
{mongo_port, MongoPort},
|
|
|
{mongo_config, MongoConfig},
|
|
|
{mongo_type, Type},
|
|
|
{mongo_name, Name}
|
|
|
- | Config
|
|
|
+ | NConfig
|
|
|
];
|
|
|
false ->
|
|
|
{skip, no_mongo}
|
|
|
@@ -121,13 +136,13 @@ end_per_suite(_Config) ->
|
|
|
ok.
|
|
|
|
|
|
init_per_testcase(_Testcase, Config) ->
|
|
|
- catch clear_db(Config),
|
|
|
+ clear_db(Config),
|
|
|
delete_bridge(Config),
|
|
|
snabbkaffe:start_trace(),
|
|
|
Config.
|
|
|
|
|
|
end_per_testcase(_Testcase, Config) ->
|
|
|
- catch clear_db(Config),
|
|
|
+ clear_db(Config),
|
|
|
delete_bridge(Config),
|
|
|
snabbkaffe:stop(),
|
|
|
ok.
|
|
|
@@ -175,19 +190,19 @@ mongo_config(MongoHost, MongoPort0, rs = Type, Config) ->
|
|
|
Name = atom_to_binary(?MODULE),
|
|
|
ConfigString =
|
|
|
io_lib:format(
|
|
|
- "bridges.mongodb_rs.~s {\n"
|
|
|
- " enable = true\n"
|
|
|
- " collection = mycol\n"
|
|
|
- " replica_set_name = rs0\n"
|
|
|
- " servers = [~p]\n"
|
|
|
- " w_mode = safe\n"
|
|
|
- " use_legacy_protocol = auto\n"
|
|
|
- " database = mqtt\n"
|
|
|
- " resource_opts = {\n"
|
|
|
- " query_mode = ~s\n"
|
|
|
- " worker_pool_size = 1\n"
|
|
|
- " }\n"
|
|
|
- "}",
|
|
|
+ "bridges.mongodb_rs.~s {"
|
|
|
+ "\n enable = true"
|
|
|
+ "\n collection = mycol"
|
|
|
+ "\n replica_set_name = rs0"
|
|
|
+ "\n servers = [~p]"
|
|
|
+ "\n w_mode = safe"
|
|
|
+ "\n use_legacy_protocol = auto"
|
|
|
+ "\n database = mqtt"
|
|
|
+ "\n resource_opts = {"
|
|
|
+ "\n query_mode = ~s"
|
|
|
+ "\n worker_pool_size = 1"
|
|
|
+ "\n }"
|
|
|
+ "\n }",
|
|
|
[
|
|
|
Name,
|
|
|
Servers,
|
|
|
@@ -202,18 +217,18 @@ mongo_config(MongoHost, MongoPort0, sharded = Type, Config) ->
|
|
|
Name = atom_to_binary(?MODULE),
|
|
|
ConfigString =
|
|
|
io_lib:format(
|
|
|
- "bridges.mongodb_sharded.~s {\n"
|
|
|
- " enable = true\n"
|
|
|
- " collection = mycol\n"
|
|
|
- " servers = [~p]\n"
|
|
|
- " w_mode = safe\n"
|
|
|
- " use_legacy_protocol = auto\n"
|
|
|
- " database = mqtt\n"
|
|
|
- " resource_opts = {\n"
|
|
|
- " query_mode = ~s\n"
|
|
|
- " worker_pool_size = 1\n"
|
|
|
- " }\n"
|
|
|
- "}",
|
|
|
+ "bridges.mongodb_sharded.~s {"
|
|
|
+ "\n enable = true"
|
|
|
+ "\n collection = mycol"
|
|
|
+ "\n servers = [~p]"
|
|
|
+ "\n w_mode = safe"
|
|
|
+ "\n use_legacy_protocol = auto"
|
|
|
+ "\n database = mqtt"
|
|
|
+ "\n resource_opts = {"
|
|
|
+ "\n query_mode = ~s"
|
|
|
+ "\n worker_pool_size = 1"
|
|
|
+ "\n }"
|
|
|
+ "\n }",
|
|
|
[
|
|
|
Name,
|
|
|
Servers,
|
|
|
@@ -228,21 +243,27 @@ mongo_config(MongoHost, MongoPort0, single = Type, Config) ->
|
|
|
Name = atom_to_binary(?MODULE),
|
|
|
ConfigString =
|
|
|
io_lib:format(
|
|
|
- "bridges.mongodb_single.~s {\n"
|
|
|
- " enable = true\n"
|
|
|
- " collection = mycol\n"
|
|
|
- " server = ~p\n"
|
|
|
- " w_mode = safe\n"
|
|
|
- " use_legacy_protocol = auto\n"
|
|
|
- " database = mqtt\n"
|
|
|
- " resource_opts = {\n"
|
|
|
- " query_mode = ~s\n"
|
|
|
- " worker_pool_size = 1\n"
|
|
|
- " }\n"
|
|
|
- "}",
|
|
|
+ "bridges.mongodb_single.~s {"
|
|
|
+ "\n enable = true"
|
|
|
+ "\n collection = mycol"
|
|
|
+ "\n server = ~p"
|
|
|
+ "\n w_mode = safe"
|
|
|
+ "\n use_legacy_protocol = auto"
|
|
|
+ "\n database = mqtt"
|
|
|
+ "\n auth_source = ~s"
|
|
|
+ "\n username = ~s"
|
|
|
+ "\n password = \"file://~s\""
|
|
|
+ "\n resource_opts = {"
|
|
|
+ "\n query_mode = ~s"
|
|
|
+ "\n worker_pool_size = 1"
|
|
|
+ "\n }"
|
|
|
+ "\n }",
|
|
|
[
|
|
|
Name,
|
|
|
Server,
|
|
|
+ ?config(mongo_authsource, Config),
|
|
|
+ ?config(mongo_username, Config),
|
|
|
+ ?config(mongo_passfile, Config),
|
|
|
QueryMode
|
|
|
]
|
|
|
),
|
|
|
@@ -284,8 +305,24 @@ clear_db(Config) ->
|
|
|
Host = ?config(mongo_host, Config),
|
|
|
Port = ?config(mongo_port, Config),
|
|
|
Server = Host ++ ":" ++ integer_to_list(Port),
|
|
|
- #{<<"database">> := Db, <<"collection">> := Collection} = ?config(mongo_config, Config),
|
|
|
- {ok, Client} = mongo_api:connect(Type, [Server], [], [{database, Db}, {w_mode, unsafe}]),
|
|
|
+ #{
|
|
|
+ <<"database">> := Db,
|
|
|
+ <<"collection">> := Collection
|
|
|
+ } = ?config(mongo_config, Config),
|
|
|
+ WorkerOpts = [
|
|
|
+ {database, Db},
|
|
|
+ {w_mode, unsafe}
|
|
|
+ | lists:flatmap(
|
|
|
+ fun
|
|
|
+ ({mongo_authsource, AS}) -> [{auth_source, AS}];
|
|
|
+ ({mongo_username, User}) -> [{login, User}];
|
|
|
+ ({mongo_password, Pass}) -> [{password, Pass}];
|
|
|
+ (_) -> []
|
|
|
+ end,
|
|
|
+ Config
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ {ok, Client} = mongo_api:connect(Type, [Server], [], WorkerOpts),
|
|
|
{true, _} = mongo_api:delete(Client, Collection, _Selector = #{}),
|
|
|
mongo_api:disconnect(Client).
|
|
|
|
|
|
@@ -386,13 +423,21 @@ t_setup_via_config_and_publish(Config) ->
|
|
|
ok.
|
|
|
|
|
|
t_setup_via_http_api_and_publish(Config) ->
|
|
|
- Type = mongo_type_bin(?config(mongo_type, Config)),
|
|
|
+ Type = ?config(mongo_type, Config),
|
|
|
Name = ?config(mongo_name, Config),
|
|
|
MongoConfig0 = ?config(mongo_config, Config),
|
|
|
- MongoConfig = MongoConfig0#{
|
|
|
+ MongoConfig1 = MongoConfig0#{
|
|
|
<<"name">> => Name,
|
|
|
- <<"type">> => Type
|
|
|
+ <<"type">> => mongo_type_bin(Type)
|
|
|
},
|
|
|
+ MongoConfig =
|
|
|
+ case Type of
|
|
|
+ single ->
|
|
|
+ %% NOTE: using literal password with HTTP API requests.
|
|
|
+ MongoConfig1#{<<"password">> => ?config(mongo_password, Config)};
|
|
|
+ _ ->
|
|
|
+ MongoConfig1
|
|
|
+ end,
|
|
|
?assertMatch(
|
|
|
{ok, _},
|
|
|
create_bridge_http(MongoConfig)
|