refactor: only apply environment variables on base config

This commit is contained in:
Zaiming (Stone) Shi 2021-12-03 20:46:45 +01:00
parent a681079ba7
commit 5525cb3262
2 changed files with 25 additions and 16 deletions

View File

@ -270,28 +270,37 @@ init_load(SchemaMod, Conf) when is_list(Conf) orelse is_binary(Conf) ->
end; end;
init_load(SchemaMod, RawConf) when is_map(RawConf) -> init_load(SchemaMod, RawConf) when is_map(RawConf) ->
ok = save_schema_mod_and_names(SchemaMod), ok = save_schema_mod_and_names(SchemaMod),
%% check and save configs %% check configs agains the schema, with environment variables applied on top
{_AppEnvs, CheckedConf} = check_config(SchemaMod, RawConf), {_AppEnvs, CheckedConf} =
check_config(SchemaMod, RawConf, #{apply_override_envs => true}),
%% fill default values for raw config %% fill default values for raw config
Opts = #{only_fill_defaults => true, RawConfWithEnvs = merge_envs(SchemaMod, RawConf),
logger => fun(_, _) -> ok end, %% everything should have been logged already
nullable => true %% TODO: evil, remove, nullable should be declared in schema
},
RawConfWithDefaults = hocon_schema:check_plain(SchemaMod, RawConf, Opts),
RootNames = get_root_names(), RootNames = get_root_names(),
ok = save_to_config_map(maps:with(get_atom_root_names(), CheckedConf), ok = save_to_config_map(maps:with(get_atom_root_names(), CheckedConf),
maps:with(RootNames, RawConfWithDefaults)). maps:with(RootNames, RawConfWithEnvs)).
include_dirs() -> include_dirs() ->
[filename:join(emqx:data_dir(), "configs")]. [filename:join(emqx:data_dir(), "configs")].
merge_envs(SchemaMod, RawConf) ->
Opts = #{logger => fun(_, _) -> ok end, %% everything should have been logged already when check_config
nullable => true, %% TODO: evil, remove, nullable should be declared in schema
format => map,
apply_override_envs => true
},
hocon_schema:merge_env_overrides(SchemaMod, RawConf, all, Opts).
-spec check_config(module(), raw_config()) -> {AppEnvs, CheckedConf} -spec check_config(module(), raw_config()) -> {AppEnvs, CheckedConf}
when AppEnvs :: app_envs(), CheckedConf :: config(). when AppEnvs :: app_envs(), CheckedConf :: config().
check_config(SchemaMod, RawConf) -> check_config(SchemaMod, RawConf) ->
Opts = #{return_plain => true, check_config(SchemaMod, RawConf, #{}).
nullable => true, %% TODO: evil, remove, nullable should be declared in schema
format => map check_config(SchemaMod, RawConf, Opts0) ->
}, Opts1 = #{return_plain => true,
nullable => true, %% TODO: evil, remove, nullable should be declared in schema
format => map
},
Opts = maps:merge(Opts0, Opts1),
{AppEnvs, CheckedConf} = {AppEnvs, CheckedConf} =
hocon_schema:map_translate(SchemaMod, RawConf, Opts), hocon_schema:map_translate(SchemaMod, RawConf, Opts),
{AppEnvs, emqx_map_lib:unsafe_atom_key_map(CheckedConf)}. {AppEnvs, emqx_map_lib:unsafe_atom_key_map(CheckedConf)}.

View File

@ -182,12 +182,12 @@ check_parameter([{Name, Type} | Spec], Bindings, QueryStr, Module, BindingsAcc,
Schema = ?INIT_SCHEMA#{roots => [{Name, Type}]}, Schema = ?INIT_SCHEMA#{roots => [{Name, Type}]},
case hocon_schema:field_schema(Type, in) of case hocon_schema:field_schema(Type, in) of
path -> path ->
Option = #{atom_key => true, override_env => false}, Option = #{atom_key => true},
NewBindings = hocon_schema:check_plain(Schema, Bindings, Option), NewBindings = hocon_schema:check_plain(Schema, Bindings, Option),
NewBindingsAcc = maps:merge(BindingsAcc, NewBindings), NewBindingsAcc = maps:merge(BindingsAcc, NewBindings),
check_parameter(Spec, Bindings, QueryStr, Module, NewBindingsAcc, QueryStrAcc); check_parameter(Spec, Bindings, QueryStr, Module, NewBindingsAcc, QueryStrAcc);
query -> query ->
Option = #{override_env => false}, Option = #{},
NewQueryStr = hocon_schema:check_plain(Schema, QueryStr, Option), NewQueryStr = hocon_schema:check_plain(Schema, QueryStr, Option),
NewQueryStrAcc = maps:merge(QueryStrAcc, NewQueryStr), NewQueryStrAcc = maps:merge(QueryStrAcc, NewQueryStr),
check_parameter(Spec, Bindings, QueryStr, Module,BindingsAcc, NewQueryStrAcc) check_parameter(Spec, Bindings, QueryStr, Module,BindingsAcc, NewQueryStrAcc)
@ -201,7 +201,7 @@ check_request_body(#{body := Body}, Schema, Module, CheckFun, true) ->
_ -> Type0 _ -> Type0
end, end,
NewSchema = ?INIT_SCHEMA#{roots => [{root, Type}]}, NewSchema = ?INIT_SCHEMA#{roots => [{root, Type}]},
Option = #{override_env => false, nullable => true}, Option = #{nullable => true},
#{<<"root">> := NewBody} = CheckFun(NewSchema, #{<<"root">> => Body}, Option), #{<<"root">> := NewBody} = CheckFun(NewSchema, #{<<"root">> => Body}, Option),
NewBody; NewBody;
%% TODO not support nest object check yet, please use ref! %% TODO not support nest object check yet, please use ref!
@ -214,7 +214,7 @@ check_request_body(#{body := Body}, Schema, Module, CheckFun, true) ->
check_request_body(#{body := Body}, Spec, _Module, CheckFun, false) -> check_request_body(#{body := Body}, Spec, _Module, CheckFun, false) ->
lists:foldl(fun({Name, Type}, Acc) -> lists:foldl(fun({Name, Type}, Acc) ->
Schema = ?INIT_SCHEMA#{roots => [{Name, Type}]}, Schema = ?INIT_SCHEMA#{roots => [{Name, Type}]},
maps:merge(Acc, CheckFun(Schema, Body, #{override_env => false})) maps:merge(Acc, CheckFun(Schema, Body, #{}))
end, #{}, Spec). end, #{}, Spec).
%% tags, description, summary, security, deprecated %% tags, description, summary, security, deprecated