diff --git a/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl b/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl index c1a6ee6f7..00fd6fdc0 100644 --- a/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl +++ b/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl @@ -69,7 +69,11 @@ fields(?ACTION) -> }), #{ required => true, - desc => ?DESC(s3_upload) + desc => ?DESC(s3_upload), + %% NOTE + %% There seems to be no way to attach validators to union types, thus we + %% have to attach a "common denominator" validator here. + validator => validators(s3_upload_parameters) } ), #{ @@ -211,6 +215,9 @@ desc(s3_upload_resource_opts) -> desc(_Name) -> undefined. +validators(s3_upload_parameters) -> + emqx_s3_schema:validators(s3_uploader). + convert_actions(Conf = #{}, Opts) -> maps:map(fun(_Name, ConfAction) -> convert_action(ConfAction, Opts) end, Conf); convert_actions(undefined, _) -> diff --git a/apps/emqx_bridge_s3/test/emqx_bridge_s3_aggreg_upload_SUITE.erl b/apps/emqx_bridge_s3/test/emqx_bridge_s3_aggreg_upload_SUITE.erl index 538e7b306..09cf12329 100644 --- a/apps/emqx_bridge_s3/test/emqx_bridge_s3_aggreg_upload_SUITE.erl +++ b/apps/emqx_bridge_s3/test/emqx_bridge_s3_aggreg_upload_SUITE.erl @@ -156,6 +156,24 @@ t_create_via_http(Config) -> t_on_get_status(Config) -> emqx_bridge_v2_testlib:t_on_get_status(Config, #{}). +t_invalid_config(Config) -> + ?assertMatch( + {error, + {_Status, _, #{ + <<"code">> := <<"BAD_REQUEST">>, + <<"message">> := #{<<"kind">> := <<"validation_error">>} + }}}, + emqx_bridge_v2_testlib:create_bridge_api( + Config, + _Overrides = #{ + <<"parameters">> => #{ + <<"min_part_size">> => <<"5GB">>, + <<"max_part_size">> => <<"100MB">> + } + } + ) + ). + t_aggreg_upload(Config) -> Bucket = ?config(s3_bucket, Config), BridgeName = ?config(bridge_name, Config), diff --git a/apps/emqx_s3/src/emqx_s3_schema.erl b/apps/emqx_s3/src/emqx_s3_schema.erl index 1fa6d31cd..efef32aa0 100644 --- a/apps/emqx_s3/src/emqx_s3_schema.erl +++ b/apps/emqx_s3/src/emqx_s3_schema.erl @@ -10,6 +10,7 @@ -import(hoconsc, [mk/2, ref/2]). -export([roots/0, fields/1, namespace/0, tags/0, desc/1]). +-export([validators/1]). -export([translate/1]). -export([translate/2]). @@ -177,6 +178,14 @@ desc(s3_upload) -> desc(transport_options) -> "Options for the HTTP transport layer used by the S3 client". +validators(s3_uploader) -> + [fun validate_part_size/1]. + +validate_part_size(Conf) -> + Min = hocon_maps:get(<<"min_part_size">>, Conf), + Max = hocon_maps:get(<<"max_part_size">>, Conf), + Min =< Max orelse {error, <<"Inconsistent 'min_part_size': cannot exceed 'max_part_size'">>}. + translate(Conf) -> translate(Conf, #{}).