From 6e3ec6c9db43f67ff88938e385b2b2afceb1e741 Mon Sep 17 00:00:00 2001 From: lafirest Date: Thu, 23 Sep 2021 13:23:51 +0800 Subject: [PATCH] fix(schema): fix authn/z's schema time unit --- apps/emqx/src/emqx_schema.erl | 11 +++++++++- apps/emqx_authn/src/emqx_authn_api.erl | 20 +++++++++---------- .../src/simple_authn/emqx_authn_http.erl | 4 ++-- .../src/simple_authn/emqx_authn_mysql.erl | 4 ++-- apps/emqx_authz/src/emqx_authz_api_schema.erl | 16 +++++++-------- apps/emqx_authz/src/emqx_authz_schema.erl | 6 ++++-- .../test/emqx_authz_api_sources_SUITE.erl | 2 +- .../src/emqx_connector_http.erl | 8 ++++---- .../src/mqtt/emqx_connector_mqtt_schema.erl | 8 +++++--- 9 files changed, 46 insertions(+), 33 deletions(-) diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index a4cea319c..3a913f115 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -55,7 +55,7 @@ % workaround: prevent being recognized as unused functions -export([to_duration/1, to_duration_s/1, to_duration_ms/1, - to_bytesize/1, to_wordsize/1, + mk_duration/2, to_bytesize/1, to_wordsize/1, to_percent/1, to_comma_separated_list/1, to_bar_separated_list/1, to_ip_port/1, to_erl_cipher_suite/1, @@ -1210,6 +1210,15 @@ ref(Field) -> hoconsc:ref(?MODULE, Field). ref(Module, Field) -> hoconsc:ref(Module, Field). +mk_duration(Desc, OverrideMeta) -> + DefaultMeta = #{desc => Desc ++ " Time span. A text string with number followed by time units: + `ms` for milli-seconds, + `s` for seconds, + `m` for minutes, + `h` for hours; + or combined representation like `1h5m0s`"}, + hoconsc:mk(typerefl:alias("string", duration()), maps:merge(DefaultMeta, OverrideMeta)). + to_duration(Str) -> case hocon_postprocess:duration(Str) of I when is_integer(I) -> {ok, I}; diff --git a/apps/emqx_authn/src/emqx_authn_api.erl b/apps/emqx_authn/src/emqx_authn_api.erl index d115131a5..827e08dab 100644 --- a/apps/emqx_authn/src/emqx_authn_api.erl +++ b/apps/emqx_authn/src/emqx_authn_api.erl @@ -91,7 +91,7 @@ enable => true})). -define(INSTANCE_EXAMPLE_2, maps:merge(?EXAMPLE_2, #{id => <<"password-based:http-server">>, - connect_timeout => 5000, + connect_timeout => "5s", enable_pipelining => true, headers => #{ <<"accept">> => <<"application/json">>, @@ -102,8 +102,8 @@ }, max_retries => 5, pool_size => 8, - request_timeout => 5000, - retry_interval => 1000, + request_timeout => "5s", + retry_interval => "1s", enable => true})). -define(INSTANCE_EXAMPLE_3, maps:merge(?EXAMPLE_3, #{id => <<"jwt">>, @@ -1259,9 +1259,9 @@ definitions() -> example => <<"SELECT password_hash FROM mqtt_user WHERE username = ${mqtt-username}">> }, query_timeout => #{ - type => integer, - description => <<"Query timeout, Unit: Milliseconds">>, - default => 5000 + type => string, + description => <<"Query timeout">>, + default => "5s" } } }, @@ -1528,16 +1528,16 @@ definitions() -> type => object }, connect_timeout => #{ - type => integer, - default => 5000 + type => string, + default => <<"5s">> }, max_retries => #{ type => integer, default => 5 }, retry_interval => #{ - type => integer, - default => 1000 + type => string, + default => <<"1s">> }, request_timout => #{ type => integer, 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 2fa29d2df..f08bb13aa 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_http.erl @@ -100,8 +100,8 @@ body(type) -> map(); body(validator) -> [fun check_body/1]; body(_) -> undefined. -request_timeout(type) -> non_neg_integer(); -request_timeout(default) -> 5000; +request_timeout(type) -> emqx_schema:duration_ms(); +request_timeout(default) -> "5s"; request_timeout(_) -> undefined. %%------------------------------------------------------------------------------ diff --git a/apps/emqx_authn/src/simple_authn/emqx_authn_mysql.erl b/apps/emqx_authn/src/simple_authn/emqx_authn_mysql.erl index 87c61da1e..60cde53e7 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_mysql.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_mysql.erl @@ -65,8 +65,8 @@ salt_position(_) -> undefined. query(type) -> string(); query(_) -> undefined. -query_timeout(type) -> integer(); -query_timeout(default) -> 5000; +query_timeout(type) -> emqx_schema:duration_ms(); +query_timeout(default) -> "5s"; query_timeout(_) -> undefined. %%------------------------------------------------------------------------------ diff --git a/apps/emqx_authz/src/emqx_authz_api_schema.erl b/apps/emqx_authz/src/emqx_authz_api_schema.erl index b41aaf3b3..bb9c88a70 100644 --- a/apps/emqx_authz/src/emqx_authz_api_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_api_schema.erl @@ -79,9 +79,9 @@ definitions() -> }, headers => #{type => object}, body => #{type => object}, - connect_timeout => #{type => integer}, + connect_timeout => #{type => string}, max_retries => #{type => integer}, - retry_interval => #{type => integer}, + retry_interval => #{type => string}, pool_type => #{ type => string, enum => [<<"random">>, <<"hash">>], @@ -133,8 +133,8 @@ definitions() -> properties => #{ pool_size => #{type => integer}, max_overflow => #{type => integer}, - overflow_ttl => #{type => integer}, - overflow_check_period => #{type => integer}, + overflow_ttl => #{type => string}, + overflow_check_period => #{type => string}, local_threshold_ms => #{type => integer}, connect_timeout_ms => #{type => integer}, socket_timeout_ms => #{type => integer}, @@ -191,8 +191,8 @@ definitions() -> properties => #{ pool_size => #{type => integer}, max_overflow => #{type => integer}, - overflow_ttl => #{type => integer}, - overflow_check_period => #{type => integer}, + overflow_ttl => #{type => string}, + overflow_check_period => #{type => string}, local_threshold_ms => #{type => integer}, connect_timeout_ms => #{type => integer}, socket_timeout_ms => #{type => integer}, @@ -247,8 +247,8 @@ definitions() -> properties => #{ pool_size => #{type => integer}, max_overflow => #{type => integer}, - overflow_ttl => #{type => integer}, - overflow_check_period => #{type => integer}, + overflow_ttl => #{type => string}, + overflow_check_period => #{type => string}, local_threshold_ms => #{type => integer}, connect_timeout_ms => #{type => integer}, socket_timeout_ms => #{type => integer}, diff --git a/apps/emqx_authz/src/emqx_authz_schema.erl b/apps/emqx_authz/src/emqx_authz_schema.erl index c880b7669..2838dcb2e 100644 --- a/apps/emqx_authz/src/emqx_authz_schema.erl +++ b/apps/emqx_authz/src/emqx_authz_schema.erl @@ -18,6 +18,8 @@ , fields/1 ]). +-import(emqx_schema, [mk_duration/2]). + namespace() -> authz. %% @doc authorization schema is not exported @@ -77,7 +79,7 @@ fields(http_get) -> end } } - , {request_timeout, #{type => timeout(), default => 30000 }} + , {request_timeout, mk_duration("request timeout", #{default => "30s"})} ] ++ proplists:delete(base_url, emqx_connector_http:fields(config)); fields(http_post) -> [ {type, #{type => http}} @@ -107,7 +109,7 @@ fields(http_post) -> end } } - , {request_timeout, #{type => timeout(), default => 30000 }} + , {request_timeout, mk_duration("request timeout", #{default => "30s"})} , {body, #{type => map(), nullable => true } diff --git a/apps/emqx_authz/test/emqx_authz_api_sources_SUITE.erl b/apps/emqx_authz/test/emqx_authz_api_sources_SUITE.erl index d000162c0..86b347b98 100644 --- a/apps/emqx_authz/test/emqx_authz_api_sources_SUITE.erl +++ b/apps/emqx_authz/test/emqx_authz_api_sources_SUITE.erl @@ -42,7 +42,7 @@ <<"url">> => <<"https://fake.com:443/">>, <<"headers">> => #{}, <<"method">> => <<"get">>, - <<"request_timeout">> => 5000 + <<"request_timeout">> => <<"5s">> }). -define(SOURCE2, #{<<"type">> => <<"mongodb">>, <<"enable">> => true, diff --git a/apps/emqx_connector/src/emqx_connector_http.erl b/apps/emqx_connector/src/emqx_connector_http.erl index 0f8c23986..272f24556 100644 --- a/apps/emqx_connector/src/emqx_connector_http.erl +++ b/apps/emqx_connector/src/emqx_connector_http.erl @@ -71,16 +71,16 @@ base_url(validator) -> fun(#{query := _Query}) -> end; base_url(_) -> undefined. -connect_timeout(type) -> connect_timeout(); -connect_timeout(default) -> 5000; +connect_timeout(type) -> emqx_schema:duration_ms(); +connect_timeout(default) -> "5s"; connect_timeout(_) -> undefined. max_retries(type) -> non_neg_integer(); max_retries(default) -> 5; max_retries(_) -> undefined. -retry_interval(type) -> non_neg_integer(); -retry_interval(default) -> 1000; +retry_interval(type) -> emqx_schema:duration_ms(); +retry_interval(default) -> "1s"; retry_interval(_) -> undefined. pool_type(type) -> pool_type(); diff --git a/apps/emqx_connector/src/mqtt/emqx_connector_mqtt_schema.erl b/apps/emqx_connector/src/mqtt/emqx_connector_mqtt_schema.erl index 14e550f0c..b0aaeb8b6 100644 --- a/apps/emqx_connector/src/mqtt/emqx_connector_mqtt_schema.erl +++ b/apps/emqx_connector/src/mqtt/emqx_connector_mqtt_schema.erl @@ -23,19 +23,21 @@ -export([ roots/0 , fields/1]). +-import(emqx_schema, [mk_duration/2]). + roots() -> [{config, #{type => hoconsc:ref(?MODULE, "config")}}]. fields("config") -> [ {server, hoconsc:mk(emqx_schema:ip_port(), #{default => "127.0.0.1:1883"})} - , {reconnect_interval, hoconsc:mk(emqx_schema:duration_ms(), #{default => "30s"})} + , {reconnect_interval, mk_duration("reconnect interval", #{default => "30s"})} , {proto_ver, fun proto_ver/1} , {bridge_mode, hoconsc:mk(boolean(), #{default => true})} , {username, hoconsc:mk(string())} , {password, hoconsc:mk(string())} , {clean_start, hoconsc:mk(boolean(), #{default => true})} - , {keepalive, hoconsc:mk(emqx_schema:duration_s(), #{default => "300s"})} - , {retry_interval, hoconsc:mk(emqx_schema:duration_ms(), #{default => "30s"})} + , {keepalive, mk_duration("keepalive", #{default => "300s"})} + , {retry_interval, mk_duration("retry interval", #{default => "30s"})} , {max_inflight, hoconsc:mk(integer(), #{default => 32})} , {replayq, hoconsc:mk(hoconsc:ref(?MODULE, "replayq"))} , {ingress_channels, hoconsc:mk(hoconsc:map(id, hoconsc:ref(?MODULE, "ingress_channels")), #{default => []})}