Explorar el Código

feat(emqx_config): return config maps when emqx_config:update/2,3

Shawn hace 4 años
padre
commit
b381b5d2b9

+ 18 - 14
apps/emqx/src/emqx_config.erl

@@ -65,7 +65,7 @@
         , update/3
         , remove/1
         , remove/2
-        , reset/1
+        , reset/2
         ]).
 
 -export([ get_raw/1
@@ -184,27 +184,31 @@ put(KeyPath, Config) -> do_put(?CONF, KeyPath, Config).
 
 -spec update(emqx_map_lib:config_key_path(), update_request()) ->
     ok | {error, term()}.
-update([RootName | _] = KeyPath, UpdateReq) ->
-    update(get_schema_mod(RootName), KeyPath, UpdateReq).
+update(KeyPath, UpdateReq) ->
+    update(KeyPath, UpdateReq, #{}).
 
--spec update(module(), emqx_map_lib:config_key_path(), update_request()) ->
-    ok | {error, term()}.
-update(SchemaMod, KeyPath, UpdateReq) ->
-    emqx_config_handler:update_config(SchemaMod, KeyPath, {update, UpdateReq}).
+-spec update(emqx_map_lib:config_key_path(), update_request(),
+        emqx_config_handler:update_opts()) -> ok | {error, term()}.
+update([RootName | _] = KeyPath, UpdateReq, Opts) ->
+    emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath,
+        {{update, UpdateReq}, Opts}).
 
 -spec remove(emqx_map_lib:config_key_path()) -> ok | {error, term()}.
-remove([RootName | _] = KeyPath) ->
-    remove(get_schema_mod(RootName), KeyPath).
+remove(KeyPath) ->
+    remove(KeyPath, #{}).
 
-remove(SchemaMod, KeyPath) ->
-    emqx_config_handler:update_config(SchemaMod, KeyPath, remove).
+-spec remove(emqx_map_lib:config_key_path(), emqx_config_handler:update_opts()) ->
+    ok | {error, term()}.
+remove([RootName | _] = KeyPath, Opts) ->
+    emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath, {remove, Opts}).
 
--spec reset(emqx_map_lib:config_key_path()) -> ok | {error, term()}.
-reset([RootName | _] = KeyPath) ->
+-spec reset(emqx_map_lib:config_key_path(), emqx_config_handler:update_opts()) ->
+    ok | {error, term()}.
+reset([RootName | _] = KeyPath, Opts) ->
     case get_default_value(KeyPath) of
         {ok, Default} ->
             emqx_config_handler:update_config(get_schema_mod(RootName), KeyPath,
-                {update, Default});
+                {{update, Default}, Opts});
         {error, _} = Error ->
             Error
     end.

+ 22 - 8
apps/emqx/src/emqx_config_handler.erl

@@ -38,9 +38,15 @@
 
 -define(MOD, {mod}).
 
+-export_type([update_opts/0, update_cmd/0, update_args/0]).
 -type handler_name() :: module().
 -type handlers() :: #{emqx_config:config_key() => handlers(), ?MOD => handler_name()}.
--type update_args() :: {update, emqx_config:update_request()} | remove.
+-type update_cmd() :: {update, emqx_config:update_request()} | remove.
+-type update_opts() :: #{
+        %% fill the default values into the rawconf map
+        rawconf_with_defaults => boolean()
+    }.
+-type update_args() :: {update_cmd(), Opts :: update_opts()}.
 
 -optional_callbacks([ pre_config_update/2
                     , post_config_update/3
@@ -61,7 +67,7 @@ start_link() ->
     gen_server:start_link({local, ?MODULE}, ?MODULE, {}, []).
 
 -spec update_config(module(), emqx_config:config_key_path(), update_args()) ->
-    ok | {error, term()}.
+    {ok, emqx_config:config(), emqx_config:raw_config()} | {error, term()}.
 update_config(SchemaModule, ConfKeyPath, UpdateArgs) ->
     gen_server:call(?MODULE, {change_config, SchemaModule, ConfKeyPath, UpdateArgs}).
 
@@ -80,7 +86,7 @@ handle_call({add_child, ConfKeyPath, HandlerName}, _From,
     {reply, ok, State#{handlers =>
         emqx_map_lib:deep_put(ConfKeyPath, Handlers, #{?MOD => HandlerName})}};
 
-handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From,
+handle_call({change_config, SchemaModule, ConfKeyPath, {_Cmd, Opts} = UpdateArgs}, _From,
             #{handlers := Handlers} = State) ->
     OldConf = emqx_config:get([]),
     OldRawConf = emqx_config:get_raw([]),
@@ -89,7 +95,10 @@ handle_call({change_config, SchemaModule, ConfKeyPath, UpdateArgs}, _From,
             Handlers, UpdateArgs),
         {AppEnvs, CheckedConf} = emqx_config:check_config(SchemaModule, NewRawConf),
         _ = do_post_config_update(ConfKeyPath, Handlers, OldConf, CheckedConf, UpdateArgs),
-        emqx_config:save_configs(AppEnvs, CheckedConf, NewRawConf, OverrideConf)
+        case emqx_config:save_configs(AppEnvs, CheckedConf, NewRawConf, OverrideConf) of
+            ok -> {ok, emqx_config:get([]), return_rawconf(Opts)};
+            Err -> Err
+        end
     catch Error:Reason:ST ->
         ?LOG(error, "change_config failed: ~p", [{Error, Reason, ST}]),
         {error, Reason}
@@ -112,12 +121,12 @@ terminate(_Reason, _State) ->
 code_change(_OldVsn, State, _Extra) ->
     {ok, State}.
 
-process_upadate_request(ConfKeyPath, OldRawConf, _Handlers, remove) ->
+process_upadate_request(ConfKeyPath, OldRawConf, _Handlers, {remove, _Opts}) ->
     BinKeyPath = bin_path(ConfKeyPath),
     NewRawConf = emqx_map_lib:deep_remove(BinKeyPath, OldRawConf),
     OverrideConf = emqx_map_lib:deep_remove(BinKeyPath, emqx_config:read_override_conf()),
     {NewRawConf, OverrideConf};
-process_upadate_request(ConfKeyPath, OldRawConf, Handlers, {update, UpdateReq}) ->
+process_upadate_request(ConfKeyPath, OldRawConf, Handlers, {{update, UpdateReq}, _Opts}) ->
     NewRawConf = do_update_config(ConfKeyPath, Handlers, OldRawConf, UpdateReq),
     OverrideConf = update_override_config(NewRawConf),
     {NewRawConf, OverrideConf}.
@@ -172,8 +181,13 @@ update_override_config(RawConf) ->
     OldConf = emqx_config:read_override_conf(),
     maps:merge(OldConf, RawConf).
 
-up_req(remove) -> '$remove';
-up_req({update, Req}) -> Req.
+up_req({remove, _Opts}) -> '$remove';
+up_req({{update, Req}, _Opts}) -> Req.
+
+return_rawconf(#{rawconf_with_defaults := true}) ->
+    emqx_config:fill_defaults(emqx_config:get_raw([]));
+return_rawconf(_) ->
+    emqx_config:get_raw([]).
 
 bin_path(ConfKeyPath) -> [bin(Key) || Key <- ConfKeyPath].
 

+ 2 - 2
apps/emqx_authz/src/emqx_authz.erl

@@ -61,10 +61,10 @@ lookup(Id) ->
     end.
 
 move(Id, Position) ->
-    emqx_config:update(emqx_authz_schema, ?CONF_KEY_PATH, {move, Id, Position}).
+    emqx_config:update(?CONF_KEY_PATH, {move, Id, Position}).
 
 update(Cmd, Rules) ->
-    emqx_config:update(emqx_authz_schema, ?CONF_KEY_PATH, {Cmd, Rules}).
+    emqx_config:update(?CONF_KEY_PATH, {Cmd, Rules}).
 
 pre_config_update({move, Id, <<"top">>}, Conf) when is_list(Conf) ->
     {Index, _} = find_rule_by_id(Id),