From c7cc2e85b2cc6d623d7caf6e85a45a0bbf008de2 Mon Sep 17 00:00:00 2001 From: Zhongwen Deng Date: Mon, 6 Jun 2022 09:29:08 +0800 Subject: [PATCH] fix: add default&example for schema --- .../emqx_limiter/src/emqx_limiter_schema.erl | 53 +++-- apps/emqx/src/emqx_schema.erl | 74 ++++--- apps/emqx_authn/src/emqx_authn_schema.erl | 102 ++++----- .../src/simple_authn/emqx_authn_http.erl | 2 +- apps/emqx_authz/src/emqx_authz_schema.erl | 197 +++++++++--------- .../src/emqx_auto_subscribe_schema.erl | 21 +- apps/emqx_conf/src/emqx_conf_schema.erl | 4 +- .../src/emqx_connector_schema.erl | 13 +- .../src/emqx_dashboard_schema.erl | 44 ++-- .../src/emqx_dashboard_swagger.erl | 2 + apps/emqx_exhook/src/emqx_exhook_schema.erl | 106 ++++------ apps/emqx_gateway/src/emqx_gateway_schema.erl | 6 +- apps/emqx_modules/src/emqx_modules_schema.erl | 19 +- apps/emqx_plugins/src/emqx_plugins_schema.erl | 6 +- .../src/emqx_prometheus_schema.erl | 8 +- apps/emqx_psk/src/emqx_psk_schema.erl | 37 ++-- .../src/emqx_retainer_schema.erl | 4 +- .../src/emqx_rule_engine_schema.erl | 49 ++--- .../src/emqx_slow_subs_schema.erl | 4 +- 19 files changed, 346 insertions(+), 405 deletions(-) diff --git a/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl b/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl index 5d1d720e6..023f9124f 100644 --- a/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl +++ b/apps/emqx/src/emqx_limiter/src/emqx_limiter_schema.erl @@ -78,7 +78,6 @@ -export_type([limiter_type/0, bucket_path/0]). --import(emqx_schema, [sc/2, map/2]). -define(UNIT_TIME_IN_MS, 1000). namespace() -> limiter. @@ -87,28 +86,29 @@ roots() -> [limiter]. fields(limiter) -> [ - {Type, sc(ref(limiter_opts), #{desc => ?DESC(Type), default => #{<<"enable">> => false}})} + {Type, + ?HOCON(?R_REF(limiter_opts), #{ + desc => ?DESC(Type), + default => #{<<"enable">> => false} + })} || Type <- types() ]; fields(limiter_opts) -> [ - {enable, sc(boolean(), #{desc => ?DESC(enable), default => true})}, - {rate, sc(rate(), #{desc => ?DESC(rate), default => "infinity"})}, + {enable, ?HOCON(boolean(), #{desc => ?DESC(enable), default => true})}, + {rate, ?HOCON(rate(), #{desc => ?DESC(rate), default => "infinity"})}, {burst, - sc( - burst_rate(), - #{ - desc => ?DESC(burst), - default => 0 - } - )}, + ?HOCON(burst_rate(), #{ + desc => ?DESC(burst), + default => 0 + })}, {bucket, - sc( - map("bucket_name", ref(bucket_opts)), + ?HOCON( + ?MAP("bucket_name", ?R_REF(bucket_opts)), #{ desc => ?DESC(bucket_cfg), default => #{<<"default">> => #{}}, - examples => #{ + example => #{ <<"mybucket-name">> => #{ <<"rate">> => <<"infinity">>, <<"capcity">> => <<"infinity">>, @@ -121,12 +121,12 @@ fields(limiter_opts) -> ]; fields(bucket_opts) -> [ - {rate, sc(rate(), #{desc => ?DESC(rate), default => "infinity"})}, - {capacity, sc(capacity(), #{desc => ?DESC(capacity), default => "infinity"})}, - {initial, sc(initial(), #{default => "0", desc => ?DESC(initial)})}, + {rate, ?HOCON(rate(), #{desc => ?DESC(rate), default => "infinity"})}, + {capacity, ?HOCON(capacity(), #{desc => ?DESC(capacity), default => "infinity"})}, + {initial, ?HOCON(initial(), #{default => "0", desc => ?DESC(initial)})}, {per_client, - sc( - ref(client_bucket), + ?HOCON( + ?R_REF(client_bucket), #{ default => #{}, desc => ?DESC(per_client) @@ -135,14 +135,14 @@ fields(bucket_opts) -> ]; fields(client_bucket) -> [ - {rate, sc(rate(), #{default => "infinity", desc => ?DESC(rate)})}, - {initial, sc(initial(), #{default => "0", desc => ?DESC(initial)})}, + {rate, ?HOCON(rate(), #{default => "infinity", desc => ?DESC(rate)})}, + {initial, ?HOCON(initial(), #{default => "0", desc => ?DESC(initial)})}, %% low_watermark add for emqx_channel and emqx_session %% both modules consume first and then check %% so we need to use this value to prevent excessive consumption %% (e.g, consumption from an empty bucket) {low_watermark, - sc( + ?HOCON( initial(), #{ desc => ?DESC(low_watermark), @@ -150,12 +150,12 @@ fields(client_bucket) -> } )}, {capacity, - sc(capacity(), #{ + ?HOCON(capacity(), #{ desc => ?DESC(client_bucket_capacity), default => "infinity" })}, {divisible, - sc( + ?HOCON( boolean(), #{ desc => ?DESC(divisible), @@ -163,7 +163,7 @@ fields(client_bucket) -> } )}, {max_retry_time, - sc( + ?HOCON( emqx_schema:duration(), #{ desc => ?DESC(max_retry_time), @@ -171,7 +171,7 @@ fields(client_bucket) -> } )}, {failure_strategy, - sc( + ?HOCON( failure_strategy(), #{ desc => ?DESC(failure_strategy), @@ -212,7 +212,6 @@ types() -> %%-------------------------------------------------------------------- %% Internal functions %%-------------------------------------------------------------------- -ref(Field) -> hoconsc:ref(?MODULE, Field). to_burst_rate(Str) -> to_rate(Str, false, true). diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index 379492588..ba180839f 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -36,6 +36,7 @@ -type percent() :: float(). -type file() :: string(). -type comma_separated_list() :: list(). +-type comma_separated_binary() :: [binary()]. -type comma_separated_atoms() :: [atom()]. -type bar_separated_list() :: list(). -type ip_port() :: tuple(). @@ -48,6 +49,7 @@ -typerefl_from_string({wordsize/0, emqx_schema, to_wordsize}). -typerefl_from_string({percent/0, emqx_schema, to_percent}). -typerefl_from_string({comma_separated_list/0, emqx_schema, to_comma_separated_list}). +-typerefl_from_string({comma_separated_binary/0, emqx_schema, to_comma_separated_binary}). -typerefl_from_string({bar_separated_list/0, emqx_schema, to_bar_separated_list}). -typerefl_from_string({ip_port/0, emqx_schema, to_ip_port}). -typerefl_from_string({cipher/0, emqx_schema, to_erl_cipher_suite}). @@ -73,6 +75,7 @@ to_wordsize/1, to_percent/1, to_comma_separated_list/1, + to_comma_separated_binary/1, to_bar_separated_list/1, to_ip_port/1, to_erl_cipher_suite/1, @@ -90,6 +93,7 @@ percent/0, file/0, comma_separated_list/0, + comma_separated_binary/0, bar_separated_list/0, ip_port/0, cipher/0, @@ -315,7 +319,6 @@ fields("authorization") -> #{ default => allow, required => true, - %% TODO: make sources a reference link desc => ?DESC(fields_authorization_no_match) } )}, @@ -455,7 +458,7 @@ fields("mqtt") -> sc( string(), #{ - default => "", + default => <<"">>, desc => ?DESC(mqtt_response_information) } )}, @@ -790,7 +793,7 @@ fields("mqtt_tcp_listener") -> ref("tcp_opts"), #{} )} - ] ++ mqtt_listener(); + ] ++ mqtt_listener(1883); fields("mqtt_ssl_listener") -> [ {"tcp", @@ -803,7 +806,7 @@ fields("mqtt_ssl_listener") -> ref("listener_ssl_opts"), #{} )} - ] ++ mqtt_listener(); + ] ++ mqtt_listener(8883); fields("mqtt_ws_listener") -> [ {"tcp", @@ -816,7 +819,7 @@ fields("mqtt_ws_listener") -> ref("ws_opts"), #{} )} - ] ++ mqtt_listener(); + ] ++ mqtt_listener(8083); fields("mqtt_wss_listener") -> [ {"tcp", @@ -834,7 +837,7 @@ fields("mqtt_wss_listener") -> ref("ws_opts"), #{} )} - ] ++ mqtt_listener(); + ] ++ mqtt_listener(8084); fields("mqtt_quic_listener") -> [ {"enabled", @@ -865,7 +868,7 @@ fields("mqtt_quic_listener") -> desc => ?DESC(fields_mqtt_quic_listener_idle_timeout) } )} - ] ++ base_listener(); + ] ++ base_listener(14567); fields("ws_opts") -> [ {"mqtt_path", @@ -942,9 +945,10 @@ fields("ws_opts") -> )}, {"check_origins", sc( - hoconsc:array(binary()), + comma_separated_binary(), #{ - default => [], + default => "", + example => <<"http://localhost:18083, http://127.0.0.1:18083">>, desc => ?DESC(fields_ws_opts_check_origins) } )}, @@ -1007,19 +1011,25 @@ fields("tcp_opts") -> {"recbuf", sc( bytesize(), - #{desc => ?DESC(fields_tcp_opts_recbuf)} + #{ + example => <<"2KB">>, + desc => ?DESC(fields_tcp_opts_recbuf) + } )}, {"sndbuf", sc( bytesize(), - #{desc => ?DESC(fields_tcp_opts_sndbuf)} + #{ + example => <<"4KB">>, + desc => ?DESC(fields_tcp_opts_sndbuf) + } )}, {"buffer", sc( bytesize(), #{ - desc => ?DESC(fields_tcp_opts_buffer), - default => "4KB" + example => <<"4KB">>, + desc => ?DESC(fields_tcp_opts_buffer) } )}, {"high_watermark", @@ -1087,12 +1097,16 @@ fields("deflate_opts") -> {"strategy", sc( hoconsc:enum([default, filtered, huffman_only, rle]), - #{desc => ?DESC(fields_deflate_opts_strategy)} + #{ + default => default, + desc => ?DESC(fields_deflate_opts_strategy) + } )}, {"server_context_takeover", sc( hoconsc:enum([takeover, no_takeover]), #{ + default => takeover, desc => ?DESC(fields_deflate_opts_server_context_takeover) } )}, @@ -1100,6 +1114,7 @@ fields("deflate_opts") -> sc( hoconsc:enum([takeover, no_takeover]), #{ + default => takeover, desc => ?DESC(fields_deflate_opts_client_context_takeover) } )}, @@ -1107,16 +1122,16 @@ fields("deflate_opts") -> sc( range(8, 15), #{ - desc => ?DESC(fields_deflate_opts_server_max_window_bits), - default => 15 + default => 15, + desc => ?DESC(fields_deflate_opts_server_max_window_bits) } )}, {"client_max_window_bits", sc( range(8, 15), #{ - desc => ?DESC(fields_deflate_opts_client_max_window_bits), - default => 15 + default => 15, + desc => ?DESC(fields_deflate_opts_client_max_window_bits) } )} ]; @@ -1170,7 +1185,10 @@ fields("broker") -> {"shared_subscription_group", sc( map(name, ref("shared_subscription_group")), - #{desc => ?DESC(shared_subscription_group_strategy)} + #{ + example => #{<<"example_group">> => #{<<"strategy">> => <<"random">>}}, + desc => ?DESC(shared_subscription_group_strategy) + } )} ]; fields("shared_subscription_group") -> @@ -1179,6 +1197,7 @@ fields("shared_subscription_group") -> sc( hoconsc:enum([random, round_robin, sticky, local, hash_topic, hash_clientid]), #{ + default => random, desc => ?DESC(shared_subscription_strategy_enum) } )} @@ -1309,6 +1328,7 @@ fields("sysmon_vm") -> sc( hoconsc:union([disabled, duration()]), #{ + default => disabled, desc => ?DESC(sysmon_vm_long_gc) } )}, @@ -1511,8 +1531,8 @@ fields("trace") -> })} ]. -mqtt_listener() -> - base_listener() ++ +mqtt_listener(Bind) -> + base_listener(Bind) ++ [ {"access_rules", sc( @@ -1541,14 +1561,15 @@ mqtt_listener() -> {?EMQX_AUTHENTICATION_CONFIG_ROOT_NAME, authentication(listener)} ]. -base_listener() -> +base_listener(Bind) -> [ {"bind", sc( hoconsc:union([ip_port(), integer()]), #{ - desc => ?DESC(base_listener_bind), - required => true + default => Bind, + required => true, + desc => ?DESC(base_listener_bind) } )}, {"acceptors", @@ -1822,6 +1843,7 @@ common_ssl_opts_schema(Defaults) -> #{ sensitive => true, required => false, + example => <<"">>, desc => ?DESC(common_ssl_opts_schema_password) } )}, @@ -1926,6 +1948,7 @@ client_ssl_opts_schema(Defaults) -> hoconsc:union([disable, string()]), #{ required => false, + example => disable, validator => fun emqx_schema:non_empty_string/1, desc => ?DESC(client_ssl_opts_schema_server_name_indication) } @@ -2060,6 +2083,9 @@ to_percent(Str) -> to_comma_separated_list(Str) -> {ok, string:tokens(Str, ", ")}. +to_comma_separated_binary(Str) -> + {ok, lists:map(fun erlang:list_to_binary/1, string:tokens(Str, ", "))}. + to_comma_separated_atoms(Str) -> {ok, lists:map(fun to_atom/1, string:tokens(Str, ", "))}. diff --git a/apps/emqx_authn/src/emqx_authn_schema.erl b/apps/emqx_authn/src/emqx_authn_schema.erl index 74276e370..f2a4085d2 100644 --- a/apps/emqx_authn/src/emqx_authn_schema.erl +++ b/apps/emqx_authn/src/emqx_authn_schema.erl @@ -18,7 +18,6 @@ -elvis([{elvis_style, invalid_dynamic_call, disable}]). -include_lib("hocon/include/hoconsc.hrl"). --import(hoconsc, [mk/2, ref/2]). -export([ common_fields/0, @@ -45,20 +44,18 @@ authenticator_type() -> hoconsc:union(config_refs([Module || {_AuthnType, Module} <- emqx_authn:providers()])). authenticator_type_without_scram() -> - Providers = lists:filter( + Providers = lists:filtermap( fun - ({{password_based, _Backend}, _Mod}) -> - true; - ({jwt, _Mod}) -> - true; + ({{password_based, _Backend}, Mod}) -> + {true, Mod}; + ({jwt, Mod}) -> + {true, Mod}; ({{scram, _Backend}, _Mod}) -> false end, emqx_authn:providers() ), - hoconsc:union( - config_refs([Module || {_AuthnType, Module} <- Providers]) - ). + hoconsc:union(config_refs(Providers)). config_refs(Modules) -> lists:append([Module:refs() || Module <- Modules]). @@ -70,8 +67,8 @@ root_type() -> hoconsc:array(authenticator_type()). mechanism(Name) -> - hoconsc:mk( - hoconsc:enum([Name]), + ?HOCON( + Name, #{ required => true, desc => ?DESC("mechanism") @@ -79,81 +76,62 @@ mechanism(Name) -> ). backend(Name) -> - hoconsc:mk( - hoconsc:enum([Name]), - #{ - required => true, - desc => ?DESC("backend") - } - ). + ?HOCON(Name, #{ + required => true, + desc => ?DESC("backend") + }). fields("metrics_status_fields") -> [ - {"resource_metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})}, - {"node_resource_metrics", - mk( - hoconsc:array(ref(?MODULE, "node_resource_metrics")), - #{desc => ?DESC("node_metrics")} - )}, - {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})}, - {"node_metrics", - mk( - hoconsc:array(ref(?MODULE, "node_metrics")), - #{desc => ?DESC("node_metrics")} - )}, - {"status", mk(cluster_status(), #{desc => ?DESC("status")})}, - {"node_status", - mk( - hoconsc:array(ref(?MODULE, "node_status")), - #{desc => ?DESC("node_status")} - )}, - {"node_error", - mk( - hoconsc:array(ref(?MODULE, "node_error")), - #{desc => ?DESC("node_error")} - )} + {"resource_metrics", ?HOCON(?R_REF("resource_metrics"), #{desc => ?DESC("metrics")})}, + array("node_resource_metrics", "node_metrics"), + {"metrics", ?HOCON(?R_REF("metrics"), #{desc => ?DESC("metrics")})}, + array("node_metrics"), + {"status", ?HOCON(cluster_status(), #{desc => ?DESC("status")})}, + array("node_status"), + array("node_error") ]; fields("metrics") -> [ - {"nomatch", mk(integer(), #{desc => ?DESC("metrics_nomatch")})}, - {"total", mk(integer(), #{desc => ?DESC("metrics_total")})}, - {"success", mk(integer(), #{desc => ?DESC("metrics_success")})}, - {"failed", mk(integer(), #{desc => ?DESC("metrics_failed")})}, - {"rate", mk(float(), #{desc => ?DESC("metrics_rate")})}, - {"rate_max", mk(float(), #{desc => ?DESC("metrics_rate_max")})}, - {"rate_last5m", mk(float(), #{desc => ?DESC("metrics_rate_last5m")})} + {"nomatch", ?HOCON(integer(), #{desc => ?DESC("metrics_nomatch")})}, + {"total", ?HOCON(integer(), #{desc => ?DESC("metrics_total")})}, + {"success", ?HOCON(integer(), #{desc => ?DESC("metrics_success")})}, + {"failed", ?HOCON(integer(), #{desc => ?DESC("metrics_failed")})}, + {"rate", ?HOCON(float(), #{desc => ?DESC("metrics_rate")})}, + {"rate_max", ?HOCON(float(), #{desc => ?DESC("metrics_rate_max")})}, + {"rate_last5m", ?HOCON(float(), #{desc => ?DESC("metrics_rate_last5m")})} ]; fields("resource_metrics") -> common_field(); fields("node_metrics") -> [ node_name(), - {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})} + {"metrics", ?HOCON(?R_REF("metrics"), #{desc => ?DESC("metrics")})} ]; fields("node_resource_metrics") -> [ node_name(), - {"metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})} + {"metrics", ?HOCON(?R_REF("resource_metrics"), #{desc => ?DESC("metrics")})} ]; fields("node_status") -> [ node_name(), - {"status", mk(status(), #{desc => ?DESC("node_status")})} + {"status", ?HOCON(status(), #{desc => ?DESC("node_status")})} ]; fields("node_error") -> [ node_name(), - {"error", mk(string(), #{desc => ?DESC("node_error")})} + {"error", ?HOCON(string(), #{desc => ?DESC("node_error")})} ]. common_field() -> [ - {"matched", mk(integer(), #{desc => ?DESC("matched")})}, - {"success", mk(integer(), #{desc => ?DESC("success")})}, - {"failed", mk(integer(), #{desc => ?DESC("failed")})}, - {"rate", mk(float(), #{desc => ?DESC("rate")})}, - {"rate_max", mk(float(), #{desc => ?DESC("rate_max")})}, - {"rate_last5m", mk(float(), #{desc => ?DESC("rate_last5m")})} + {"matched", ?HOCON(integer(), #{desc => ?DESC("matched")})}, + {"success", ?HOCON(integer(), #{desc => ?DESC("success")})}, + {"failed", ?HOCON(integer(), #{desc => ?DESC("failed")})}, + {"rate", ?HOCON(float(), #{desc => ?DESC("rate")})}, + {"rate_max", ?HOCON(float(), #{desc => ?DESC("rate_max")})}, + {"rate_last5m", ?HOCON(float(), #{desc => ?DESC("rate_last5m")})} ]. status() -> @@ -163,4 +141,10 @@ cluster_status() -> hoconsc:enum([connected, disconnected, connecting, inconsistent]). node_name() -> - {"node", mk(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}. + {"node", ?HOCON(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}. + +array(Name) -> + array(Name, Name). + +array(Name, DescId) -> + {Name, ?HOCON(?R_REF(Name), #{desc => ?DESC(DescId)})}. diff --git a/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl b/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl index 583245f79..c4ce9f2b1 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl @@ -62,7 +62,7 @@ roots() -> fields(get) -> [ - {method, #{type => get, required => true, default => post, desc => ?DESC(method)}}, + {method, #{type => get, required => true, default => get, desc => ?DESC(method)}}, {headers, fun headers_no_content_type/1} ] ++ common_fields(); fields(post) -> diff --git a/apps/emqx_authz/src/emqx_authz_schema.erl b/apps/emqx_authz/src/emqx_authz_schema.erl index 462cd7204..8948dd8ac 100644 --- a/apps/emqx_authz/src/emqx_authz_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_schema.erl @@ -19,7 +19,6 @@ -include("emqx_authz.hrl"). -include_lib("hocon/include/hoconsc.hrl"). -include_lib("emqx_connector/include/emqx_connector.hrl"). --import(hoconsc, [mk/2, ref/2]). -reflect_type([ permission/0, @@ -55,43 +54,46 @@ namespace() -> authz. roots() -> []. fields("authorization") -> + Types = [ + file, + http_get, + http_post, + mnesia, + mongo_single, + mongo_rs, + mongo_sharded, + mysql, + postgresql, + redis_single, + redis_sentinel, + redis_cluster + ], + Unions = [?R_REF(Type) || Type <- Types], [ - {sources, #{ - type => union_array( - [ - hoconsc:ref(?MODULE, file), - hoconsc:ref(?MODULE, http_get), - hoconsc:ref(?MODULE, http_post), - hoconsc:ref(?MODULE, mnesia), - hoconsc:ref(?MODULE, mongo_single), - hoconsc:ref(?MODULE, mongo_rs), - hoconsc:ref(?MODULE, mongo_sharded), - hoconsc:ref(?MODULE, mysql), - hoconsc:ref(?MODULE, postgresql), - hoconsc:ref(?MODULE, redis_single), - hoconsc:ref(?MODULE, redis_sentinel), - hoconsc:ref(?MODULE, redis_cluster) - ] - ), - default => [], - desc => ?DESC(sources) - }} + {sources, + ?HOCON( + ?ARRAY(?UNION(Unions)), + #{ + default => [], + desc => ?DESC(sources) + } + )} ]; fields(file) -> authz_common_fields(file) ++ - [{path, #{type => string(), required => true, desc => ?DESC(path)}}]; + [{path, ?HOCON(string(), #{required => true, desc => ?DESC(path)})}]; fields(http_get) -> authz_common_fields(http) ++ http_common_fields() ++ [ - {method, #{type => get, default => get, required => true, desc => ?DESC(method)}}, + {method, method(get)}, {headers, fun headers_no_content_type/1} ]; fields(http_post) -> authz_common_fields(http) ++ http_common_fields() ++ [ - {method, #{type => post, default => post, required => true, desc => ?DESC(method)}}, + {method, method(post)}, {headers, fun headers/1} ]; fields(mnesia) -> @@ -130,65 +132,49 @@ fields(redis_cluster) -> [{cmd, cmd()}]; fields("metrics_status_fields") -> [ - {"resource_metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})}, - {"node_resource_metrics", - mk( - hoconsc:array(ref(?MODULE, "node_resource_metrics")), - #{desc => ?DESC("node_metrics")} - )}, - {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})}, - {"node_metrics", - mk( - hoconsc:array(ref(?MODULE, "node_metrics")), - #{desc => ?DESC("node_metrics")} - )}, - {"status", mk(cluster_status(), #{desc => ?DESC("status")})}, - {"node_status", - mk( - hoconsc:array(ref(?MODULE, "node_status")), - #{desc => ?DESC("node_status")} - )}, - {"node_error", - mk( - hoconsc:array(ref(?MODULE, "node_error")), - #{desc => ?DESC("node_error")} - )} + {"resource_metrics", ?HOCON(?R_REF("resource_metrics"), #{desc => ?DESC("metrics")})}, + {"node_resource_metrics", array("node_resource_metrics", "node_metrics")}, + {"metrics", ?HOCON(?R_REF("metrics"), #{desc => ?DESC("metrics")})}, + {"node_metrics", array("node_metrics")}, + {"status", ?HOCON(cluster_status(), #{desc => ?DESC("status")})}, + {"node_status", array("node_status")}, + {"node_error", array("node_error")} ]; fields("metrics") -> [ - {"total", mk(integer(), #{desc => ?DESC("metrics_total")})}, - {"allow", mk(integer(), #{desc => ?DESC("allow")})}, - {"deny", mk(integer(), #{desc => ?DESC("deny")})}, - {"nomatch", mk(float(), #{desc => ?DESC("nomatch")})} + {"total", ?HOCON(integer(), #{desc => ?DESC("metrics_total")})}, + {"allow", ?HOCON(integer(), #{desc => ?DESC("allow")})}, + {"deny", ?HOCON(integer(), #{desc => ?DESC("deny")})}, + {"nomatch", ?HOCON(float(), #{desc => ?DESC("nomatch")})} ] ++ common_rate_field(); fields("node_metrics") -> [ node_name(), - {"metrics", mk(ref(?MODULE, "metrics"), #{desc => ?DESC("metrics")})} + {"metrics", ?HOCON(?R_REF("metrics"), #{desc => ?DESC("metrics")})} ]; fields("resource_metrics") -> common_field(); fields("node_resource_metrics") -> [ node_name(), - {"metrics", mk(ref(?MODULE, "resource_metrics"), #{desc => ?DESC("metrics")})} + {"metrics", ?HOCON(?R_REF("resource_metrics"), #{desc => ?DESC("metrics")})} ]; fields("node_status") -> [ node_name(), - {"status", mk(status(), #{desc => ?DESC("node_status")})} + {"status", ?HOCON(status(), #{desc => ?DESC("node_status")})} ]; fields("node_error") -> [ node_name(), - {"error", mk(string(), #{desc => ?DESC("node_error")})} + {"error", ?HOCON(string(), #{desc => ?DESC("node_error")})} ]. common_field() -> [ - {"matched", mk(integer(), #{desc => ?DESC("matched")})}, - {"success", mk(integer(), #{desc => ?DESC("success")})}, - {"failed", mk(integer(), #{desc => ?DESC("failed")})} + {"matched", ?HOCON(integer(), #{desc => ?DESC("matched")})}, + {"success", ?HOCON(integer(), #{desc => ?DESC("success")})}, + {"failed", ?HOCON(integer(), #{desc => ?DESC("failed")})} ] ++ common_rate_field(). status() -> @@ -198,7 +184,7 @@ cluster_status() -> hoconsc:enum([connected, disconnected, connecting, inconsistent]). node_name() -> - {"node", mk(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}. + {"node", ?HOCON(binary(), #{desc => ?DESC("node"), example => "emqx@127.0.0.1"})}. desc(?CONF_NS) -> ?DESC(?CONF_NS); @@ -231,8 +217,8 @@ desc(_) -> authz_common_fields(Type) -> [ - {type, #{type => Type, required => true, desc => ?DESC(type)}}, - {enable, #{type => boolean(), default => true, desc => ?DESC(enable)}} + {type, ?HOCON(Type, #{required => true, desc => ?DESC(type)})}, + {enable, ?HOCON(boolean(), #{default => true, desc => ?DESC(enable)})} ]. http_common_fields() -> @@ -242,7 +228,7 @@ http_common_fields() -> mk_duration("Request timeout", #{ required => false, default => "30s", desc => ?DESC(request_timeout) })}, - {body, #{type => map(), required => false, desc => ?DESC(body)}} + {body, ?HOCON(map(), #{required => false, desc => ?DESC(body)})} ] ++ maps:to_list( maps:without( @@ -256,17 +242,17 @@ http_common_fields() -> mongo_common_fields() -> [ - {collection, #{ - type => atom(), - required => true, - desc => ?DESC(collection) - }}, - {filter, #{ - type => map(), - required => false, - default => #{}, - desc => ?DESC(filter) - }} + {collection, + ?HOCON(atom(), #{ + required => true, + desc => ?DESC(collection) + })}, + {filter, + ?HOCON(map(), #{ + required => false, + default => #{}, + desc => ?DESC(filter) + })} ]. validations() -> @@ -347,31 +333,31 @@ transform_header_name(Headers) -> Headers ). -%% TODO: fix me, not work check_ssl_opts(Conf) -> - case hocon_maps:get("config.url", Conf) of - undefined -> - true; - Url -> - case emqx_authz_http:parse_url(Url) of - {<<"https", _>>, _, _} -> - case hocon_maps:get("config.ssl.enable", Conf) of - true -> true; - _ -> {error, ssl_not_enable} - end; - {<<"http", _>>, _, _} -> - true; - Bad -> - {bad_scheme, Url, Bad} - end - end. - -union_array(Item) when is_list(Item) -> - hoconsc:array(hoconsc:union(Item)). + Sources = hocon_maps:get("authorization.sources", Conf, []), + lists:foreach( + fun + (#{<<"url">> := Url} = Source) -> + case emqx_authz_http:parse_url(Url) of + {<<"https", _/binary>>, _, _} -> + case emqx_map_lib:deep_find([<<"ssl">>, <<"enable">>], Source) of + {ok, true} -> true; + {ok, false} -> throw({ssl_not_enable, Url}); + _ -> throw({ssl_enable_not_found, Url}) + end; + {<<"http", _/binary>>, _, _} -> + ok; + Bad -> + throw({bad_scheme, Url, Bad}) + end; + (_Source) -> + ok + end, + Sources + ). query() -> - #{ - type => binary(), + ?HOCON(binary(), #{ desc => ?DESC(query), required => true, validator => fun(S) -> @@ -380,11 +366,10 @@ query() -> _ -> {error, "Request query"} end end - }. + }). cmd() -> - #{ - type => binary(), + ?HOCON(binary(), #{ desc => ?DESC(cmd), required => true, validator => fun(S) -> @@ -393,7 +378,7 @@ cmd() -> _ -> {error, "Request query"} end end - }. + }). connector_fields(DB) -> connector_fields(DB, config). @@ -417,7 +402,15 @@ to_list(B) when is_binary(B) -> common_rate_field() -> [ - {"rate", mk(float(), #{desc => ?DESC("rate")})}, - {"rate_max", mk(float(), #{desc => ?DESC("rate_max")})}, - {"rate_last5m", mk(float(), #{desc => ?DESC("rate_last5m")})} + {"rate", ?HOCON(float(), #{desc => ?DESC("rate")})}, + {"rate_max", ?HOCON(float(), #{desc => ?DESC("rate_max")})}, + {"rate_last5m", ?HOCON(float(), #{desc => ?DESC("rate_last5m")})} ]. + +method(Method) -> + ?HOCON(Method, #{default => Method, required => true, desc => ?DESC(method)}). + +array(Ref) -> array(Ref, Ref). + +array(Ref, DescId) -> + ?HOCON(?ARRAY(?R_REF(Ref)), #{desc => ?DESC(DescId)}). diff --git a/apps/emqx_auto_subscribe/src/emqx_auto_subscribe_schema.erl b/apps/emqx_auto_subscribe/src/emqx_auto_subscribe_schema.erl index 9531ac83f..94e4aa799 100644 --- a/apps/emqx_auto_subscribe/src/emqx_auto_subscribe_schema.erl +++ b/apps/emqx_auto_subscribe/src/emqx_auto_subscribe_schema.erl @@ -36,36 +36,36 @@ roots() -> fields("auto_subscribe") -> [ {topics, - hoconsc:mk( - hoconsc:array(hoconsc:ref(?MODULE, "topic")), + ?HOCON( + ?ARRAY(?R_REF("topic")), #{desc => ?DESC(auto_subscribe), default => []} )} ]; fields("topic") -> [ {topic, - sc(binary(), #{ + ?HOCON(binary(), #{ required => true, example => topic_example(), desc => ?DESC("topic") })}, {qos, - sc(emqx_schema:qos(), #{ + ?HOCON(emqx_schema:qos(), #{ default => 0, desc => ?DESC("qos") })}, {rh, - sc(range(0, 2), #{ + ?HOCON(range(0, 2), #{ default => 0, desc => ?DESC("rh") })}, {rap, - sc(range(0, 1), #{ + ?HOCON(range(0, 1), #{ default => 0, desc => ?DESC("rap") })}, {nl, - sc(range(0, 1), #{ + ?HOCON(range(0, 1), #{ default => 0, desc => ?DESC(nl) })} @@ -78,10 +78,3 @@ desc(_) -> undefined. topic_example() -> <<"/clientid/", ?PH_S_CLIENTID, "/username/", ?PH_S_USERNAME, "/host/", ?PH_S_HOST, "/port/", ?PH_S_PORT>>. - -%%-------------------------------------------------------------------- -%% Internal functions -%%-------------------------------------------------------------------- - -sc(Type, Meta) -> - hoconsc:mk(Type, Meta). diff --git a/apps/emqx_conf/src/emqx_conf_schema.erl b/apps/emqx_conf/src/emqx_conf_schema.erl index b68a7fc2b..820129dcd 100644 --- a/apps/emqx_conf/src/emqx_conf_schema.erl +++ b/apps/emqx_conf/src/emqx_conf_schema.erl @@ -341,6 +341,7 @@ fields(cluster_k8s) -> sc( string(), #{ + default => "http://10.110.111.204:8080", desc => ?DESC(cluster_k8s_apiserver), 'readOnly' => true } @@ -358,6 +359,7 @@ fields(cluster_k8s) -> sc( hoconsc:enum([ip, dns, hostname]), #{ + default => ip, desc => ?DESC(cluster_k8s_address_type), 'readOnly' => true } @@ -731,7 +733,7 @@ fields("rpc") -> emqx_schema:duration_s(), #{ mapping => "gen_rpc.socket_keepalive_idle", - default => "7200s", + default => "15m", desc => ?DESC(rpc_socket_keepalive_idle) } )}, diff --git a/apps/emqx_connector/src/emqx_connector_schema.erl b/apps/emqx_connector/src/emqx_connector_schema.erl index f92c12287..b0f20924f 100644 --- a/apps/emqx_connector/src/emqx_connector_schema.erl +++ b/apps/emqx_connector/src/emqx_connector_schema.erl @@ -20,8 +20,6 @@ -include_lib("typerefl/include/types.hrl"). -include_lib("hocon/include/hoconsc.hrl"). --import(hoconsc, [mk/2, ref/2]). - -export([namespace/0, roots/0, fields/1, desc/1]). -export([ @@ -46,8 +44,8 @@ post_request() -> http_schema("post"). http_schema(Method) -> - Schemas = [ref(schema_mod(Type), Method) || Type <- ?CONN_TYPES], - hoconsc:union(Schemas). + Schemas = [?R_REF(schema_mod(Type), Method) || Type <- ?CONN_TYPES], + ?UNION(Schemas). %%====================================================================================== %% Hocon Schema Definitions @@ -61,11 +59,8 @@ fields(connectors) -> fields("connectors") -> [ {mqtt, - mk( - hoconsc:map( - name, - ref(emqx_connector_mqtt_schema, "connector") - ), + ?HOCON( + ?MAP(name, ?R_REF(emqx_connector_mqtt_schema, "connector")), #{desc => ?DESC("mqtt")} )} ]. diff --git a/apps/emqx_dashboard/src/emqx_dashboard_schema.erl b/apps/emqx_dashboard/src/emqx_dashboard_schema.erl index 12a799418..55a1fd38c 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_schema.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_schema.erl @@ -30,14 +30,14 @@ roots() -> ["dashboard"]. fields("dashboard") -> [ {listeners, - sc( - ref("listeners"), + ?HOCON( + ?R_REF("listeners"), #{desc => ?DESC(listeners)} )}, {default_username, fun default_username/1}, {default_password, fun default_password/1}, {sample_interval, - sc( + ?HOCON( emqx_schema:duration_s(), #{ default => "10s", @@ -46,7 +46,7 @@ fields("dashboard") -> } )}, {token_expired_time, - sc( + ?HOCON( emqx_schema:duration(), #{ default => "60m", @@ -59,16 +59,16 @@ fields("dashboard") -> fields("listeners") -> [ {"http", - sc( - ref("http"), + ?HOCON( + ?R_REF("http"), #{ desc => "TCP listeners", required => {false, recursively} } )}, {"https", - sc( - ref("https"), + ?HOCON( + ?R_REF("https"), #{ desc => "SSL listeners", required => {false, recursively} @@ -78,13 +78,13 @@ fields("listeners") -> fields("http") -> [ enable(true), - bind(18803) + bind(18083) | common_listener_fields() ]; fields("https") -> [ enable(false), - bind(18804) + bind(18084) | common_listener_fields() ++ exclude_fields( ["fail_if_no_peer_cert"], @@ -104,7 +104,7 @@ exclude_fields([FieldName | Rest], Fields) -> common_listener_fields() -> [ {"num_acceptors", - sc( + ?HOCON( integer(), #{ default => 4, @@ -112,7 +112,7 @@ common_listener_fields() -> } )}, {"max_connections", - sc( + ?HOCON( integer(), #{ default => 512, @@ -120,7 +120,7 @@ common_listener_fields() -> } )}, {"backlog", - sc( + ?HOCON( integer(), #{ default => 1024, @@ -128,7 +128,7 @@ common_listener_fields() -> } )}, {"send_timeout", - sc( + ?HOCON( emqx_schema:duration(), #{ default => "5s", @@ -136,7 +136,7 @@ common_listener_fields() -> } )}, {"inet6", - sc( + ?HOCON( boolean(), #{ default => false, @@ -144,7 +144,7 @@ common_listener_fields() -> } )}, {"ipv6_v6only", - sc( + ?HOCON( boolean(), #{ default => false, @@ -155,7 +155,7 @@ common_listener_fields() -> enable(Bool) -> {"enable", - sc( + ?HOCON( boolean(), #{ default => Bool, @@ -166,12 +166,12 @@ enable(Bool) -> bind(Port) -> {"bind", - sc( - hoconsc:union([non_neg_integer(), emqx_schema:ip_port()]), + ?HOCON( + ?UNION([non_neg_integer(), emqx_schema:ip_port()]), #{ default => Port, required => true, - extra => #{example => [Port, "0.0.0.0:" ++ integer_to_list(Port)]}, + example => "0.0.0.0:" ++ integer_to_list(Port), desc => ?DESC(bind) } )}. @@ -222,7 +222,3 @@ validate_sample_interval(Second) -> Msg = "must be between 1 and 60 and be a divisor of 60.", {error, Msg} end. - -sc(Type, Meta) -> hoconsc:mk(Type, Meta). - -ref(Field) -> hoconsc:ref(?MODULE, Field). diff --git a/apps/emqx_dashboard/src/emqx_dashboard_swagger.erl b/apps/emqx_dashboard/src/emqx_dashboard_swagger.erl index 976fa97cd..0430efdf2 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_swagger.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_swagger.erl @@ -667,6 +667,8 @@ typename_to_spec("{binary(), binary()}", _Mod) -> #{type => object, example => #{}}; typename_to_spec("comma_separated_list()", _Mod) -> #{type => string, example => <<"item1,item2">>}; +typename_to_spec("comma_separated_binary()", _Mod) -> + #{type => string, example => <<"item1,item2">>}; typename_to_spec("comma_separated_atoms()", _Mod) -> #{type => string, example => <<"item1,item2">>}; typename_to_spec("pool_type()", _Mod) -> diff --git a/apps/emqx_exhook/src/emqx_exhook_schema.erl b/apps/emqx_exhook/src/emqx_exhook_schema.erl index 25f62c2e1..3454ab14c 100644 --- a/apps/emqx_exhook/src/emqx_exhook_schema.erl +++ b/apps/emqx_exhook/src/emqx_exhook_schema.erl @@ -27,12 +27,6 @@ -behaviour(hocon_schema). --type duration() :: integer(). - --typerefl_from_string({duration/0, emqx_schema, to_duration}). - --reflect_type([duration/0]). - -export([namespace/0, roots/0, fields/1, desc/1, server_config/0]). namespace() -> exhook. @@ -42,65 +36,48 @@ roots() -> [exhook]. fields(exhook) -> [ {servers, - sc( - hoconsc:array(ref(server)), - #{ - default => [], - desc => ?DESC(servers) - } - )} + ?HOCON(?ARRAY(?R_REF(server)), #{ + default => [], + desc => ?DESC(servers) + })} ]; fields(server) -> [ {name, - sc( - binary(), - #{ - required => true, - validator => fun validate_name/1, - desc => ?DESC(name) - } - )}, + ?HOCON(binary(), #{ + example => <<"default">>, + required => true, + validator => fun validate_name/1, + desc => ?DESC(name) + })}, {enable, - sc( - boolean(), - #{ - default => true, - desc => ?DESC(enable) - } - )}, + ?HOCON(boolean(), #{ + default => true, + desc => ?DESC(enable) + })}, {url, - sc( - binary(), - #{required => true, desc => ?DESC(url)} - )}, + ?HOCON(binary(), #{ + required => true, + desc => ?DESC(url), + example => <<"http://127.0.0.1:9000">> + })}, {request_timeout, - sc( - duration(), - #{ - default => "5s", - desc => ?DESC(request_timeout) - } - )}, + ?HOCON(emqx_schema:duration(), #{ + default => "5s", + desc => ?DESC(request_timeout) + })}, {failed_action, failed_action()}, - {ssl, sc(ref(ssl_conf), #{})}, + {ssl, ?HOCON(?R_REF(ssl_conf), #{})}, {auto_reconnect, - sc( - hoconsc:union([false, duration()]), - #{ - default => "60s", - desc => ?DESC(auto_reconnect) - } - )}, + ?HOCON(hoconsc:union([false, emqx_schema:duration()]), #{ + default => "60s", + desc => ?DESC(auto_reconnect) + })}, {pool_size, - sc( - pos_integer(), - #{ - default => 8, - example => 8, - desc => ?DESC(pool_size) - } - )} + ?HOCON(pos_integer(), #{ + default => 8, + desc => ?DESC(pool_size) + })} ]; fields(ssl_conf) -> Schema = emqx_schema:client_ssl_opts_schema(#{}), @@ -115,20 +92,11 @@ desc(ssl_conf) -> desc(_) -> undefined. -%% types -sc(Type, Meta) -> Meta#{type => Type}. - -ref(Field) -> - hoconsc:ref(?MODULE, Field). - failed_action() -> - sc( - hoconsc:enum([deny, ignore]), - #{ - default => deny, - desc => ?DESC(failed_action) - } - ). + ?HOCON(?ENUM([deny, ignore]), #{ + default => deny, + desc => ?DESC(failed_action) + }). validate_name(Name) -> NameRE = "^[A-Za-z0-9]+[A-Za-z0-9-_]*$", @@ -138,7 +106,7 @@ validate_name(Name) -> case re:run(Name, NameRE) of {match, _} -> ok; - _Nomatch -> + _NoMatch -> Reason = list_to_binary( io_lib:format("Bad ExHook Name ~p, expect ~p", [Name, NameRE]) ), diff --git a/apps/emqx_gateway/src/emqx_gateway_schema.erl b/apps/emqx_gateway/src/emqx_gateway_schema.erl index f3b3a0fa6..12e0abede 100644 --- a/apps/emqx_gateway/src/emqx_gateway_schema.erl +++ b/apps/emqx_gateway/src/emqx_gateway_schema.erl @@ -215,7 +215,7 @@ fields(coap) -> )}, {notify_type, sc( - hoconsc:union([non, con, qos]), + hoconsc:enum([non, con, qos]), #{ default => qos, desc => ?DESC(coap_notify_type) @@ -291,9 +291,9 @@ fields(lwm2m) -> %% FIXME: not working now {update_msg_publish_condition, sc( - hoconsc:union([always, contains_object_list]), + hoconsc:enum([always, contains_object_list]), #{ - default => "contains_object_list", + default => contains_object_list, desc => ?DESC(lwm2m_update_msg_publish_condition) } )}, diff --git a/apps/emqx_modules/src/emqx_modules_schema.erl b/apps/emqx_modules/src/emqx_modules_schema.erl index e1fb8c8c3..d2d6258d1 100644 --- a/apps/emqx_modules/src/emqx_modules_schema.erl +++ b/apps/emqx_modules/src/emqx_modules_schema.erl @@ -39,33 +39,34 @@ roots() -> ]. fields("telemetry") -> - [{enable, hoconsc:mk(boolean(), #{default => true, desc => "Enable telemetry."})}]; + [{enable, ?HOCON(boolean(), #{default => true, desc => "Enable telemetry."})}]; fields("delayed") -> [ - {enable, hoconsc:mk(boolean(), #{default => true, desc => ?DESC(enable)})}, - {max_delayed_messages, sc(integer(), #{desc => ?DESC(max_delayed_messages), default => 0})} + {enable, ?HOCON(boolean(), #{default => true, desc => ?DESC(enable)})}, + {max_delayed_messages, + ?HOCON(integer(), #{desc => ?DESC(max_delayed_messages), default => 0})} ]; fields("rewrite") -> [ {action, - sc( + ?HOCON( hoconsc:enum([subscribe, publish, all]), #{required => true, desc => ?DESC(tr_action), example => publish} )}, {source_topic, - sc( + ?HOCON( binary(), #{required => true, desc => ?DESC(tr_source_topic), example => "x/#"} )}, {dest_topic, - sc( + ?HOCON( binary(), #{required => true, desc => ?DESC(tr_dest_topic), example => "z/y/$1"} )}, {re, fun regular_expression/1} ]; fields("topic_metrics") -> - [{topic, sc(binary(), #{desc => "Collect metrics for the topic."})}]. + [{topic, ?HOCON(binary(), #{desc => "Collect metrics for the topic."})}]. desc("telemetry") -> "Settings for the telemetry module."; @@ -91,6 +92,4 @@ is_re(Bin) -> {error, Reason} -> {error, {Bin, Reason}} end. -array(Name, Meta) -> {Name, hoconsc:mk(hoconsc:array(hoconsc:ref(?MODULE, Name)), Meta)}. - -sc(Type, Meta) -> hoconsc:mk(Type, Meta). +array(Name, Meta) -> {Name, ?HOCON(?ARRAY(?R_REF(Name)), Meta)}. diff --git a/apps/emqx_plugins/src/emqx_plugins_schema.erl b/apps/emqx_plugins/src/emqx_plugins_schema.erl index ceb8b992f..7ca2e1d00 100644 --- a/apps/emqx_plugins/src/emqx_plugins_schema.erl +++ b/apps/emqx_plugins/src/emqx_plugins_schema.erl @@ -45,7 +45,7 @@ fields(state) -> state_fields() -> [ {name_vsn, - hoconsc:mk( + ?HOCON( string(), #{ desc => ?DESC(name_vsn), @@ -53,7 +53,7 @@ state_fields() -> } )}, {enable, - hoconsc:mk( + ?HOCON( boolean(), #{ desc => ?DESC(enable), @@ -69,7 +69,7 @@ root_fields() -> {check_interval, fun check_interval/1} ]. -states(type) -> hoconsc:array(hoconsc:ref(?MODULE, state)); +states(type) -> ?ARRAY(?R_REF(state)); states(required) -> false; states(default) -> []; states(desc) -> ?DESC(states); diff --git a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl index 300450260..efd453135 100644 --- a/apps/emqx_prometheus/src/emqx_prometheus_schema.erl +++ b/apps/emqx_prometheus/src/emqx_prometheus_schema.erl @@ -34,7 +34,7 @@ roots() -> ["prometheus"]. fields("prometheus") -> [ {push_gateway_server, - sc( + ?HOCON( string(), #{ default => "http://127.0.0.1:9091", @@ -43,7 +43,7 @@ fields("prometheus") -> } )}, {interval, - sc( + ?HOCON( emqx_schema:duration_ms(), #{ default => "15s", @@ -52,7 +52,7 @@ fields("prometheus") -> } )}, {enable, - sc( + ?HOCON( boolean(), #{ default => false, @@ -64,5 +64,3 @@ fields("prometheus") -> desc("prometheus") -> ?DESC(prometheus); desc(_) -> undefined. - -sc(Type, Meta) -> hoconsc:mk(Type, Meta). diff --git a/apps/emqx_psk/src/emqx_psk_schema.erl b/apps/emqx_psk/src/emqx_psk_schema.erl index 201f52c57..769078b5b 100644 --- a/apps/emqx_psk/src/emqx_psk_schema.erl +++ b/apps/emqx_psk/src/emqx_psk_schema.erl @@ -27,8 +27,6 @@ fields/1 ]). --import(emqx_schema, [sc/2]). - namespace() -> "authn-psk". roots() -> ["psk_authentication"]. @@ -42,33 +40,24 @@ fields("psk_authentication") -> fields() -> [ {enable, - sc(boolean(), #{ + ?HOCON(boolean(), #{ default => false, require => true, desc => ?DESC(enable) })}, {init_file, - sc( - binary(), - #{ - required => false, - desc => ?DESC(init_file) - } - )}, + ?HOCON(binary(), #{ + required => false, + desc => ?DESC(init_file) + })}, {separator, - sc( - binary(), - #{ - default => <<":">>, - desc => ?DESC(separator) - } - )}, + ?HOCON(binary(), #{ + default => <<":">>, + desc => ?DESC(separator) + })}, {chunk_size, - sc( - integer(), - #{ - default => 50, - desc => ?DESC(chunk_size) - } - )} + ?HOCON(integer(), #{ + default => 50, + desc => ?DESC(chunk_size) + })} ]. diff --git a/apps/emqx_retainer/src/emqx_retainer_schema.erl b/apps/emqx_retainer/src/emqx_retainer_schema.erl index db419bf1d..547b72fc5 100644 --- a/apps/emqx_retainer/src/emqx_retainer_schema.erl +++ b/apps/emqx_retainer/src/emqx_retainer_schema.erl @@ -52,10 +52,10 @@ fields("retainer") -> ]; fields(mnesia_config) -> [ - {type, sc(hoconsc:enum([built_in_database]), mnesia_config_type, built_in_database)}, + {type, sc(built_in_database, mnesia_config_type, built_in_database)}, {storage_type, sc( - hoconsc:union([ram, disc]), + hoconsc:enum([ram, disc]), mnesia_config_storage_type, ram )}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl index 55d8586e4..2025c2186 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_schema.erl @@ -37,13 +37,13 @@ roots() -> ["rule_engine"]. fields("rule_engine") -> [ {ignore_sys_message, - sc(boolean(), #{default => true, desc => ?DESC("rule_engine_ignore_sys_message")})}, + ?HOCON(boolean(), #{default => true, desc => ?DESC("rule_engine_ignore_sys_message")})}, {rules, - sc(hoconsc:map("id", ref("rules")), #{ + ?HOCON(hoconsc:map("id", ?R_REF("rules")), #{ desc => ?DESC("rule_engine_rules"), default => #{} })}, {jq_function_default_timeout, - sc( + ?HOCON( emqx_schema:duration_ms(), #{ default => "10s", @@ -55,7 +55,7 @@ fields("rules") -> [ rule_name(), {"sql", - sc( + ?HOCON( binary(), #{ desc => ?DESC("rules_sql"), @@ -65,8 +65,8 @@ fields("rules") -> } )}, {"actions", - sc( - hoconsc:array(hoconsc:union(actions())), + ?HOCON( + ?ARRAY(?UNION(actions())), #{ desc => ?DESC("rules_actions"), default => [], @@ -82,9 +82,9 @@ fields("rules") -> ] } )}, - {"enable", sc(boolean(), #{desc => ?DESC("rules_enable"), default => true})}, + {"enable", ?HOCON(boolean(), #{desc => ?DESC("rules_enable"), default => true})}, {"description", - sc( + ?HOCON( binary(), #{ desc => ?DESC("rules_description"), @@ -95,12 +95,12 @@ fields("rules") -> ]; fields("builtin_action_republish") -> [ - {function, sc(republish, #{desc => ?DESC("republish_function")})}, - {args, sc(ref("republish_args"), #{default => #{}})} + {function, ?HOCON(republish, #{desc => ?DESC("republish_function")})}, + {args, ?HOCON(?R_REF("republish_args"), #{default => #{}})} ]; fields("builtin_action_console") -> [ - {function, sc(console, #{desc => ?DESC("console_function")})} + {function, ?HOCON(console, #{desc => ?DESC("console_function")})} %% we may support some args for the console action in the future %, {args, sc(map(), #{desc => "The arguments of the built-in 'console' action", % default => #{}})} @@ -108,7 +108,7 @@ fields("builtin_action_console") -> fields("user_provided_function") -> [ {function, - sc( + ?HOCON( binary(), #{ desc => ?DESC("user_provided_function_function"), @@ -117,7 +117,7 @@ fields("user_provided_function") -> } )}, {args, - sc( + ?HOCON( map(), #{ desc => ?DESC("user_provided_function_args"), @@ -128,7 +128,7 @@ fields("user_provided_function") -> fields("republish_args") -> [ {topic, - sc( + ?HOCON( binary(), #{ desc => ?DESC("republish_args_topic"), @@ -137,7 +137,7 @@ fields("republish_args") -> } )}, {qos, - sc( + ?HOCON( qos(), #{ desc => ?DESC("republish_args_qos"), @@ -146,8 +146,8 @@ fields("republish_args") -> } )}, {retain, - sc( - hoconsc:union([binary(), boolean()]), + ?HOCON( + hoconsc:union([boolean(), binary()]), #{ desc => ?DESC("republish_args_retain"), default => <<"${retain}">>, @@ -155,7 +155,7 @@ fields("republish_args") -> } )}, {payload, - sc( + ?HOCON( binary(), #{ desc => ?DESC("republish_args_payload"), @@ -182,7 +182,7 @@ desc(_) -> rule_name() -> {"name", - sc( + ?HOCON( binary(), #{ desc => ?DESC("rules_name"), @@ -195,19 +195,16 @@ rule_name() -> actions() -> [ binary(), - ref("builtin_action_republish"), - ref("builtin_action_console"), - ref("user_provided_function") + ?R_REF("builtin_action_republish"), + ?R_REF("builtin_action_console"), + ?R_REF("user_provided_function") ]. qos() -> - hoconsc:union([emqx_schema:qos(), binary()]). + ?UNION([emqx_schema:qos(), binary()]). validate_sql(Sql) -> case emqx_rule_sqlparser:parse(Sql) of {ok, _Result} -> ok; {error, Reason} -> {error, Reason} end. - -sc(Type, Meta) -> hoconsc:mk(Type, Meta). -ref(Field) -> hoconsc:ref(?MODULE, Field). diff --git a/apps/emqx_slow_subs/src/emqx_slow_subs_schema.erl b/apps/emqx_slow_subs/src/emqx_slow_subs_schema.erl index b7f7337d2..51c86d6a0 100644 --- a/apps/emqx_slow_subs/src/emqx_slow_subs_schema.erl +++ b/apps/emqx_slow_subs/src/emqx_slow_subs_schema.erl @@ -32,7 +32,7 @@ fields("slow_subs") -> )}, {stats_type, sc( - hoconsc:enum([whole, internal, response]), + ?ENUM([whole, internal, response]), whole, stats_type )} @@ -47,4 +47,4 @@ desc(_) -> %% Internal functions %%-------------------------------------------------------------------- sc(Type, Default, Desc) -> - hoconsc:mk(Type, #{default => Default, desc => ?DESC(Desc)}). + ?HOCON(Type, #{default => Default, desc => ?DESC(Desc)}).