fix(rule): connection test when creating a resource
This commit is contained in:
parent
0a63de9277
commit
c3237b6281
|
@ -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]},
|
||||||
|
|
|
@ -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,[]},
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue