chore(authz): rename mongo to mongodb
This commit is contained in:
parent
ab2cdfeab1
commit
00d7d66871
|
@ -46,7 +46,7 @@ authorization {
|
||||||
# cmd: "HGETALL mqtt_authz:%u"
|
# cmd: "HGETALL mqtt_authz:%u"
|
||||||
# },
|
# },
|
||||||
# {
|
# {
|
||||||
# type: mongo
|
# type: mongodb
|
||||||
# mongo_type: single
|
# mongo_type: single
|
||||||
# server: "127.0.0.1:27017"
|
# server: "127.0.0.1:27017"
|
||||||
# pool_size: 1
|
# pool_size: 1
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
-export([post_config_update/4, pre_config_update/2]).
|
-export([post_config_update/4, pre_config_update/2]).
|
||||||
|
|
||||||
-define(CONF_KEY_PATH, [authorization, sources]).
|
-define(CONF_KEY_PATH, [authorization, sources]).
|
||||||
-define(SOURCE_TYPES, [file, http, mongo, mysql, postgresql, redis]).
|
-define(SOURCE_TYPES, [file, http, mongodb, mysql, postgresql, redis]).
|
||||||
|
|
||||||
-spec(register_metrics() -> ok).
|
-spec(register_metrics() -> ok).
|
||||||
register_metrics() ->
|
register_metrics() ->
|
||||||
|
@ -300,7 +300,7 @@ init_source(#{enable := true,
|
||||||
init_source(#{enable := true,
|
init_source(#{enable := true,
|
||||||
type := DB
|
type := DB
|
||||||
} = Source) when DB =:= redis;
|
} = Source) when DB =:= redis;
|
||||||
DB =:= mongo ->
|
DB =:= mongodb ->
|
||||||
case create_resource(Source) of
|
case create_resource(Source) of
|
||||||
{error, Reason} -> error({load_config_error, Reason});
|
{error, Reason} -> error({load_config_error, Reason});
|
||||||
Id -> Source#{annotations => #{id => Id}}
|
Id -> Source#{annotations => #{id => Id}}
|
||||||
|
@ -407,6 +407,8 @@ create_resource(#{type := DB} = Source) ->
|
||||||
authz_module(Type) ->
|
authz_module(Type) ->
|
||||||
list_to_existing_atom("emqx_authz_" ++ atom_to_list(Type)).
|
list_to_existing_atom("emqx_authz_" ++ atom_to_list(Type)).
|
||||||
|
|
||||||
|
connector_module(mongodb) ->
|
||||||
|
emqx_connector_mongo;
|
||||||
connector_module(postgresql) ->
|
connector_module(postgresql) ->
|
||||||
emqx_connector_pgsql;
|
emqx_connector_pgsql;
|
||||||
connector_module(Type) ->
|
connector_module(Type) ->
|
||||||
|
|
|
@ -132,8 +132,8 @@ definitions() ->
|
||||||
properties => #{
|
properties => #{
|
||||||
type => #{
|
type => #{
|
||||||
type => string,
|
type => string,
|
||||||
enum => [<<"mongo">>],
|
enum => [<<"mongodb">>],
|
||||||
example => <<"mongo">>
|
example => <<"mongodb">>
|
||||||
},
|
},
|
||||||
enable => #{
|
enable => #{
|
||||||
type => boolean,
|
type => boolean,
|
||||||
|
@ -188,8 +188,8 @@ definitions() ->
|
||||||
properties => #{
|
properties => #{
|
||||||
type => #{
|
type => #{
|
||||||
type => string,
|
type => string,
|
||||||
enum => [<<"mongo">>],
|
enum => [<<"mongodb">>],
|
||||||
example => <<"mongo">>
|
example => <<"mongodb">>
|
||||||
},
|
},
|
||||||
enable => #{
|
enable => #{
|
||||||
type => boolean,
|
type => boolean,
|
||||||
|
@ -245,8 +245,8 @@ definitions() ->
|
||||||
properties => #{
|
properties => #{
|
||||||
type => #{
|
type => #{
|
||||||
type => string,
|
type => string,
|
||||||
enum => [<<"mongo">>],
|
enum => [<<"mongodb">>],
|
||||||
example => <<"mongo">>
|
example => <<"mongodb">>
|
||||||
},
|
},
|
||||||
enable => #{
|
enable => #{
|
||||||
type => boolean,
|
type => boolean,
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
%% limitations under the License.
|
%% limitations under the License.
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
-module(emqx_authz_mongo).
|
-module(emqx_authz_mongodb).
|
||||||
|
|
||||||
-include("emqx_authz.hrl").
|
-include("emqx_authz.hrl").
|
||||||
-include_lib("emqx/include/emqx.hrl").
|
-include_lib("emqx/include/emqx.hrl").
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
description() ->
|
description() ->
|
||||||
"AuthZ with Mongo".
|
"AuthZ with MongoDB".
|
||||||
|
|
||||||
authorize(Client, PubSub, Topic,
|
authorize(Client, PubSub, Topic,
|
||||||
#{collection := Collection,
|
#{collection := Collection,
|
|
@ -114,28 +114,34 @@ fields(http_post) ->
|
||||||
}
|
}
|
||||||
] ++ proplists:delete(base_url, emqx_connector_http:fields(config));
|
] ++ proplists:delete(base_url, emqx_connector_http:fields(config));
|
||||||
fields(mongo_single) ->
|
fields(mongo_single) ->
|
||||||
connector_fields(mongo, single) ++
|
|
||||||
[ {collection, #{type => atom()}}
|
[ {collection, #{type => atom()}}
|
||||||
, {selector, #{type => map()}}
|
, {selector, #{type => map()}}
|
||||||
];
|
, {type, #{type => mongodb}}
|
||||||
|
, {enable, #{type => boolean(),
|
||||||
|
default => true}}
|
||||||
|
] ++ emqx_connector_mongo:fields(single);
|
||||||
fields(mongo_rs) ->
|
fields(mongo_rs) ->
|
||||||
connector_fields(mongo, rs) ++
|
|
||||||
[ {collection, #{type => atom()}}
|
[ {collection, #{type => atom()}}
|
||||||
, {selector, #{type => map()}}
|
, {selector, #{type => map()}}
|
||||||
];
|
, {type, #{type => mongodb}}
|
||||||
|
, {enable, #{type => boolean(),
|
||||||
|
default => true}}
|
||||||
|
] ++ emqx_connector_mongo:fields(rs);
|
||||||
fields(mongo_sharded) ->
|
fields(mongo_sharded) ->
|
||||||
connector_fields(mongo, sharded) ++
|
|
||||||
[ {collection, #{type => atom()}}
|
[ {collection, #{type => atom()}}
|
||||||
, {selector, #{type => map()}}
|
, {selector, #{type => map()}}
|
||||||
];
|
, {type, #{type => mongodb}}
|
||||||
|
, {enable, #{type => boolean(),
|
||||||
|
default => true}}
|
||||||
|
] ++ emqx_connector_mongo:fields(sharded);
|
||||||
fields(mysql) ->
|
fields(mysql) ->
|
||||||
connector_fields(mysql) ++
|
connector_fields(mysql) ++
|
||||||
[ {query, query()} ];
|
[ {query, query()} ];
|
||||||
fields(postgresql) ->
|
fields(postgresql) ->
|
||||||
[ {type, #{type => postgresql}}
|
[ {query, query()}
|
||||||
|
, {type, #{type => postgresql}}
|
||||||
, {enable, #{type => boolean(),
|
, {enable, #{type => boolean(),
|
||||||
default => true}}
|
default => true}}
|
||||||
, {query, query()}
|
|
||||||
] ++ emqx_connector_pgsql:fields(config);
|
] ++ emqx_connector_pgsql:fields(config);
|
||||||
fields(redis_single) ->
|
fields(redis_single) ->
|
||||||
connector_fields(redis, single) ++
|
connector_fields(redis, single) ++
|
||||||
|
|
|
@ -67,7 +67,7 @@ init_per_testcase(_, Config) ->
|
||||||
<<"method">> => <<"get">>,
|
<<"method">> => <<"get">>,
|
||||||
<<"request_timeout">> => 5000
|
<<"request_timeout">> => 5000
|
||||||
}).
|
}).
|
||||||
-define(SOURCE2, #{<<"type">> => <<"mongo">>,
|
-define(SOURCE2, #{<<"type">> => <<"mongodb">>,
|
||||||
<<"enable">> => true,
|
<<"enable">> => true,
|
||||||
<<"mongo_type">> => <<"single">>,
|
<<"mongo_type">> => <<"single">>,
|
||||||
<<"server">> => <<"127.0.0.1:27017">>,
|
<<"server">> => <<"127.0.0.1:27017">>,
|
||||||
|
@ -128,7 +128,7 @@ t_update_source(_) ->
|
||||||
{ok, _} = emqx_authz:update(tail, [?SOURCE6]),
|
{ok, _} = emqx_authz:update(tail, [?SOURCE6]),
|
||||||
|
|
||||||
?assertMatch([ #{type := http, enable := true}
|
?assertMatch([ #{type := http, enable := true}
|
||||||
, #{type := mongo, enable := true}
|
, #{type := mongodb, enable := true}
|
||||||
, #{type := mysql, enable := true}
|
, #{type := mysql, enable := true}
|
||||||
, #{type := postgresql, enable := true}
|
, #{type := postgresql, enable := true}
|
||||||
, #{type := redis, enable := true}
|
, #{type := redis, enable := true}
|
||||||
|
@ -136,14 +136,14 @@ t_update_source(_) ->
|
||||||
], emqx:get_config([authorization, sources], [])),
|
], emqx:get_config([authorization, sources], [])),
|
||||||
|
|
||||||
{ok, _} = emqx_authz:update({replace_once, http}, ?SOURCE1#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, http}, ?SOURCE1#{<<"enable">> := false}),
|
||||||
{ok, _} = emqx_authz:update({replace_once, mongo}, ?SOURCE2#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, mongodb}, ?SOURCE2#{<<"enable">> := false}),
|
||||||
{ok, _} = emqx_authz:update({replace_once, mysql}, ?SOURCE3#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, mysql}, ?SOURCE3#{<<"enable">> := false}),
|
||||||
{ok, _} = emqx_authz:update({replace_once, postgresql}, ?SOURCE4#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, postgresql}, ?SOURCE4#{<<"enable">> := false}),
|
||||||
{ok, _} = emqx_authz:update({replace_once, redis}, ?SOURCE5#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, redis}, ?SOURCE5#{<<"enable">> := false}),
|
||||||
{ok, _} = emqx_authz:update({replace_once, file}, ?SOURCE6#{<<"enable">> := false}),
|
{ok, _} = emqx_authz:update({replace_once, file}, ?SOURCE6#{<<"enable">> := false}),
|
||||||
|
|
||||||
?assertMatch([ #{type := http, enable := false}
|
?assertMatch([ #{type := http, enable := false}
|
||||||
, #{type := mongo, enable := false}
|
, #{type := mongodb, enable := false}
|
||||||
, #{type := mysql, enable := false}
|
, #{type := mysql, enable := false}
|
||||||
, #{type := postgresql, enable := false}
|
, #{type := postgresql, enable := false}
|
||||||
, #{type := redis, enable := false}
|
, #{type := redis, enable := false}
|
||||||
|
@ -155,7 +155,7 @@ t_update_source(_) ->
|
||||||
t_move_source(_) ->
|
t_move_source(_) ->
|
||||||
{ok, _} = emqx_authz:update(replace, [?SOURCE1, ?SOURCE2, ?SOURCE3, ?SOURCE4, ?SOURCE5, ?SOURCE6]),
|
{ok, _} = emqx_authz:update(replace, [?SOURCE1, ?SOURCE2, ?SOURCE3, ?SOURCE4, ?SOURCE5, ?SOURCE6]),
|
||||||
?assertMatch([ #{type := http}
|
?assertMatch([ #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
|
@ -165,7 +165,7 @@ t_move_source(_) ->
|
||||||
{ok, _} = emqx_authz:move(postgresql, <<"top">>),
|
{ok, _} = emqx_authz:move(postgresql, <<"top">>),
|
||||||
?assertMatch([ #{type := postgresql}
|
?assertMatch([ #{type := postgresql}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := file}
|
, #{type := file}
|
||||||
|
@ -173,7 +173,7 @@ t_move_source(_) ->
|
||||||
|
|
||||||
{ok, _} = emqx_authz:move(http, <<"bottom">>),
|
{ok, _} = emqx_authz:move(http, <<"bottom">>),
|
||||||
?assertMatch([ #{type := postgresql}
|
?assertMatch([ #{type := postgresql}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := file}
|
, #{type := file}
|
||||||
|
@ -183,19 +183,19 @@ t_move_source(_) ->
|
||||||
{ok, _} = emqx_authz:move(mysql, #{<<"before">> => postgresql}),
|
{ok, _} = emqx_authz:move(mysql, #{<<"before">> => postgresql}),
|
||||||
?assertMatch([ #{type := mysql}
|
?assertMatch([ #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := file}
|
, #{type := file}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
], emqx_authz:lookup()),
|
], emqx_authz:lookup()),
|
||||||
|
|
||||||
{ok, _} = emqx_authz:move(mongo, #{<<"after">> => http}),
|
{ok, _} = emqx_authz:move(mongodb, #{<<"after">> => http}),
|
||||||
?assertMatch([ #{type := mysql}
|
?assertMatch([ #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := file}
|
, #{type := file}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
], emqx_authz:lookup()),
|
], emqx_authz:lookup()),
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
<<"method">> => <<"get">>,
|
<<"method">> => <<"get">>,
|
||||||
<<"request_timeout">> => 5000
|
<<"request_timeout">> => 5000
|
||||||
}).
|
}).
|
||||||
-define(SOURCE2, #{<<"type">> => <<"mongo">>,
|
-define(SOURCE2, #{<<"type">> => <<"mongodb">>,
|
||||||
<<"enable">> => true,
|
<<"enable">> => true,
|
||||||
<<"mongo_type">> => <<"sharded">>,
|
<<"mongo_type">> => <<"sharded">>,
|
||||||
<<"servers">> => [<<"127.0.0.1:27017">>,
|
<<"servers">> => [<<"127.0.0.1:27017">>,
|
||||||
|
@ -181,7 +181,7 @@ t_api(_) ->
|
||||||
{ok, 200, Result2} = request(get, uri(["authorization", "sources"]), []),
|
{ok, 200, Result2} = request(get, uri(["authorization", "sources"]), []),
|
||||||
Sources = get_sources(Result2),
|
Sources = get_sources(Result2),
|
||||||
?assertMatch([ #{<<"type">> := <<"http">>}
|
?assertMatch([ #{<<"type">> := <<"http">>}
|
||||||
, #{<<"type">> := <<"mongo">>}
|
, #{<<"type">> := <<"mongodb">>}
|
||||||
, #{<<"type">> := <<"mysql">>}
|
, #{<<"type">> := <<"mysql">>}
|
||||||
, #{<<"type">> := <<"postgresql">>}
|
, #{<<"type">> := <<"postgresql">>}
|
||||||
, #{<<"type">> := <<"redis">>}
|
, #{<<"type">> := <<"redis">>}
|
||||||
|
@ -193,7 +193,7 @@ t_api(_) ->
|
||||||
{ok, 200, Result3} = request(get, uri(["authorization", "sources", "http"]), []),
|
{ok, 200, Result3} = request(get, uri(["authorization", "sources", "http"]), []),
|
||||||
?assertMatch(#{<<"type">> := <<"http">>, <<"enable">> := false}, jsx:decode(Result3)),
|
?assertMatch(#{<<"type">> := <<"http">>, <<"enable">> := false}, jsx:decode(Result3)),
|
||||||
|
|
||||||
{ok, 204, _} = request(put, uri(["authorization", "sources", "mongo"]),
|
{ok, 204, _} = request(put, uri(["authorization", "sources", "mongodb"]),
|
||||||
?SOURCE2#{<<"ssl">> := #{
|
?SOURCE2#{<<"ssl">> := #{
|
||||||
<<"enable">> => true,
|
<<"enable">> => true,
|
||||||
<<"cacertfile">> => <<"fake cacert file">>,
|
<<"cacertfile">> => <<"fake cacert file">>,
|
||||||
|
@ -201,8 +201,8 @@ t_api(_) ->
|
||||||
<<"keyfile">> => <<"fake key file">>,
|
<<"keyfile">> => <<"fake key file">>,
|
||||||
<<"verify">> => false
|
<<"verify">> => false
|
||||||
}}),
|
}}),
|
||||||
{ok, 200, Result4} = request(get, uri(["authorization", "sources", "mongo"]), []),
|
{ok, 200, Result4} = request(get, uri(["authorization", "sources", "mongodb"]), []),
|
||||||
?assertMatch(#{<<"type">> := <<"mongo">>,
|
?assertMatch(#{<<"type">> := <<"mongodb">>,
|
||||||
<<"ssl">> := #{<<"enable">> := true,
|
<<"ssl">> := #{<<"enable">> := true,
|
||||||
<<"cacertfile">> := <<"fake cacert file">>,
|
<<"cacertfile">> := <<"fake cacert file">>,
|
||||||
<<"certfile">> := <<"fake cert file">>,
|
<<"certfile">> := <<"fake cert file">>,
|
||||||
|
@ -225,7 +225,7 @@ t_api(_) ->
|
||||||
t_move_source(_) ->
|
t_move_source(_) ->
|
||||||
{ok, _} = emqx_authz:update(replace, [?SOURCE1, ?SOURCE2, ?SOURCE3, ?SOURCE4, ?SOURCE5]),
|
{ok, _} = emqx_authz:update(replace, [?SOURCE1, ?SOURCE2, ?SOURCE3, ?SOURCE4, ?SOURCE5]),
|
||||||
?assertMatch([ #{type := http}
|
?assertMatch([ #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
|
@ -235,7 +235,7 @@ t_move_source(_) ->
|
||||||
#{<<"position">> => <<"top">>}),
|
#{<<"position">> => <<"top">>}),
|
||||||
?assertMatch([ #{type := postgresql}
|
?assertMatch([ #{type := postgresql}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
], emqx_authz:lookup()),
|
], emqx_authz:lookup()),
|
||||||
|
@ -243,7 +243,7 @@ t_move_source(_) ->
|
||||||
{ok, 204, _} = request(post, uri(["authorization", "sources", "http", "move"]),
|
{ok, 204, _} = request(post, uri(["authorization", "sources", "http", "move"]),
|
||||||
#{<<"position">> => <<"bottom">>}),
|
#{<<"position">> => <<"bottom">>}),
|
||||||
?assertMatch([ #{type := postgresql}
|
?assertMatch([ #{type := postgresql}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := mysql}
|
, #{type := mysql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
|
@ -253,18 +253,18 @@ t_move_source(_) ->
|
||||||
#{<<"position">> => #{<<"before">> => <<"postgresql">>}}),
|
#{<<"position">> => #{<<"before">> => <<"postgresql">>}}),
|
||||||
?assertMatch([ #{type := mysql}
|
?assertMatch([ #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
], emqx_authz:lookup()),
|
], emqx_authz:lookup()),
|
||||||
|
|
||||||
{ok, 204, _} = request(post, uri(["authorization", "sources", "mongo", "move"]),
|
{ok, 204, _} = request(post, uri(["authorization", "sources", "mongodb", "move"]),
|
||||||
#{<<"position">> => #{<<"after">> => <<"http">>}}),
|
#{<<"position">> => #{<<"after">> => <<"http">>}}),
|
||||||
?assertMatch([ #{type := mysql}
|
?assertMatch([ #{type := mysql}
|
||||||
, #{type := postgresql}
|
, #{type := postgresql}
|
||||||
, #{type := redis}
|
, #{type := redis}
|
||||||
, #{type := http}
|
, #{type := http}
|
||||||
, #{type := mongo}
|
, #{type := mongodb}
|
||||||
], emqx_authz:lookup()),
|
], emqx_authz:lookup()),
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
%% limitations under the License.
|
%% limitations under the License.
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
-module(emqx_authz_mongo_SUITE).
|
-module(emqx_authz_mongodb_SUITE).
|
||||||
|
|
||||||
-compile(nowarn_export_all).
|
-compile(nowarn_export_all).
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
|
@ -46,7 +46,7 @@ init_per_suite(Config) ->
|
||||||
ok = emqx_ct_helpers:start_apps([emqx_authz]),
|
ok = emqx_ct_helpers:start_apps([emqx_authz]),
|
||||||
{ok, _} = emqx:update_config([authorization, cache, enable], false),
|
{ok, _} = emqx:update_config([authorization, cache, enable], false),
|
||||||
{ok, _} = emqx:update_config([authorization, no_match], deny),
|
{ok, _} = emqx:update_config([authorization, no_match], deny),
|
||||||
Rules = [#{<<"type">> => <<"mongo">>,
|
Rules = [#{<<"type">> => <<"mongodb">>,
|
||||||
<<"mongo_type">> => <<"single">>,
|
<<"mongo_type">> => <<"single">>,
|
||||||
<<"server">> => <<"127.0.0.1:27017">>,
|
<<"server">> => <<"127.0.0.1:27017">>,
|
||||||
<<"pool_size">> => 1,
|
<<"pool_size">> => 1,
|
Loading…
Reference in New Issue