chore: sync changes from ee to ce
This commit is contained in:
parent
e3ed682e8d
commit
0c3de088cb
|
@ -153,8 +153,11 @@ init_per_group(_Group, Config) ->
|
||||||
|
|
||||||
end_per_group(resilience, Config) ->
|
end_per_group(resilience, Config) ->
|
||||||
OriginalServer = ?config(original_server, Config),
|
OriginalServer = ?config(original_server, Config),
|
||||||
|
ProxyHost = ?config(proxy_host, Config),
|
||||||
|
ProxyPort = ?config(proxy_port, Config),
|
||||||
application:set_env(emqx_auth_mongo, server, OriginalServer),
|
application:set_env(emqx_auth_mongo, server, OriginalServer),
|
||||||
emqx_ct_helpers:stop_apps([emqx_auth_mongo]),
|
emqx_ct_helpers:stop_apps([emqx_auth_mongo]),
|
||||||
|
reset_proxy(ProxyHost, ProxyPort),
|
||||||
emqx_ct_helpers:start_apps([emqx_auth_mongo], fun set_special_confs/1),
|
emqx_ct_helpers:start_apps([emqx_auth_mongo], fun set_special_confs/1),
|
||||||
ok;
|
ok;
|
||||||
end_per_group(_Group, _Config) ->
|
end_per_group(_Group, _Config) ->
|
||||||
|
|
|
@ -17,3 +17,4 @@
|
||||||
{load_module,emqx_auth_pgsql,brutal_purge,soft_purge,[]},
|
{load_module,emqx_auth_pgsql,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_auth_pgsql_app,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_auth_pgsql_app,brutal_purge,soft_purge,[]}]},
|
||||||
{<<".*">>,[]}]}.
|
{<<".*">>,[]}]}.
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
, call_fold/3
|
, call_fold/3
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
|
||||||
-elvis([{elvis_style, god_modules, disable}]).
|
-elvis([{elvis_style, god_modules, disable}]).
|
||||||
|
|
||||||
-define(STOP_OR_OK(Res),
|
-define(STOP_OR_OK(Res),
|
||||||
|
|
|
@ -34,8 +34,9 @@ init([Env]) ->
|
||||||
type => worker,
|
type => worker,
|
||||||
modules => [emqx_retainer]} || not is_managed_by_modules()]}}.
|
modules => [emqx_retainer]} || not is_managed_by_modules()]}}.
|
||||||
|
|
||||||
-ifdef(EMQX_ENTERPRISE).
|
%% This function is added to enterprise branch only.
|
||||||
|
%% In enterprise edition, the retainer worker may start under modules supervisor
|
||||||
|
%% so we should avoid starting it under the application root supervisor.
|
||||||
is_managed_by_modules() ->
|
is_managed_by_modules() ->
|
||||||
try
|
try
|
||||||
case supervisor:get_childspec(emqx_modules_sup, emqx_retainer) of
|
case supervisor:get_childspec(emqx_modules_sup, emqx_retainer) of
|
||||||
|
@ -46,11 +47,3 @@ is_managed_by_modules() ->
|
||||||
exit : {noproc, _} ->
|
exit : {noproc, _} ->
|
||||||
false
|
false
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-else.
|
|
||||||
|
|
||||||
is_managed_by_modules() ->
|
|
||||||
%% always false for opensource edition
|
|
||||||
false.
|
|
||||||
|
|
||||||
-endif.
|
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
%% -*- mode: erlang -*-
|
%% -*- mode: erlang -*-
|
||||||
%% Unless you know what you are doing, DO NOT edit manually!!
|
%% Unless you know what you are doing, DO NOT edit manually!!
|
||||||
{VSN,
|
{VSN,
|
||||||
[{"4.4.11",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]},
|
[{"4.4.11",[
|
||||||
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
||||||
|
]},
|
||||||
{"4.4.10",
|
{"4.4.10",
|
||||||
[{add_module,emqx_rule_engine_jwt},
|
[{add_module,emqx_rule_engine_jwt},
|
||||||
{add_module,emqx_rule_engine_jwt_worker},
|
{add_module,emqx_rule_engine_jwt_worker},
|
||||||
|
@ -197,7 +200,10 @@
|
||||||
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
|
||||||
{<<".*">>,[]}],
|
{<<".*">>,[]}],
|
||||||
[{"4.4.11",[{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}]},
|
[{"4.4.11",[
|
||||||
|
{load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
|
||||||
|
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
|
||||||
|
]},
|
||||||
{"4.4.10",
|
{"4.4.10",
|
||||||
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]},
|
||||||
|
|
|
@ -195,8 +195,6 @@ create_rule(Params = #{rawsql := Sql, actions := ActArgs}) ->
|
||||||
{ok, Select} ->
|
{ok, Select} ->
|
||||||
RuleId = maps:get(id, Params, rule_id()),
|
RuleId = maps:get(id, Params, rule_id()),
|
||||||
Enabled = maps:get(enabled, Params, true),
|
Enabled = maps:get(enabled, Params, true),
|
||||||
try prepare_actions(ActArgs, Enabled) of
|
|
||||||
Actions ->
|
|
||||||
Rule = #rule{
|
Rule = #rule{
|
||||||
id = RuleId,
|
id = RuleId,
|
||||||
rawsql = Sql,
|
rawsql = Sql,
|
||||||
|
@ -207,22 +205,31 @@ create_rule(Params = #{rawsql := Sql, actions := ActArgs}) ->
|
||||||
incase = emqx_rule_sqlparser:select_incase(Select),
|
incase = emqx_rule_sqlparser:select_incase(Select),
|
||||||
conditions = emqx_rule_sqlparser:select_where(Select),
|
conditions = emqx_rule_sqlparser:select_where(Select),
|
||||||
on_action_failed = maps:get(on_action_failed, Params, continue),
|
on_action_failed = maps:get(on_action_failed, Params, continue),
|
||||||
actions = Actions,
|
actions = [],
|
||||||
enabled = Enabled,
|
enabled = Enabled,
|
||||||
created_at = erlang:system_time(millisecond),
|
created_at = erlang:system_time(millisecond),
|
||||||
description = maps:get(description, Params, ""),
|
description = maps:get(description, Params, ""),
|
||||||
state = normal
|
state = normal
|
||||||
},
|
},
|
||||||
|
do_create_rule(Rule, ActArgs);
|
||||||
|
Reason -> {error, Reason}
|
||||||
|
end.
|
||||||
|
|
||||||
|
do_create_rule(Rule0 = #rule{id = RuleId, enabled = Enabled}, ActArgs) ->
|
||||||
|
try prepare_actions(ActArgs, Enabled) of
|
||||||
|
Actions ->
|
||||||
|
Rule = Rule0#rule{actions = Actions},
|
||||||
ok = emqx_rule_registry:add_rule(Rule),
|
ok = emqx_rule_registry:add_rule(Rule),
|
||||||
ok = emqx_rule_metrics:create_rule_metrics(RuleId),
|
ok = emqx_rule_metrics:create_rule_metrics(RuleId),
|
||||||
{ok, Rule}
|
{ok, Rule}
|
||||||
catch
|
catch
|
||||||
|
throw:{resource_not_initialized, _} when Enabled =:= true ->
|
||||||
|
%% try again with rule disabled
|
||||||
|
do_create_rule(Rule0#rule{enabled = false}, ActArgs);
|
||||||
throw:{action_not_found, ActionName} ->
|
throw:{action_not_found, ActionName} ->
|
||||||
{error, {action_not_found, ActionName}};
|
{error, {action_not_found, ActionName}};
|
||||||
throw:Reason ->
|
throw:Reason ->
|
||||||
{error, Reason}
|
{error, Reason}
|
||||||
end;
|
|
||||||
Reason -> {error, Reason}
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec(update_rule(#{id := binary(), _=>_}) -> {ok, rule()} | {error, {not_found, rule_id()} | term()}).
|
-spec(update_rule(#{id := binary(), _=>_}) -> {ok, rule()} | {error, {not_found, rule_id()} | term()}).
|
||||||
|
|
|
@ -25,15 +25,19 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
-include_lib("common_test/include/ct.hrl").
|
-include_lib("common_test/include/ct.hrl").
|
||||||
|
|
||||||
-include("emqx_rule_test.hrl").
|
|
||||||
-import(emqx_rule_test_lib, [make_simple_resource_type/1]).
|
|
||||||
|
|
||||||
%% API request funcs
|
|
||||||
-import(emqx_rule_test_lib,
|
-import(emqx_rule_test_lib,
|
||||||
[ request_api/4
|
[ request_api/4
|
||||||
, request_api/5
|
, request_api/5
|
||||||
, auth_header_/0
|
, auth_header_/0
|
||||||
, api_path/1
|
, api_path/1
|
||||||
|
, stop_apps/0
|
||||||
|
, start_apps/0
|
||||||
|
, create_simple_repub_rule/2
|
||||||
|
, create_simple_repub_rule/3
|
||||||
|
, make_simple_debug_resource_type/0
|
||||||
|
, make_simple_resource_type/1
|
||||||
|
, make_bad_resource_type/0
|
||||||
|
, init_events_counters/0
|
||||||
]).
|
]).
|
||||||
|
|
||||||
%%-define(PROPTEST(M,F), true = proper:quickcheck(M:F())).
|
%%-define(PROPTEST(M,F), true = proper:quickcheck(M:F())).
|
||||||
|
@ -63,6 +67,7 @@ groups() ->
|
||||||
t_reset_metrics,
|
t_reset_metrics,
|
||||||
t_reset_metrics_fallbacks,
|
t_reset_metrics_fallbacks,
|
||||||
t_create_resource,
|
t_create_resource,
|
||||||
|
t_create_rule_with_resource,
|
||||||
t_clean_resource_alarms
|
t_clean_resource_alarms
|
||||||
]},
|
]},
|
||||||
{actions, [],
|
{actions, [],
|
||||||
|
@ -310,6 +315,41 @@ t_create_resource(_Config) ->
|
||||||
emqx_rule_registry:remove_resource(ResId),
|
emqx_rule_registry:remove_resource(ResId),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
t_create_rule_with_resource(_) ->
|
||||||
|
emqx_rule_registry:register_resource_types([make_bad_resource_type()]),
|
||||||
|
ok = emqx_rule_engine:load_providers(),
|
||||||
|
{ok, #resource{id = BadResId}} = emqx_rule_engine:create_resource(
|
||||||
|
#{type => bad_resource,
|
||||||
|
config => #{},
|
||||||
|
description => <<"bad resource">>}),
|
||||||
|
{ok, #resource{id = GoodResId}} = emqx_rule_engine:create_resource(
|
||||||
|
#{type => built_in,
|
||||||
|
config => #{},
|
||||||
|
description => <<"bad resource">>}),
|
||||||
|
|
||||||
|
{ok, #rule{id = BadRuleId, enabled = Enabled}} = emqx_rule_engine:create_rule(
|
||||||
|
#{rawsql => "select clientid as c, username as u "
|
||||||
|
"from \"t1\" ",
|
||||||
|
actions => [#{name => 'inspect',
|
||||||
|
args => #{<<"$resource">> => BadResId, a=>1, b=>2}}],
|
||||||
|
description => <<"Inspect rule">>
|
||||||
|
}),
|
||||||
|
?assertEqual(false, Enabled),
|
||||||
|
|
||||||
|
{ok, #rule{id = GoodRuleId, enabled = Enabled1}} = emqx_rule_engine:create_rule(
|
||||||
|
#{rawsql => "select clientid as c, username as u "
|
||||||
|
"from \"t1\" ",
|
||||||
|
actions => [#{name => 'inspect',
|
||||||
|
args => #{<<"$resource">> => GoodResId, a=>1, b=>2}}],
|
||||||
|
description => <<"Inspect rule">>
|
||||||
|
}),
|
||||||
|
?assertEqual(true, Enabled1),
|
||||||
|
emqx_rule_registry:remove_rule(BadRuleId),
|
||||||
|
emqx_rule_registry:remove_rule(GoodRuleId),
|
||||||
|
emqx_rule_registry:remove_resource(BadResId),
|
||||||
|
emqx_rule_registry:remove_resource(GoodResId),
|
||||||
|
ok.
|
||||||
|
|
||||||
t_clean_resource_alarms(_Config) ->
|
t_clean_resource_alarms(_Config) ->
|
||||||
lists:foreach(fun(ResId) ->
|
lists:foreach(fun(ResId) ->
|
||||||
clean_resource_alarms(ResId)
|
clean_resource_alarms(ResId)
|
||||||
|
@ -350,8 +390,7 @@ t_inspect_action(_Config) ->
|
||||||
#{rawsql => "select clientid as c, username as u "
|
#{rawsql => "select clientid as c, username as u "
|
||||||
"from \"t1\" ",
|
"from \"t1\" ",
|
||||||
actions => [#{name => 'inspect',
|
actions => [#{name => 'inspect',
|
||||||
args => #{'$resource' => ResId, a=>1, b=>2}}],
|
args => #{<<"$resource">> => ResId, a=>1, b=>2}}],
|
||||||
type => built_in,
|
|
||||||
description => <<"Inspect rule">>
|
description => <<"Inspect rule">>
|
||||||
}),
|
}),
|
||||||
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
||||||
|
@ -369,7 +408,6 @@ t_reset_metrics(_Config) ->
|
||||||
#{rawsql => "select clientid as c, username as u "
|
#{rawsql => "select clientid as c, username as u "
|
||||||
"from \"t1\" ",
|
"from \"t1\" ",
|
||||||
actions => [#{name => 'inspect', args => #{a=>1, b=>2}}],
|
actions => [#{name => 'inspect', args => #{a=>1, b=>2}}],
|
||||||
type => built_in,
|
|
||||||
description => <<"Inspect rule">>
|
description => <<"Inspect rule">>
|
||||||
}),
|
}),
|
||||||
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
||||||
|
@ -414,7 +452,6 @@ t_reset_metrics_fallbacks(_Config) ->
|
||||||
#{name => 'inspect', args => #{}, fallbacks => []},
|
#{name => 'inspect', args => #{}, fallbacks => []},
|
||||||
#{name => 'inspect', args => #{}, fallbacks => []}
|
#{name => 'inspect', args => #{}, fallbacks => []}
|
||||||
]}],
|
]}],
|
||||||
type => built_in,
|
|
||||||
description => <<"Inspect rule">>
|
description => <<"Inspect rule">>
|
||||||
}),
|
}),
|
||||||
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
%% Copyright (c) 2020-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.
|
|
||||||
%%--------------------------------------------------------------------
|
|
||||||
|
|
||||||
%% Test Suite funcs
|
|
||||||
-import(emqx_rule_test_lib,
|
|
||||||
[ stop_apps/0
|
|
||||||
, start_apps/0
|
|
||||||
]).
|
|
||||||
|
|
||||||
%% RULE helper funcs
|
|
||||||
-import(emqx_rule_test_lib,
|
|
||||||
[ create_simple_repub_rule/2
|
|
||||||
, create_simple_repub_rule/3
|
|
||||||
, make_simple_debug_resource_type/0
|
|
||||||
, init_events_counters/0
|
|
||||||
]).
|
|
|
@ -125,6 +125,17 @@ make_simple_resource_type(ResTypeName) ->
|
||||||
title = #{en => <<"Simple Resource Type">>},
|
title = #{en => <<"Simple Resource Type">>},
|
||||||
description = #{en => <<"Simple Resource Type">>}}.
|
description = #{en => <<"Simple Resource Type">>}}.
|
||||||
|
|
||||||
|
make_bad_resource_type() ->
|
||||||
|
#resource_type{
|
||||||
|
name = bad_resource,
|
||||||
|
provider = ?APP,
|
||||||
|
params_spec = #{},
|
||||||
|
on_create = {?MODULE, on_bad_resource_type_create},
|
||||||
|
on_destroy = {?MODULE, on_bad_resource_type_destroy},
|
||||||
|
on_status = {?MODULE, on_bad_resource_type_status},
|
||||||
|
title = #{en => <<"Bad Resource Type">>},
|
||||||
|
description = #{en => <<"Bad Resource Type">>}}.
|
||||||
|
|
||||||
init_events_counters() ->
|
init_events_counters() ->
|
||||||
ets:new(events_record_tab, [named_table, bag, public]).
|
ets:new(events_record_tab, [named_table, bag, public]).
|
||||||
|
|
||||||
|
@ -200,3 +211,7 @@ on_get_resource_status(_id, _) -> #{is_alive => true}.
|
||||||
on_simple_resource_type_create(_Id, #{}) -> #{}.
|
on_simple_resource_type_create(_Id, #{}) -> #{}.
|
||||||
on_simple_resource_type_destroy(_Id, #{}) -> ok.
|
on_simple_resource_type_destroy(_Id, #{}) -> ok.
|
||||||
on_simple_resource_type_status(_Id, #{}, #{}) -> #{is_alive => true}.
|
on_simple_resource_type_status(_Id, #{}, #{}) -> #{is_alive => true}.
|
||||||
|
|
||||||
|
on_bad_resource_type_create(_Id, #{}) -> error(never_get_started).
|
||||||
|
on_bad_resource_type_destroy(_Id, #{}) -> ok.
|
||||||
|
on_bad_resource_type_status(_Id, #{}, #{}) -> #{is_alive => false}.
|
||||||
|
|
|
@ -26,7 +26,14 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
-include_lib("common_test/include/ct.hrl").
|
-include_lib("common_test/include/ct.hrl").
|
||||||
|
|
||||||
-include("emqx_rule_test.hrl").
|
-import(emqx_rule_test_lib,
|
||||||
|
[ stop_apps/0
|
||||||
|
, start_apps/0
|
||||||
|
, create_simple_repub_rule/2
|
||||||
|
, create_simple_repub_rule/3
|
||||||
|
, make_simple_debug_resource_type/0
|
||||||
|
, init_events_counters/0
|
||||||
|
]).
|
||||||
|
|
||||||
all() ->
|
all() ->
|
||||||
[ {group, rulesql_select}
|
[ {group, rulesql_select}
|
||||||
|
|
|
@ -8,18 +8,10 @@
|
||||||
{"4.3.4",
|
{"4.3.4",
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.3",
|
{<<"4\\.3\\.[1-3]">>,
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.2",
|
|
||||||
[{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.3.1",
|
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.3.0",
|
{"4.3.0",
|
||||||
[{restart_application,emqx_stomp},
|
[{restart_application,emqx_stomp},
|
||||||
{apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]},
|
{apply,{emqx_stomp,force_clear_after_app_stoped,[]}}]},
|
||||||
|
@ -31,17 +23,9 @@
|
||||||
{"4.3.4",
|
{"4.3.4",
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.3",
|
{<<"4\\.3\\.[1-3]">>,
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
||||||
{"4.3.2",
|
|
||||||
[{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.3.1",
|
|
||||||
[{load_module,emqx_stomp_protocol,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_frame,brutal_purge,soft_purge,[]},
|
|
||||||
{load_module,emqx_stomp_connection,brutal_purge,soft_purge,[]}]},
|
|
||||||
{"4.3.0",[{restart_application,emqx_stomp}]},
|
{"4.3.0",[{restart_application,emqx_stomp}]},
|
||||||
{<<".*">>,[]}]}.
|
{<<".*">>,[]}]}.
|
||||||
|
|
Loading…
Reference in New Issue