|
|
@@ -329,10 +329,11 @@ get_config_bin(NameVsn) ->
|
|
|
|
|
|
%% @doc Update plugin's config.
|
|
|
%% RPC call from Management API or CLI.
|
|
|
-%% the plugin config Json Map and plugin config ALWAYS be valid before calling this function.
|
|
|
-put_config(NameVsn, ConfigJsonMap, DecodedPluginConfig) when not is_binary(NameVsn) ->
|
|
|
- put_config(bin(NameVsn), ConfigJsonMap, DecodedPluginConfig);
|
|
|
-put_config(NameVsn, ConfigJsonMap, _DecodedPluginConfig) ->
|
|
|
+%% The plugin config Json Map was valid by avro schema
|
|
|
+%% Or: if no and plugin config ALWAYS be valid before calling this function.
|
|
|
+put_config(NameVsn, ConfigJsonMap, AvroValue) when not is_binary(NameVsn) ->
|
|
|
+ put_config(bin(NameVsn), ConfigJsonMap, AvroValue);
|
|
|
+put_config(NameVsn, ConfigJsonMap, _AvroValue) ->
|
|
|
HoconBin = hocon_pp:do(ConfigJsonMap, #{}),
|
|
|
ok = backup_and_write_hocon_bin(NameVsn, HoconBin),
|
|
|
%% TODO: callback in plugin's on_config_changed (config update by mgmt API)
|
|
|
@@ -370,10 +371,30 @@ list() ->
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Package utils
|
|
|
|
|
|
--spec decode_plugin_config_map(name_vsn(), map() | binary()) -> {ok, map()} | {error, any()}.
|
|
|
-decode_plugin_config_map(NameVsn, AvroJsonMap) when is_map(AvroJsonMap) ->
|
|
|
- decode_plugin_config_map(NameVsn, emqx_utils_json:encode(AvroJsonMap));
|
|
|
-decode_plugin_config_map(NameVsn, AvroJsonBin) ->
|
|
|
+-spec decode_plugin_config_map(name_vsn(), map() | binary()) ->
|
|
|
+ {ok, map() | ?plugin_without_config_schema}
|
|
|
+ | {error, any()}.
|
|
|
+decode_plugin_config_map(NameVsn, AvroJsonMap) ->
|
|
|
+ case with_plugin_avsc(NameVsn) of
|
|
|
+ true ->
|
|
|
+ case emqx_plugins_serde:lookup_serde(NameVsn) of
|
|
|
+ {error, not_found} ->
|
|
|
+ Reason = "plugin_config_schema_serde_not_found",
|
|
|
+ ?SLOG(error, #{
|
|
|
+ msg => Reason, name_vsn => NameVsn, plugin_with_avro_schema => true
|
|
|
+ }),
|
|
|
+ {error, Reason};
|
|
|
+ {ok, _Serde} ->
|
|
|
+ do_decode_plugin_config_map(NameVsn, AvroJsonMap)
|
|
|
+ end;
|
|
|
+ false ->
|
|
|
+ ?SLOG(debug, #{name_vsn => NameVsn, plugin_with_avro_schema => false}),
|
|
|
+ {ok, ?plugin_without_config_schema}
|
|
|
+ end.
|
|
|
+
|
|
|
+do_decode_plugin_config_map(NameVsn, AvroJsonMap) when is_map(AvroJsonMap) ->
|
|
|
+ do_decode_plugin_config_map(NameVsn, emqx_utils_json:encode(AvroJsonMap));
|
|
|
+do_decode_plugin_config_map(NameVsn, AvroJsonBin) ->
|
|
|
case emqx_plugins_serde:decode(NameVsn, AvroJsonBin) of
|
|
|
{ok, Config} -> {ok, Config};
|
|
|
{error, ReasonMap} -> {error, ReasonMap}
|
|
|
@@ -1205,14 +1226,15 @@ cp_default_config_file(NameVsn) ->
|
|
|
end.
|
|
|
|
|
|
ensure_config_map(NameVsn) ->
|
|
|
- with_plugin_avsc(NameVsn) andalso
|
|
|
- do_ensure_config_map(NameVsn).
|
|
|
-
|
|
|
-do_ensure_config_map(NameVsn) ->
|
|
|
case read_plugin_hocon(NameVsn, #{read_mode => ?JSON_MAP}) of
|
|
|
{ok, ConfigJsonMap} ->
|
|
|
- {ok, Config} = decode_plugin_config_map(NameVsn, ConfigJsonMap),
|
|
|
- put_config(NameVsn, ConfigJsonMap, Config);
|
|
|
+ case with_plugin_avsc(NameVsn) of
|
|
|
+ true ->
|
|
|
+ {ok, AvroValue} = decode_plugin_config_map(NameVsn, ConfigJsonMap),
|
|
|
+ put_config(NameVsn, ConfigJsonMap, AvroValue);
|
|
|
+ false ->
|
|
|
+ put_config(NameVsn, ConfigJsonMap, ?plugin_without_config_schema)
|
|
|
+ end;
|
|
|
_ ->
|
|
|
?SLOG(warning, #{msg => "failed_to_read_plugin_config_hocon", name_vsn => NameVsn}),
|
|
|
ok
|