Browse Source

Merge pull request #5767 from lafirest/fix/time_unit

fix(schema): fix some time unit in schema
lafirest 4 years ago
parent
commit
acb5c693ba

+ 15 - 4
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,
@@ -1191,7 +1191,7 @@ default_ciphers(psk) ->
 keys(Parent, Conf) ->
     [binary_to_list(B) || B <- maps:keys(conf_get(Parent, Conf, #{}))].
 
--spec ceiling(float()) -> integer().
+-spec ceiling(number()) -> integer().
 ceiling(X) ->
     T = erlang:trunc(X),
     case (X - T) of
@@ -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};
@@ -1218,13 +1227,15 @@ to_duration(Str) ->
 
 to_duration_s(Str) ->
     case hocon_postprocess:duration(Str) of
-        I when is_integer(I) -> {ok, ceiling(I / 1000)};
+        I when is_number(I) -> {ok, ceiling(I / 1000)};
         _ -> {error, Str}
     end.
 
+-spec to_duration_ms(Input) -> {ok, integer()} | {error, Input}
+              when Input :: string() | binary().
 to_duration_ms(Str) ->
     case hocon_postprocess:duration(Str) of
-        I when is_integer(I) -> {ok, ceiling(I)};
+        I when is_number(I) -> {ok, ceiling(I)};
         _ -> {error, Str}
     end.
 

+ 10 - 10
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,

+ 2 - 2
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.
 
 %%------------------------------------------------------------------------------

+ 2 - 2
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.
 
 %%------------------------------------------------------------------------------

+ 8 - 8
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},

+ 4 - 2
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
               }

+ 1 - 1
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,

+ 4 - 4
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();

+ 5 - 3
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(integer(), #{default => 300})}
-    , {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 => []})}

+ 3 - 3
apps/emqx_gateway/src/coap/emqx_coap_api.erl

@@ -52,8 +52,8 @@ request(post, #{body := Body, bindings := Bindings}) ->
     CT = maps:get(<<"content_type">>, Body, <<"text/plain">>),
     Token = maps:get(<<"token">>, Body, <<>>),
     Payload = maps:get(<<"payload">>, Body, <<>>),
-    WaitTime =  maps:get(<<"timeout">>, Body, ?DEF_WAIT_TIME),
-
+    BinWaitTime = maps:get(<<"timeout">>, Body, <<"10s">>),
+    {ok, WaitTime} = emqx_schema:to_duration_ms(BinWaitTime),
     Payload2 = parse_payload(CT, Payload),
     ReqType = erlang:binary_to_atom(Method),
 
@@ -83,7 +83,7 @@ request_parameters() ->
 request_properties() ->
     properties([ {token, string, "message token, can be empty"}
                , {method, string, "request method type", ["get", "put", "post", "delete"]}
-               , {timeout, integer, "timespan for response"}
+               , {timeout, string, "timespan for response", "10s"}
                , {content_type, string, "payload type",
                   [<<"text/plain">>, <<"application/json">>, <<"application/octet-stream">>]}
                , {payload, string, "payload"}]).

+ 1 - 1
apps/emqx_gateway/test/emqx_coap_api_SUITE.erl

@@ -71,7 +71,7 @@ t_send_request_api(_) ->
     Payload = <<"simple echo this">>,
     Req = #{token => Token,
             payload => Payload,
-            timeout => 10,
+            timeout => <<"10s">>,
             content_type => <<"text/plain">>,
             method => <<"get">>},
     Auth = emqx_mgmt_api_test_util:auth_header_(),