|
@@ -26,6 +26,7 @@
|
|
|
-export([schema/1]).
|
|
-export([schema/1]).
|
|
|
|
|
|
|
|
-export([translate/1]).
|
|
-export([translate/1]).
|
|
|
|
|
+-export([backend/1]).
|
|
|
|
|
|
|
|
-type json_value() ::
|
|
-type json_value() ::
|
|
|
null
|
|
null
|
|
@@ -142,7 +143,7 @@ fields(local_storage) ->
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
)}
|
|
)}
|
|
|
- ];
|
|
|
|
|
|
|
+ ] ++ common_backend_fields();
|
|
|
fields(local_storage_segments) ->
|
|
fields(local_storage_segments) ->
|
|
|
[
|
|
[
|
|
|
{root,
|
|
{root,
|
|
@@ -190,9 +191,9 @@ fields(local_storage_exporter) ->
|
|
|
required => false
|
|
required => false
|
|
|
}
|
|
}
|
|
|
)}
|
|
)}
|
|
|
- ];
|
|
|
|
|
|
|
+ ] ++ common_backend_fields();
|
|
|
fields(s3_exporter) ->
|
|
fields(s3_exporter) ->
|
|
|
- emqx_s3_schema:fields(s3);
|
|
|
|
|
|
|
+ emqx_s3_schema:fields(s3) ++ common_backend_fields();
|
|
|
fields(local_storage_segments_gc) ->
|
|
fields(local_storage_segments_gc) ->
|
|
|
[
|
|
[
|
|
|
{interval,
|
|
{interval,
|
|
@@ -229,6 +230,18 @@ fields(local_storage_segments_gc) ->
|
|
|
)}
|
|
)}
|
|
|
].
|
|
].
|
|
|
|
|
|
|
|
|
|
+common_backend_fields() ->
|
|
|
|
|
+ [
|
|
|
|
|
+ {enable,
|
|
|
|
|
+ mk(
|
|
|
|
|
+ boolean(), #{
|
|
|
|
|
+ desc => ?DESC("backend_enable"),
|
|
|
|
|
+ required => false,
|
|
|
|
|
+ default => true
|
|
|
|
|
+ }
|
|
|
|
|
+ )}
|
|
|
|
|
+ ].
|
|
|
|
|
+
|
|
|
desc(file_transfer) ->
|
|
desc(file_transfer) ->
|
|
|
"File transfer settings";
|
|
"File transfer settings";
|
|
|
desc(local_storage) ->
|
|
desc(local_storage) ->
|
|
@@ -275,11 +288,19 @@ validator(filename) ->
|
|
|
];
|
|
];
|
|
|
validator(backend) ->
|
|
validator(backend) ->
|
|
|
fun(Config) ->
|
|
fun(Config) ->
|
|
|
- case maps:keys(Config) of
|
|
|
|
|
- [_Type] ->
|
|
|
|
|
|
|
+ Enabled = maps:filter(
|
|
|
|
|
+ fun(_, Backend) ->
|
|
|
|
|
+ maps:get(enable, Backend, false) or maps:get(<<"enable">>, Backend, false)
|
|
|
|
|
+ end,
|
|
|
|
|
+ Config
|
|
|
|
|
+ ),
|
|
|
|
|
+ case maps:to_list(Enabled) of
|
|
|
|
|
+ [{_Type, _BackendConfig}] ->
|
|
|
ok;
|
|
ok;
|
|
|
_Conflicts = [_ | _] ->
|
|
_Conflicts = [_ | _] ->
|
|
|
- {error, multiple_conflicting_backends}
|
|
|
|
|
|
|
+ {error, multiple_enabled_backends};
|
|
|
|
|
+ _None = [] ->
|
|
|
|
|
+ {error, no_enabled_backend}
|
|
|
end
|
|
end
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
@@ -319,3 +340,13 @@ translate(Conf) ->
|
|
|
?MODULE, #{atom_to_binary(Root) => Conf}, #{atom_key => true}, [Root]
|
|
?MODULE, #{atom_to_binary(Root) => Conf}, #{atom_key => true}, [Root]
|
|
|
)
|
|
)
|
|
|
).
|
|
).
|
|
|
|
|
+
|
|
|
|
|
+-spec backend(emqx_config:config()) ->
|
|
|
|
|
+ {_Type :: atom(), emqx_config:config()}.
|
|
|
|
|
+backend(Config) ->
|
|
|
|
|
+ catch maps:foreach(fun emit_enabled/2, Config).
|
|
|
|
|
+
|
|
|
|
|
+-spec emit_enabled(atom(), emqx_config:config()) ->
|
|
|
|
|
+ no_return().
|
|
|
|
|
+emit_enabled(Type, BConf = #{enable := Enabled}) ->
|
|
|
|
|
+ Enabled andalso throw({Type, BConf}).
|