From 5dec0be6e45a6a4a6b9e6c610c288895a1747b74 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sun, 26 Jun 2022 14:13:14 +0200 Subject: [PATCH 1/2] refactor(emqx_schema): remove union wrapper around array of maps it's previously a union of array (of maps) and map. since the second union member has been removed there is no point of keeping the union wrapper --- apps/emqx/src/emqx_schema.erl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index f0655d438..c38ef6111 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -2216,29 +2216,29 @@ str(B) when is_binary(B) -> str(S) when is_list(S) -> S. -authentication(Type) -> +authentication(Which) -> Desc = - case Type of + case Which of global -> ?DESC(global_authentication); listener -> ?DESC(listener_authentication) end, - %% authentication schema is lazy to make it more 'plugable' - %% the type checks are done in emqx_auth application when it boots. - %% and in emqx_authentication_config module for runtime changes. - Default = hoconsc:lazy(hoconsc:union([hoconsc:array(typerefl:map())])), - %% as the type is lazy, the runtime module injection + %% The runtime module injection %% from EMQX_AUTHENTICATION_SCHEMA_MODULE_PT_KEY %% is for now only affecting document generation. %% maybe in the future, we can find a more straightforward way to support %% * document generation (at compile time) %% * type checks before boot (in bin/emqx config generation) %% * type checks at runtime (when changing configs via management API) + Type0 = + case persistent_term:get(?EMQX_AUTHENTICATION_SCHEMA_MODULE_PT_KEY, undefined) of + undefined -> hoconsc:array(typerefl:map()); + Module -> Module:root_type() + end, + %% It is a lazy type because when handing runtime update requests + %% the config is not checked by emqx_schema, but by the injected schema + Type = hoconsc:lazy(Type0), #{ - type => - case persistent_term:get(?EMQX_AUTHENTICATION_SCHEMA_MODULE_PT_KEY, undefined) of - undefined -> Default; - Module -> hoconsc:lazy(Module:root_type()) - end, + type => Type, desc => Desc }. From 55558ccfbdefe22009a848c703d341f613863c2e Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Sun, 26 Jun 2022 14:16:08 +0200 Subject: [PATCH 2/2] chore: allow lazy type environment variable override --- apps/emqx/src/emqx_config.erl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/emqx/src/emqx_config.erl b/apps/emqx/src/emqx_config.erl index ab98ded69..236b8b1a9 100644 --- a/apps/emqx/src/emqx_config.erl +++ b/apps/emqx/src/emqx_config.erl @@ -144,7 +144,7 @@ get_root([RootName | _]) -> %% @doc For the given path, get raw root value enclosed in a single-key map. %% key is ensured to be binary. get_root_raw([RootName | _]) -> - #{bin(RootName) => do_get(?RAW_CONF, [RootName], #{})}. + #{bin(RootName) => do_get_raw([RootName], #{})}. %% @doc Get a config value for the given path. %% The path should at least include root config name. @@ -173,7 +173,7 @@ find(KeyPath) -> {ok, term()} | {not_found, emqx_map_lib:config_key_path(), term()}. find_raw([]) -> Ref = make_ref(), - case do_get(?RAW_CONF, [], Ref) of + case do_get_raw([], Ref) of Ref -> {not_found, []}; Res -> {ok, Res} end; @@ -281,10 +281,10 @@ get_default_value([RootName | _] = KeyPath) -> end. -spec get_raw(emqx_map_lib:config_key_path()) -> term(). -get_raw(KeyPath) -> hocon_tconf:remove_env_meta(do_get(?RAW_CONF, KeyPath)). +get_raw(KeyPath) -> do_get_raw(KeyPath). -spec get_raw(emqx_map_lib:config_key_path(), term()) -> term(). -get_raw(KeyPath, Default) -> hocon_tconf:remove_env_meta(do_get(?RAW_CONF, KeyPath, Default)). +get_raw(KeyPath, Default) -> do_get_raw(KeyPath, Default). -spec put_raw(map()) -> ok. put_raw(Config) -> @@ -398,11 +398,11 @@ include_dirs() -> [filename:join(emqx:data_dir(), "configs")]. merge_envs(SchemaMod, RawConf) -> - %% TODO: evil, remove, required should be declared in schema Opts = #{ required => false, format => map, - apply_override_envs => true + apply_override_envs => true, + check_lazy => true }, hocon_tconf:merge_env_overrides(SchemaMod, RawConf, all, Opts). @@ -571,6 +571,12 @@ load_hocon_file(FileName, LoadType) -> #{} end. +do_get_raw(Path) -> + hocon_tconf:remove_env_meta(do_get(?RAW_CONF, Path)). + +do_get_raw(Path, Default) -> + hocon_tconf:remove_env_meta(do_get(?RAW_CONF, Path, Default)). + do_get(Type, KeyPath) -> Ref = make_ref(), Res = do_get(Type, KeyPath, Ref),