fix: plugin's internal config api

This commit is contained in:
JimMoen 2024-04-26 11:49:12 +08:00
parent 11389bc086
commit 00cab33fde
No known key found for this signature in database
2 changed files with 30 additions and 13 deletions

View File

@ -488,7 +488,7 @@ update_plugin(put, #{bindings := #{name := Name, action := Action}}) ->
plugin_config(get, #{bindings := #{name := NameVsn}}) -> plugin_config(get, #{bindings := #{name := NameVsn}}) ->
case emqx_plugins:describe(NameVsn) of case emqx_plugins:describe(NameVsn) of
{ok, _} -> {ok, _} ->
case emqx_plugins:get_plugin_config(NameVsn, #{format => ?CONFIG_FORMAT_MAP}) of case emqx_plugins:get_plugin_config(NameVsn) of
{ok, AvroJson} -> {ok, AvroJson} ->
{200, #{<<"content-type">> => <<"'application/json'">>}, AvroJson}; {200, #{<<"content-type">> => <<"'application/json'">>}, AvroJson};
{error, _} -> {error, _} ->
@ -503,8 +503,7 @@ plugin_config(get, #{bindings := #{name := NameVsn}}) ->
plugin_config(put, #{bindings := #{name := NameVsn}, body := AvroJsonMap}) -> plugin_config(put, #{bindings := #{name := NameVsn}, body := AvroJsonMap}) ->
case emqx_plugins:describe(NameVsn) of case emqx_plugins:describe(NameVsn) of
{ok, _} -> {ok, _} ->
AvroJsonBin = emqx_utils_json:encode(AvroJsonMap), case emqx_plugins:decode_plugin_avro_config(NameVsn, AvroJsonMap) of
case emqx_plugins:decode_plugin_avro_config(NameVsn, AvroJsonBin) of
{ok, AvroValueConfig} -> {ok, AvroValueConfig} ->
Nodes = emqx:running_nodes(), Nodes = emqx:running_nodes(),
%% cluster call with config in map (binary key-value) %% cluster call with config in map (binary key-value)

View File

@ -28,7 +28,8 @@
plugin_avsc/1, plugin_avsc/1,
plugin_i18n/1, plugin_i18n/1,
plugin_avro/1, plugin_avro/1,
parse_name_vsn/1 parse_name_vsn/1,
make_name_vsn_string/2
]). ]).
%% Package operations %% Package operations
@ -49,19 +50,22 @@
ensure_started/1, ensure_started/1,
ensure_stopped/0, ensure_stopped/0,
ensure_stopped/1, ensure_stopped/1,
get_plugin_config/1,
get_plugin_config/2,
put_plugin_config/3,
restart/1, restart/1,
list/0 list/0
]). ]).
%% Plugin config APIs
-export([
get_plugin_config/1,
get_plugin_config/2,
get_plugin_config/3,
get_plugin_config/4,
put_plugin_config/3
]).
%% Package utils %% Package utils
-export([ -export([
decode_plugin_avro_config/2, decode_plugin_avro_config/2,
get_config/2,
put_config/2,
get_tar/1,
install_dir/0, install_dir/0,
avsc_file_path/1 avsc_file_path/1
]). ]).
@ -73,6 +77,8 @@
%% Internal export %% Internal export
-export([do_ensure_started/1]). -export([do_ensure_started/1]).
%% for test cases
-export([put_config/2]).
-ifdef(TEST). -ifdef(TEST).
-compile(export_all). -compile(export_all).
@ -124,6 +130,9 @@ parse_name_vsn(NameVsn) when is_list(NameVsn) ->
_ -> {error, "bad_name_vsn"} _ -> {error, "bad_name_vsn"}
end. end.
make_name_vsn_string(Name, Vsn) ->
binary_to_list(iolist_to_binary([Name, "-", Vsn])).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Package operations %% Package operations
@ -246,21 +255,30 @@ ensure_stopped(NameVsn) ->
end end
). ).
get_plugin_config(Name, Vsn, Options, Default) ->
get_plugin_config(make_name_vsn_string(Name, Vsn), Options, Default).
-spec get_plugin_config(name_vsn()) -> -spec get_plugin_config(name_vsn()) ->
{ok, plugin_config()} | {error, term()}. {ok, plugin_config()}
| {error, term()}.
get_plugin_config(NameVsn) -> get_plugin_config(NameVsn) ->
get_plugin_config(bin(NameVsn), #{format => ?CONFIG_FORMAT_MAP}). get_plugin_config(bin(NameVsn), #{format => ?CONFIG_FORMAT_MAP}).
-spec get_plugin_config(name_vsn(), Options :: map()) -> -spec get_plugin_config(name_vsn(), Options :: map()) ->
{ok, avro_binary() | plugin_config()} {ok, avro_binary() | plugin_config()}
| {error, term()}. | {error, term()}.
get_plugin_config(NameVsn, #{format := ?CONFIG_FORMAT_AVRO}) -> get_plugin_config(NameVsn, #{format := ?CONFIG_FORMAT_AVRO}) ->
%% no default value when get raw binary config
case read_plugin_avro(NameVsn) of case read_plugin_avro(NameVsn) of
{ok, _AvroJson} = Res -> Res; {ok, _AvroJson} = Res -> Res;
{error, _Reason} = Err -> Err {error, _Reason} = Err -> Err
end; end;
get_plugin_config(NameVsn, #{format := ?CONFIG_FORMAT_MAP}) -> get_plugin_config(NameVsn, Options = #{format := ?CONFIG_FORMAT_MAP}) ->
{ok, persistent_term:get(?PLUGIN_PERSIS_CONFIG_KEY(NameVsn), #{})}. get_plugin_config(NameVsn, Options, #{}).
get_plugin_config(NameVsn, #{format := ?CONFIG_FORMAT_MAP}, Default) ->
{ok, persistent_term:get(?PLUGIN_PERSIS_CONFIG_KEY(NameVsn), Default)}.
%% @doc Update plugin's config. %% @doc Update plugin's config.
%% RPC call from Management API or CLI. %% RPC call from Management API or CLI.