fix(rule): connection test when creating a resource

This commit is contained in:
DDDHuang 2022-03-24 10:39:54 +08:00
parent 0a63de9277
commit c3237b6281
3 changed files with 44 additions and 15 deletions

View File

@ -1,6 +1,6 @@
{application, emqx_rule_engine, {application, emqx_rule_engine,
[{description, "EMQ X Rule Engine"}, [{description, "EMQ X Rule Engine"},
{vsn, "4.3.8"}, % strict semver, bump manually! {vsn, "4.3.9"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, [emqx_rule_engine_sup, emqx_rule_registry]}, {registered, [emqx_rule_engine_sup, emqx_rule_registry]},
{applications, [kernel,stdlib,rulesql,getopt]}, {applications, [kernel,stdlib,rulesql,getopt]},

View File

@ -1,7 +1,9 @@
%% -*- 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.3.7", [{"4.3.8",
[{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
{"4.3.7",
[{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, [{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
@ -78,7 +80,9 @@
{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.3.7", [{"4.3.8",
[{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}]},
{"4.3.7",
[{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, [{load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]},
{load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},

View File

@ -314,24 +314,49 @@ start_resource(ResId) ->
end. end.
-spec(test_resource(#{type := _, config := _, _ => _}) -> ok | {error, Reason :: term()}). -spec(test_resource(#{type := _, config := _, _ => _}) -> ok | {error, Reason :: term()}).
test_resource(#{type := Type, config := Config0}) -> test_resource(#{type := Type} = Params) ->
case emqx_rule_registry:find_resource_type(Type) of case emqx_rule_registry:find_resource_type(Type) of
{ok, #resource_type{on_create = {ModC, Create}, {ok, #resource_type{}} ->
on_destroy = {ModD, Destroy}, ResId = maps:get(id, Params, resource_id()),
params_spec = ParamSpec}} -> CreateFun = fun() -> _ = create_resource(Params) end,
Config = emqx_rule_validator:validate_params(Config0, ParamSpec), StatusFun =
ResId = resource_id(), fun() ->
try case get_resource_status(ResId) of
_ = ?CLUSTER_CALL(init_resource, [ModC, Create, ResId, Config]), {ok, #{is_alive := true}} ->
_ = ?CLUSTER_CALL(clear_resource, [ModD, Destroy, ResId]), ignore;
ok {ok, #{is_alive := false}} ->
catch error(not_alive);
throw:Reason -> {error, Reason} {error, R} ->
error(R)
end
end,
DeleteFun = fun() -> _ = ?CLUSTER_CALL(delete_resource, [ResId]) end,
case
%% create error or status failed
(ok == safe_test_resource(CreateFun, create_resource))
andalso
safe_test_resource(StatusFun, get_resource_status)
of
ok ->
_ = safe_test_resource(DeleteFun, delete_resource),
ok;
_ ->
_ = safe_test_resource(DeleteFun, delete_resource),
{error, {resource_error, not_available}}
end; end;
not_found -> not_found ->
{error, {resource_type_not_found, Type}} {error, {resource_type_not_found, Type}}
end. end.
safe_test_resource(Fun, ErrorLogInfo) ->
try
_ = Fun(),
ok
catch E:R:S ->
?LOG(warning, "safe exec fun error, ~0p, ~0p:~0p ~0p", [ErrorLogInfo, E, R, S]),
{error, R}
end.
-spec(get_resource_status(resource_id()) -> {ok, resource_status()} | {error, Reason :: term()}). -spec(get_resource_status(resource_id()) -> {ok, resource_status()} | {error, Reason :: term()}).
get_resource_status(ResId) -> get_resource_status(ResId) ->
case emqx_rule_registry:find_resource_params(ResId) of case emqx_rule_registry:find_resource_params(ResId) of