chore(auth): get rid of hardcoded schema modules in auth
This commit is contained in:
parent
c2c56ba481
commit
5dff36474d
|
@ -22,7 +22,11 @@
|
||||||
#{
|
#{
|
||||||
hookpoint() => [hocon_schema:field()]
|
hookpoint() => [hocon_schema:field()]
|
||||||
}.
|
}.
|
||||||
-optional_callbacks([injected_fields/0]).
|
-callback injected_fields(term()) ->
|
||||||
|
#{
|
||||||
|
hookpoint() => [hocon_schema:field()]
|
||||||
|
}.
|
||||||
|
-optional_callbacks([injected_fields/0, injected_fields/1]).
|
||||||
|
|
||||||
-export_type([hookpoint/0]).
|
-export_type([hookpoint/0]).
|
||||||
|
|
||||||
|
@ -92,6 +96,8 @@ inject_from_modules(Modules) ->
|
||||||
|
|
||||||
append_module_injections(Module, AllInjections) when is_atom(Module) ->
|
append_module_injections(Module, AllInjections) when is_atom(Module) ->
|
||||||
append_module_injections(Module:injected_fields(), AllInjections);
|
append_module_injections(Module:injected_fields(), AllInjections);
|
||||||
|
append_module_injections({Module, Options}, AllInjections) when is_atom(Module) ->
|
||||||
|
append_module_injections(Module:injected_fields(Options), AllInjections);
|
||||||
append_module_injections(ModuleInjections, AllInjections) when is_map(ModuleInjections) ->
|
append_module_injections(ModuleInjections, AllInjections) when is_map(ModuleInjections) ->
|
||||||
maps:fold(
|
maps:fold(
|
||||||
fun(PointName, Fields, Acc) ->
|
fun(PointName, Fields, Acc) ->
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
%% Copyright (c) 2020-2023 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.
|
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
|
|
||||||
-ifndef(EMQX_AUTHN_SOURCES_HRL).
|
|
||||||
-define(EMQX_AUTHN_SOURCES_HRL, true).
|
|
||||||
|
|
||||||
-define(PROVIDER_SCHEMA_MODS, [
|
|
||||||
emqx_authn_mnesia_schema,
|
|
||||||
emqx_authn_mysql_schema,
|
|
||||||
emqx_authn_postgresql_schema,
|
|
||||||
emqx_authn_mongodb_schema,
|
|
||||||
emqx_authn_redis_schema,
|
|
||||||
emqx_authn_http_schema,
|
|
||||||
emqx_authn_jwt_schema,
|
|
||||||
emqx_authn_scram_mnesia_schema
|
|
||||||
]).
|
|
||||||
|
|
||||||
-define(EE_PROVIDER_SCHEMA_MODS, [
|
|
||||||
emqx_authn_ldap_schema,
|
|
||||||
emqx_authn_ldap_bind_schema,
|
|
||||||
emqx_gcp_device_authn_schema
|
|
||||||
]).
|
|
||||||
|
|
||||||
-endif.
|
|
|
@ -1,34 +0,0 @@
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
%% Copyright (c) 2020-2023 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.
|
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
|
|
||||||
-ifndef(EMQX_AUTHZ_SCHEMA_HRL).
|
|
||||||
-define(EMQX_AUTHZ_SCHEMA_HRL, true).
|
|
||||||
|
|
||||||
-define(SOURCE_SCHEMA_MODS, [
|
|
||||||
emqx_authz_file_schema,
|
|
||||||
emqx_authz_mnesia_schema,
|
|
||||||
emqx_authz_http_schema,
|
|
||||||
emqx_authz_redis_schema,
|
|
||||||
emqx_authz_mysql_schema,
|
|
||||||
emqx_authz_postgresql_schema,
|
|
||||||
emqx_authz_mongodb_schema
|
|
||||||
]).
|
|
||||||
|
|
||||||
-define(EE_SOURCE_SCHEMA_MODS, [
|
|
||||||
emqx_authz_ldap_schema
|
|
||||||
]).
|
|
||||||
|
|
||||||
-endif.
|
|
|
@ -1,21 +0,0 @@
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
%% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
|
|
||||||
-module(emqx_authn_enterprise).
|
|
||||||
|
|
||||||
-include("emqx_authn_schema.hrl").
|
|
||||||
|
|
||||||
-export([provider_schema_mods/0]).
|
|
||||||
|
|
||||||
-if(?EMQX_RELEASE_EDITION == ee).
|
|
||||||
|
|
||||||
provider_schema_mods() ->
|
|
||||||
?EE_PROVIDER_SCHEMA_MODS.
|
|
||||||
|
|
||||||
-else.
|
|
||||||
|
|
||||||
provider_schema_mods() ->
|
|
||||||
[].
|
|
||||||
|
|
||||||
-endif.
|
|
|
@ -19,14 +19,13 @@
|
||||||
-elvis([{elvis_style, invalid_dynamic_call, disable}]).
|
-elvis([{elvis_style, invalid_dynamic_call, disable}]).
|
||||||
-include_lib("hocon/include/hoconsc.hrl").
|
-include_lib("hocon/include/hoconsc.hrl").
|
||||||
-include("emqx_authn.hrl").
|
-include("emqx_authn.hrl").
|
||||||
-include("emqx_authn_schema.hrl").
|
|
||||||
-include("emqx_authn_chains.hrl").
|
-include("emqx_authn_chains.hrl").
|
||||||
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
-behaviour(emqx_schema_hooks).
|
-behaviour(emqx_schema_hooks).
|
||||||
-export([
|
-export([
|
||||||
injected_fields/0
|
injected_fields/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
|
@ -35,7 +34,7 @@
|
||||||
tags/0,
|
tags/0,
|
||||||
fields/1,
|
fields/1,
|
||||||
authenticator_type/0,
|
authenticator_type/0,
|
||||||
authenticator_type_without_scram/0,
|
authenticator_type_without/1,
|
||||||
mechanism/1,
|
mechanism/1,
|
||||||
backend/1
|
backend/1
|
||||||
]).
|
]).
|
||||||
|
@ -44,6 +43,8 @@
|
||||||
global_auth_fields/0
|
global_auth_fields/0
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
-define(AUTHN_MODS_PT_KEY, {?MODULE, authn_schema_mods}).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Authn Source Schema Behaviour
|
%% Authn Source Schema Behaviour
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
@ -55,7 +56,8 @@
|
||||||
|
|
||||||
roots() -> [].
|
roots() -> [].
|
||||||
|
|
||||||
injected_fields() ->
|
injected_fields(AuthnSchemaMods) ->
|
||||||
|
persistent_term:put(?AUTHN_MODS_PT_KEY, AuthnSchemaMods),
|
||||||
#{
|
#{
|
||||||
'mqtt.listener' => mqtt_listener_auth_fields(),
|
'mqtt.listener' => mqtt_listener_auth_fields(),
|
||||||
'roots.high' => global_auth_fields()
|
'roots.high' => global_auth_fields()
|
||||||
|
@ -67,9 +69,9 @@ tags() ->
|
||||||
authenticator_type() ->
|
authenticator_type() ->
|
||||||
hoconsc:union(union_member_selector(provider_schema_mods())).
|
hoconsc:union(union_member_selector(provider_schema_mods())).
|
||||||
|
|
||||||
authenticator_type_without_scram() ->
|
authenticator_type_without(ProviderSchemaMods) ->
|
||||||
hoconsc:union(
|
hoconsc:union(
|
||||||
union_member_selector(provider_schema_mods() -- [emqx_authn_scram_mnesia_schema])
|
union_member_selector(provider_schema_mods() -- ProviderSchemaMods)
|
||||||
).
|
).
|
||||||
|
|
||||||
union_member_selector(Mods) ->
|
union_member_selector(Mods) ->
|
||||||
|
@ -241,7 +243,16 @@ validations(Mod) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
provider_schema_mods() ->
|
provider_schema_mods() ->
|
||||||
?PROVIDER_SCHEMA_MODS ++ emqx_authn_enterprise:provider_schema_mods().
|
try
|
||||||
|
persistent_term:get(?AUTHN_MODS_PT_KEY)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
%% This may happen only in tests.
|
||||||
|
%% emqx_conf provides the schema mods for emqx_authn_schema
|
||||||
|
%% and injects it into the full app's schema.
|
||||||
|
%% Please check if emqx_conf is properly started.
|
||||||
|
error(emqx_authn_schema_not_injected)
|
||||||
|
end.
|
||||||
|
|
||||||
status() ->
|
status() ->
|
||||||
hoconsc:enum([connected, disconnected, connecting]).
|
hoconsc:enum([connected, disconnected, connecting]).
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
%% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
-module(emqx_authz_enterprise).
|
|
||||||
|
|
||||||
-include("emqx_authz_schema.hrl").
|
|
||||||
|
|
||||||
-export([
|
|
||||||
source_schema_mods/0
|
|
||||||
]).
|
|
||||||
|
|
||||||
-if(?EMQX_RELEASE_EDITION == ee).
|
|
||||||
|
|
||||||
source_schema_mods() ->
|
|
||||||
?EE_SOURCE_SCHEMA_MODS.
|
|
||||||
|
|
||||||
-else.
|
|
||||||
|
|
||||||
-dialyzer({nowarn_function, [source_schema_mods/0]}).
|
|
||||||
|
|
||||||
source_schema_mods() ->
|
|
||||||
[].
|
|
||||||
|
|
||||||
-endif.
|
|
|
@ -17,7 +17,6 @@
|
||||||
-module(emqx_authz_schema).
|
-module(emqx_authz_schema).
|
||||||
|
|
||||||
-include("emqx_authz.hrl").
|
-include("emqx_authz.hrl").
|
||||||
-include("emqx_authz_schema.hrl").
|
|
||||||
-include_lib("hocon/include/hoconsc.hrl").
|
-include_lib("hocon/include/hoconsc.hrl").
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
|
@ -34,7 +33,7 @@
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
injected_fields/0
|
injected_fields/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
-export([
|
-export([
|
||||||
|
@ -42,6 +41,8 @@
|
||||||
authz_common_fields/1
|
authz_common_fields/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
-define(AUTHZ_MODS_PT_KEY, {?MODULE, authz_schema_mods}).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Authz Source Schema Behaviour
|
%% Authz Source Schema Behaviour
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
@ -115,7 +116,8 @@ desc(_) ->
|
||||||
%% emqx_schema_hooks behaviour
|
%% emqx_schema_hooks behaviour
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
injected_fields() ->
|
injected_fields(AuthzSchemaMods) ->
|
||||||
|
persistent_term:put(?AUTHZ_MODS_PT_KEY, AuthzSchemaMods),
|
||||||
#{
|
#{
|
||||||
'roots.high' => [
|
'roots.high' => [
|
||||||
{?CONF_NS, ?HOCON(?R_REF(?CONF_NS), #{desc => ?DESC(?CONF_NS)})}
|
{?CONF_NS, ?HOCON(?R_REF(?CONF_NS), #{desc => ?DESC(?CONF_NS)})}
|
||||||
|
@ -178,7 +180,16 @@ api_source_refs(Mod) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
source_schema_mods() ->
|
source_schema_mods() ->
|
||||||
?SOURCE_SCHEMA_MODS ++ emqx_authz_enterprise:source_schema_mods().
|
try
|
||||||
|
persistent_term:get(?AUTHZ_MODS_PT_KEY)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
%% This may happen only in tests.
|
||||||
|
%% emqx_conf provides the schema mods for emqx_authz_schema
|
||||||
|
%% and injects it into the full app's schema.
|
||||||
|
%% Please check if emqx_conf is properly started.
|
||||||
|
error(emqx_authz_schema_not_injected)
|
||||||
|
end.
|
||||||
|
|
||||||
common_rate_field() ->
|
common_rate_field() ->
|
||||||
[
|
[
|
||||||
|
|
|
@ -40,10 +40,19 @@ end_per_suite(_Config) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
init_per_testcase(Case, Config) ->
|
init_per_testcase(Case, Config) ->
|
||||||
?MODULE:Case({init, Config}).
|
Apps = emqx_cth_suite:start(
|
||||||
|
[
|
||||||
|
emqx,
|
||||||
|
emqx_conf,
|
||||||
|
emqx_auth
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Case, Config)}
|
||||||
|
),
|
||||||
|
?MODULE:Case({init, [{apps, Apps} | Config]}).
|
||||||
|
|
||||||
end_per_testcase(Case, Config) ->
|
end_per_testcase(Case, Config) ->
|
||||||
?MODULE:Case({'end', Config}).
|
?MODULE:Case({'end', Config}),
|
||||||
|
emqx_cth_suite:stop(?config(apps, Config)).
|
||||||
|
|
||||||
%%=================================================================================
|
%%=================================================================================
|
||||||
%% Helpers fns
|
%% Helpers fns
|
||||||
|
@ -81,7 +90,6 @@ t_fill_defaults(Config) when is_list(Config) ->
|
||||||
).
|
).
|
||||||
|
|
||||||
t_will_message_connection_denied({init, Config}) ->
|
t_will_message_connection_denied({init, Config}) ->
|
||||||
emqx_common_test_helpers:start_apps([emqx_conf, emqx_auth]),
|
|
||||||
emqx_authn_test_lib:register_fake_providers([{password_based, built_in_database}]),
|
emqx_authn_test_lib:register_fake_providers([{password_based, built_in_database}]),
|
||||||
AuthnConfig = #{
|
AuthnConfig = #{
|
||||||
<<"mechanism">> => <<"password_based">>,
|
<<"mechanism">> => <<"password_based">>,
|
||||||
|
@ -106,7 +114,6 @@ t_will_message_connection_denied({'end', _Config}) ->
|
||||||
[authentication],
|
[authentication],
|
||||||
{delete_authenticator, 'mqtt:global', <<"password_based:built_in_database">>}
|
{delete_authenticator, 'mqtt:global', <<"password_based:built_in_database">>}
|
||||||
),
|
),
|
||||||
emqx_common_test_helpers:stop_apps([emqx_auth, emqx_conf]),
|
|
||||||
ok;
|
ok;
|
||||||
t_will_message_connection_denied(Config) when is_list(Config) ->
|
t_will_message_connection_denied(Config) when is_list(Config) ->
|
||||||
process_flag(trap_exit, true),
|
process_flag(trap_exit, true),
|
||||||
|
@ -146,7 +153,6 @@ t_will_message_connection_denied(Config) when is_list(Config) ->
|
||||||
%% With auth enabled, send CONNECT without password field,
|
%% With auth enabled, send CONNECT without password field,
|
||||||
%% expect CONNACK with reason_code=5 and socket close
|
%% expect CONNACK with reason_code=5 and socket close
|
||||||
t_password_undefined({init, Config}) ->
|
t_password_undefined({init, Config}) ->
|
||||||
emqx_common_test_helpers:start_apps([emqx_conf, emqx_auth]),
|
|
||||||
emqx_authn_test_lib:register_fake_providers([
|
emqx_authn_test_lib:register_fake_providers([
|
||||||
{password_based, built_in_database}
|
{password_based, built_in_database}
|
||||||
]),
|
]),
|
||||||
|
@ -166,7 +172,6 @@ t_password_undefined({'end', _Config}) ->
|
||||||
[authentication],
|
[authentication],
|
||||||
{delete_authenticator, 'mqtt:global', <<"password_based:built_in_database">>}
|
{delete_authenticator, 'mqtt:global', <<"password_based:built_in_database">>}
|
||||||
),
|
),
|
||||||
emqx_common_test_helpers:stop_apps([emqx_auth, emqx_conf]),
|
|
||||||
ok;
|
ok;
|
||||||
t_password_undefined(Config) when is_list(Config) ->
|
t_password_undefined(Config) when is_list(Config) ->
|
||||||
Payload = <<16, 19, 0, 4, 77, 81, 84, 84, 4, 130, 0, 60, 0, 2, 97, 49, 0, 3, 97, 97, 97>>,
|
Payload = <<16, 19, 0, 4, 77, 81, 84, 84, 4, 130, 0, 60, 0, 2, 97, 49, 0, 3, 97, 97, 97>>,
|
||||||
|
@ -198,7 +203,6 @@ t_password_undefined(Config) when is_list(Config) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
t_update_conf({init, Config}) ->
|
t_update_conf({init, Config}) ->
|
||||||
emqx_common_test_helpers:start_apps([emqx_conf, emqx_auth]),
|
|
||||||
emqx_authn_test_lib:register_fake_providers([
|
emqx_authn_test_lib:register_fake_providers([
|
||||||
{password_based, built_in_database},
|
{password_based, built_in_database},
|
||||||
{password_based, http},
|
{password_based, http},
|
||||||
|
@ -208,7 +212,6 @@ t_update_conf({init, Config}) ->
|
||||||
Config;
|
Config;
|
||||||
t_update_conf({'end', _Config}) ->
|
t_update_conf({'end', _Config}) ->
|
||||||
{ok, _} = emqx:update_config([authentication], []),
|
{ok, _} = emqx:update_config([authentication], []),
|
||||||
emqx_common_test_helpers:stop_apps([emqx_auth, emqx_conf]),
|
|
||||||
ok;
|
ok;
|
||||||
t_update_conf(Config) when is_list(Config) ->
|
t_update_conf(Config) when is_list(Config) ->
|
||||||
Authn1 = #{
|
Authn1 = #{
|
||||||
|
|
|
@ -36,4 +36,49 @@
|
||||||
|
|
||||||
-define(READONLY_KEYS, [cluster, rpc, node]).
|
-define(READONLY_KEYS, [cluster, rpc, node]).
|
||||||
|
|
||||||
|
-define(CE_AUTHZ_SOURCE_SCHEMA_MODS, [
|
||||||
|
emqx_authz_file_schema,
|
||||||
|
emqx_authz_mnesia_schema,
|
||||||
|
emqx_authz_http_schema,
|
||||||
|
emqx_authz_redis_schema,
|
||||||
|
emqx_authz_mysql_schema,
|
||||||
|
emqx_authz_postgresql_schema,
|
||||||
|
emqx_authz_mongodb_schema
|
||||||
|
]).
|
||||||
|
|
||||||
|
-define(EE_AUTHZ_SOURCE_SCHEMA_MODS, [
|
||||||
|
emqx_authz_ldap_schema
|
||||||
|
]).
|
||||||
|
|
||||||
|
-define(CE_AUTHN_PROVIDER_SCHEMA_MODS, [
|
||||||
|
emqx_authn_mnesia_schema,
|
||||||
|
emqx_authn_mysql_schema,
|
||||||
|
emqx_authn_postgresql_schema,
|
||||||
|
emqx_authn_mongodb_schema,
|
||||||
|
emqx_authn_redis_schema,
|
||||||
|
emqx_authn_http_schema,
|
||||||
|
emqx_authn_jwt_schema,
|
||||||
|
emqx_authn_scram_mnesia_schema
|
||||||
|
]).
|
||||||
|
|
||||||
|
-define(EE_AUTHN_PROVIDER_SCHEMA_MODS, [
|
||||||
|
emqx_authn_ldap_schema,
|
||||||
|
emqx_authn_ldap_bind_schema,
|
||||||
|
emqx_gcp_device_authn_schema
|
||||||
|
]).
|
||||||
|
|
||||||
|
-if(?EMQX_RELEASE_EDITION == ee).
|
||||||
|
|
||||||
|
-define(AUTHZ_SOURCE_SCHEMA_MODS, ?CE_AUTHZ_SOURCE_SCHEMA_MODS ++ ?EE_AUTHZ_SOURCE_SCHEMA_MODS).
|
||||||
|
-define(AUTHN_PROVIDER_SCHEMA_MODS,
|
||||||
|
(?CE_AUTHN_PROVIDER_SCHEMA_MODS ++ ?EE_AUTHN_PROVIDER_SCHEMA_MODS)
|
||||||
|
).
|
||||||
|
|
||||||
|
-else.
|
||||||
|
|
||||||
|
-define(AUTHZ_SOURCE_SCHEMA_MODS, ?CE_AUTHZ_SOURCE_SCHEMA_MODS).
|
||||||
|
-define(AUTHN_PROVIDER_SCHEMA_MODS, ?CE_AUTHN_PROVIDER_SCHEMA_MODS).
|
||||||
|
|
||||||
|
-endif.
|
||||||
|
|
||||||
-endif.
|
-endif.
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
-include_lib("typerefl/include/types.hrl").
|
-include_lib("typerefl/include/types.hrl").
|
||||||
-include_lib("hocon/include/hoconsc.hrl").
|
-include_lib("hocon/include/hoconsc.hrl").
|
||||||
|
|
||||||
|
-include("emqx_conf.hrl").
|
||||||
|
|
||||||
-type log_level() :: debug | info | notice | warning | error | critical | alert | emergency | all.
|
-type log_level() :: debug | info | notice | warning | error | critical | alert | emergency | all.
|
||||||
-type file() :: string().
|
-type file() :: string().
|
||||||
-type cipher() :: map().
|
-type cipher() :: map().
|
||||||
|
@ -70,8 +72,8 @@
|
||||||
emqx_mgmt_api_key_schema
|
emqx_mgmt_api_key_schema
|
||||||
]).
|
]).
|
||||||
-define(INJECTING_CONFIGS, [
|
-define(INJECTING_CONFIGS, [
|
||||||
emqx_authn_schema,
|
{emqx_authn_schema, ?AUTHN_PROVIDER_SCHEMA_MODS},
|
||||||
emqx_authz_schema
|
{emqx_authz_schema, ?AUTHZ_SOURCE_SCHEMA_MODS}
|
||||||
]).
|
]).
|
||||||
|
|
||||||
%% 1 million default ports counter
|
%% 1 million default ports counter
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
).
|
).
|
||||||
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
-include_lib("common_test/include/ct.hrl").
|
||||||
-include_lib("emqx/include/emqx.hrl").
|
-include_lib("emqx/include/emqx.hrl").
|
||||||
-include("emqx_dashboard.hrl").
|
-include("emqx_dashboard.hrl").
|
||||||
|
|
||||||
|
@ -59,11 +60,20 @@ init_per_suite(Config) ->
|
||||||
Apps = emqx_machine_boot:reboot_apps(),
|
Apps = emqx_machine_boot:reboot_apps(),
|
||||||
ct:pal("load apps:~p~n", [Apps]),
|
ct:pal("load apps:~p~n", [Apps]),
|
||||||
lists:foreach(fun(App) -> application:load(App) end, Apps),
|
lists:foreach(fun(App) -> application:load(App) end, Apps),
|
||||||
emqx_mgmt_api_test_util:init_suite([emqx_management]),
|
SuiteApps = emqx_cth_suite:start(
|
||||||
Config.
|
[
|
||||||
|
emqx_conf,
|
||||||
|
emqx_management,
|
||||||
|
{emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"}
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
||||||
|
),
|
||||||
|
emqx_common_test_http:create_default_app(),
|
||||||
|
[{suite_apps, SuiteApps} | Config].
|
||||||
|
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(Config) ->
|
||||||
emqx_mgmt_api_test_util:end_suite([emqx_management]).
|
emqx_common_test_http:delete_default_app(),
|
||||||
|
emqx_cth_suite:stop(?config(suite_apps, Config)).
|
||||||
|
|
||||||
t_overview(_) ->
|
t_overview(_) ->
|
||||||
mnesia:clear_table(?ADMIN),
|
mnesia:clear_table(?ADMIN),
|
||||||
|
|
|
@ -381,6 +381,6 @@ params_fuzzy_in_qs() ->
|
||||||
|
|
||||||
schema_authn() ->
|
schema_authn() ->
|
||||||
emqx_dashboard_swagger:schema_with_examples(
|
emqx_dashboard_swagger:schema_with_examples(
|
||||||
emqx_authn_schema:authenticator_type_without_scram(),
|
emqx_authn_schema:authenticator_type_without([emqx_authn_scram_mnesia_schema]),
|
||||||
emqx_authn_api:authenticator_examples()
|
emqx_authn_api:authenticator_examples()
|
||||||
).
|
).
|
||||||
|
|
|
@ -31,15 +31,22 @@
|
||||||
|
|
||||||
all() -> emqx_common_test_helpers:all(?MODULE).
|
all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
init_per_suite(Conf) ->
|
init_per_suite(Config) ->
|
||||||
emqx_config:erase(gateway),
|
|
||||||
emqx_gateway_test_utils:load_all_gateway_apps(),
|
emqx_gateway_test_utils:load_all_gateway_apps(),
|
||||||
emqx_common_test_helpers:load_config(emqx_gateway_schema, ?CONF_DEFAULT),
|
Apps = emqx_cth_suite:start(
|
||||||
emqx_common_test_helpers:start_apps([emqx_auth, emqx_auth_redis, emqx_auth_mnesia, emqx_gateway]),
|
[
|
||||||
Conf.
|
{emqx_conf, ?CONF_DEFAULT},
|
||||||
|
emqx_gateway,
|
||||||
|
emqx_auth,
|
||||||
|
emqx_auth_redis,
|
||||||
|
emqx_auth_mnesia
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
||||||
|
),
|
||||||
|
[{suite_apps, Apps} | Config].
|
||||||
|
|
||||||
end_per_suite(_Conf) ->
|
end_per_suite(Config) ->
|
||||||
emqx_common_test_helpers:stop_apps([emqx_gateway, emqx_auth_mnesia, emqx_auth_redis, emqx_auth]),
|
emqx_cth_suite:stop(?config(suite_apps, Config)),
|
||||||
emqx_config:delete_override_conf_files(),
|
emqx_config:delete_override_conf_files(),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
|
|
@ -57,13 +57,23 @@ all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
application:load(emqx_gateway_coap),
|
application:load(emqx_gateway_coap),
|
||||||
ok = emqx_common_test_helpers:load_config(emqx_gateway_schema, ?CONF_DEFAULT),
|
Apps = emqx_cth_suite:start(
|
||||||
emqx_mgmt_api_test_util:init_suite([emqx_conf, emqx_auth, emqx_gateway]),
|
[
|
||||||
Config.
|
{emqx_conf, ?CONF_DEFAULT},
|
||||||
|
emqx_gateway,
|
||||||
|
emqx_auth,
|
||||||
|
emqx_management,
|
||||||
|
{emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"}
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
||||||
|
),
|
||||||
|
emqx_common_test_http:create_default_app(),
|
||||||
|
[{suite_apps, Apps} | Config].
|
||||||
|
|
||||||
end_per_suite(_) ->
|
end_per_suite(Config) ->
|
||||||
{ok, _} = emqx:remove_config([<<"gateway">>, <<"coap">>]),
|
emqx_cth_suite:stop(?config(suite_apps, Config)),
|
||||||
emqx_mgmt_api_test_util:end_suite([emqx_gateway, emqx_auth, emqx_conf]).
|
emqx_config:delete_override_conf_files(),
|
||||||
|
ok.
|
||||||
|
|
||||||
init_per_testcase(t_connection_with_authn_failed, Config) ->
|
init_per_testcase(t_connection_with_authn_failed, Config) ->
|
||||||
ok = meck:new(emqx_access_control, [passthrough]),
|
ok = meck:new(emqx_access_control, [passthrough]),
|
||||||
|
|
|
@ -97,14 +97,23 @@ all() ->
|
||||||
emqx_common_test_helpers:all(?MODULE).
|
emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
application:load(emqx_gateway_mqttsn),
|
Apps = emqx_cth_suite:start(
|
||||||
ok = emqx_common_test_helpers:load_config(emqx_gateway_schema, ?CONF_DEFAULT),
|
[
|
||||||
emqx_mgmt_api_test_util:init_suite([emqx_conf, emqx_auth, emqx_gateway]),
|
{emqx_conf, ?CONF_DEFAULT},
|
||||||
Config.
|
emqx_gateway,
|
||||||
|
emqx_auth,
|
||||||
|
emqx_management,
|
||||||
|
{emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"}
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
||||||
|
),
|
||||||
|
emqx_common_test_http:create_default_app(),
|
||||||
|
[{suite_apps, Apps} | Config].
|
||||||
|
|
||||||
end_per_suite(_) ->
|
end_per_suite(Config) ->
|
||||||
{ok, _} = emqx:remove_config([gateway, mqttsn]),
|
{ok, _} = emqx:remove_config([gateway, mqttsn]),
|
||||||
emqx_mgmt_api_test_util:end_suite([emqx_gateway, emqx_auth, emqx_conf]).
|
emqx_common_test_http:delete_default_app(),
|
||||||
|
emqx_cth_suite:stop(?config(suite_apps, Config)).
|
||||||
|
|
||||||
restart_mqttsn_with_subs_resume_on() ->
|
restart_mqttsn_with_subs_resume_on() ->
|
||||||
Conf = emqx:get_raw_config([gateway, mqttsn]),
|
Conf = emqx:get_raw_config([gateway, mqttsn]),
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
-module(emqx_stomp_SUITE).
|
-module(emqx_stomp_SUITE).
|
||||||
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
-include_lib("common_test/include/ct.hrl").
|
||||||
-include("emqx_stomp.hrl").
|
-include("emqx_stomp.hrl").
|
||||||
|
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
|
@ -57,14 +58,24 @@ all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
%% Setups
|
%% Setups
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
init_per_suite(Cfg) ->
|
init_per_suite(Config) ->
|
||||||
application:load(emqx_gateway_stomp),
|
application:load(emqx_gateway_stomp),
|
||||||
ok = emqx_common_test_helpers:load_config(emqx_gateway_schema, ?CONF_DEFAULT),
|
Apps = emqx_cth_suite:start(
|
||||||
emqx_mgmt_api_test_util:init_suite([emqx_conf, emqx_auth, emqx_gateway]),
|
[
|
||||||
Cfg.
|
{emqx_conf, ?CONF_DEFAULT},
|
||||||
|
emqx_gateway,
|
||||||
|
emqx_auth,
|
||||||
|
emqx_management,
|
||||||
|
{emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"}
|
||||||
|
],
|
||||||
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
||||||
|
),
|
||||||
|
emqx_common_test_http:create_default_app(),
|
||||||
|
[{suite_apps, Apps} | Config].
|
||||||
|
|
||||||
end_per_suite(_Cfg) ->
|
end_per_suite(Config) ->
|
||||||
emqx_mgmt_api_test_util:end_suite([emqx_gateway, emqx_auth, emqx_conf]),
|
emqx_common_test_http:delete_default_app(),
|
||||||
|
emqx_cth_suite:stop(?config(suite_apps, Config)),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
default_config() ->
|
default_config() ->
|
||||||
|
|
Loading…
Reference in New Issue