feat: handle lists of servers in mongo servers config

This commit is contained in:
Thales Macedo Garitezi 2022-09-01 14:37:29 -03:00
parent 3d4afd65df
commit 275171d217
2 changed files with 198 additions and 2 deletions

View File

@ -47,6 +47,10 @@
default_port => ?MONGO_DEFAULT_PORT
}).
-ifdef(TEST).
-export([to_servers_raw/1]).
-endif.
%%=====================================================================
roots() ->
[
@ -447,7 +451,7 @@ may_parse_srv_and_txt_records_(
true ->
error({missing_parameter, replica_set_name});
false ->
Config#{hosts => servers_to_bin(Servers)}
Config#{hosts => servers_to_bin(lists:flatten(Servers))}
end;
may_parse_srv_and_txt_records_(
#{
@ -557,9 +561,33 @@ to_servers_raw(Servers) ->
fun(Server) ->
emqx_connector_schema_lib:parse_server(Server, ?MONGO_HOST_OPTIONS)
end,
string:tokens(str(Servers), ", ")
split_servers(Servers)
).
split_servers(L) when is_list(L) ->
PossibleTypes = [
list(binary()),
list(string()),
string()
],
TypeChecks = lists:map(fun(T) -> typerefl:typecheck(T, L) end, PossibleTypes),
case TypeChecks of
[ok, _, _] ->
%% list(binary())
lists:map(fun binary_to_list/1, L);
[_, ok, _] ->
%% list(string())
L;
[_, _, ok] ->
%% string()
string:tokens(L, ", ");
[_, _, _] ->
%% invalid input
throw("List of servers must contain only strings")
end;
split_servers(B) when is_binary(B) ->
string:tokens(str(B), ", ").
str(A) when is_atom(A) ->
atom_to_list(A);
str(B) when is_binary(B) ->

View File

@ -0,0 +1,168 @@
%%--------------------------------------------------------------------
%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved.
%%
%% 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.
%%--------------------------------------------------------------------
-module(emqx_connector_mongo_tests).
-include_lib("eunit/include/eunit.hrl").
-define(DEFAULT_MONGO_PORT, 27017).
%%------------------------------------------------------------------------------
%% Helper fns
%%------------------------------------------------------------------------------
%%------------------------------------------------------------------------------
%% Test cases
%%------------------------------------------------------------------------------
to_servers_raw_test_() ->
[
{"single server, binary, no port",
?_test(
?assertEqual(
[{"localhost", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw(<<"localhost">>)
)
)},
{"single server, string, no port",
?_test(
?assertEqual(
[{"localhost", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw("localhost")
)
)},
{"single server, list(binary), no port",
?_test(
?assertEqual(
[{"localhost", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw([<<"localhost">>])
)
)},
{"single server, list(string), no port",
?_test(
?assertEqual(
[{"localhost", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw(["localhost"])
)
)},
%%%%%%%%%
{"single server, binary, with port",
?_test(
?assertEqual(
[{"localhost", 9999}], emqx_connector_mongo:to_servers_raw(<<"localhost:9999">>)
)
)},
{"single server, string, with port",
?_test(
?assertEqual(
[{"localhost", 9999}], emqx_connector_mongo:to_servers_raw("localhost:9999")
)
)},
{"single server, list(binary), with port",
?_test(
?assertEqual(
[{"localhost", 9999}],
emqx_connector_mongo:to_servers_raw([<<"localhost:9999">>])
)
)},
{"single server, list(string), with port",
?_test(
?assertEqual(
[{"localhost", 9999}], emqx_connector_mongo:to_servers_raw(["localhost:9999"])
)
)},
%%%%%%%%%
{"multiple servers, string, no port",
?_test(
?assertEqual(
[{"host1", ?DEFAULT_MONGO_PORT}, {"host2", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw("host1, host2")
)
)},
{"multiple servers, binary, no port",
?_test(
?assertEqual(
[{"host1", ?DEFAULT_MONGO_PORT}, {"host2", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw(<<"host1, host2">>)
)
)},
{"multiple servers, list(string), no port",
?_test(
?assertEqual(
[{"host1", ?DEFAULT_MONGO_PORT}, {"host2", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw(["host1", "host2"])
)
)},
{"multiple servers, list(binary), no port",
?_test(
?assertEqual(
[{"host1", ?DEFAULT_MONGO_PORT}, {"host2", ?DEFAULT_MONGO_PORT}],
emqx_connector_mongo:to_servers_raw([<<"host1">>, <<"host2">>])
)
)},
%%%%%%%%%
{"multiple servers, string, with port",
?_test(
?assertEqual(
[{"host1", 1234}, {"host2", 2345}],
emqx_connector_mongo:to_servers_raw("host1:1234, host2:2345")
)
)},
{"multiple servers, binary, with port",
?_test(
?assertEqual(
[{"host1", 1234}, {"host2", 2345}],
emqx_connector_mongo:to_servers_raw(<<"host1:1234, host2:2345">>)
)
)},
{"multiple servers, list(string), with port",
?_test(
?assertEqual(
[{"host1", 1234}, {"host2", 2345}],
emqx_connector_mongo:to_servers_raw(["host1:1234", "host2:2345"])
)
)},
{"multiple servers, list(binary), with port",
?_test(
?assertEqual(
[{"host1", 1234}, {"host2", 2345}],
emqx_connector_mongo:to_servers_raw([<<"host1:1234">>, <<"host2:2345">>])
)
)},
%%%%%%%%
{"multiple servers, invalid list(string)",
?_test(
?assertThrow(
_,
emqx_connector_mongo:to_servers_raw(["host1, host2"])
)
)},
{"multiple servers, invalid list(binary)",
?_test(
?assertThrow(
_,
emqx_connector_mongo:to_servers_raw([<<"host1, host2">>])
)
)},
%% TODO: handle this case??
{"multiple servers, mixed list(binary|string)",
?_test(
?assertThrow(
_,
emqx_connector_mongo:to_servers_raw([<<"host1">>, "host2"])
)
)}
].