diff --git a/apps/emqx_bridge/src/emqx_bridge_api.erl b/apps/emqx_bridge/src/emqx_bridge_api.erl index fe7b576f5..c9c761105 100644 --- a/apps/emqx_bridge/src/emqx_bridge_api.erl +++ b/apps/emqx_bridge/src/emqx_bridge_api.erl @@ -143,7 +143,7 @@ param_path_id() -> #{ in => path, required => true, - example => <<"webhook:webhook_example">>, + example => <<"http:http_example">>, desc => ?DESC("desc_param_path_id") } )}. @@ -166,9 +166,9 @@ bridge_info_array_example(Method) -> bridge_info_examples(Method) -> maps:merge( #{ - <<"webhook_example">> => #{ - summary => <<"WebHook">>, - value => info_example(webhook, Method) + <<"http_example">> => #{ + summary => <<"HTTP">>, + value => info_example(http, Method) }, <<"mqtt_example">> => #{ summary => <<"MQTT Bridge">>, @@ -201,7 +201,7 @@ method_example(Type, Method) when Method == get; Method == post -> method_example(_Type, put) -> #{}. -info_example_basic(webhook) -> +info_example_basic(http) -> #{ enable => true, url => <<"http://localhost:9901/messages/${topic}">>, @@ -212,7 +212,7 @@ info_example_basic(webhook) -> pool_size => 4, enable_pipelining => 100, ssl => #{enable => false}, - local_topic => <<"emqx_webhook/#">>, + local_topic => <<"emqx_http/#">>, method => post, body => <<"${payload}">>, resource_opts => #{ diff --git a/apps/emqx_bridge/src/emqx_bridge_resource.erl b/apps/emqx_bridge/src/emqx_bridge_resource.erl index c1de3b177..b3dec7905 100644 --- a/apps/emqx_bridge/src/emqx_bridge_resource.erl +++ b/apps/emqx_bridge/src/emqx_bridge_resource.erl @@ -63,18 +63,23 @@ ). -if(?EMQX_RELEASE_EDITION == ee). -bridge_to_resource_type(<<"mqtt">>) -> emqx_bridge_mqtt_connector; -bridge_to_resource_type(mqtt) -> emqx_bridge_mqtt_connector; -bridge_to_resource_type(<<"webhook">>) -> emqx_bridge_http_connector; -bridge_to_resource_type(webhook) -> emqx_bridge_http_connector; -bridge_to_resource_type(BridgeType) -> emqx_bridge_enterprise:resource_type(BridgeType). +bridge_to_resource_type(BridgeType) when is_binary(BridgeType) -> + bridge_to_resource_type(binary_to_existing_atom(BridgeType, utf8)); +bridge_to_resource_type(mqtt) -> + emqx_bridge_mqtt_connector; +bridge_to_resource_type(webhook) -> + emqx_bridge_http_connector; +bridge_to_resource_type(BridgeType) -> + emqx_bridge_enterprise:resource_type(BridgeType). bridge_impl_module(BridgeType) -> emqx_bridge_enterprise:bridge_impl_module(BridgeType). -else. -bridge_to_resource_type(<<"mqtt">>) -> emqx_bridge_mqtt_connector; -bridge_to_resource_type(mqtt) -> emqx_bridge_mqtt_connector; -bridge_to_resource_type(<<"webhook">>) -> emqx_bridge_http_connector; -bridge_to_resource_type(webhook) -> emqx_bridge_http_connector. +bridge_to_resource_type(BridgeType) when is_binary(Type) -> + bridge_to_resource_type(binary_to_existing_atom(Type, utf8)); +bridge_to_resource_type(mqtt) -> + emqx_bridge_mqtt_connector; +bridge_to_resource_type(webhook) -> + emqx_bridge_http_connector. bridge_impl_module(_BridgeType) -> undefined. -endif. diff --git a/apps/emqx_bridge/src/emqx_bridge_v2_api.erl b/apps/emqx_bridge/src/emqx_bridge_v2_api.erl index cb1f7cc62..f2a51c6cb 100644 --- a/apps/emqx_bridge/src/emqx_bridge_v2_api.erl +++ b/apps/emqx_bridge/src/emqx_bridge_v2_api.erl @@ -110,7 +110,7 @@ param_path_id() -> #{ in => path, required => true, - example => <<"webhook:webhook_example">>, + example => <<"http:my_http_action">>, desc => ?DESC("desc_param_path_id") } )}. diff --git a/apps/emqx_bridge/src/schema/emqx_bridge_compatible_config.erl b/apps/emqx_bridge/src/schema/emqx_bridge_compatible_config.erl index 6adbf3942..b68a4c387 100644 --- a/apps/emqx_bridge/src/schema/emqx_bridge_compatible_config.erl +++ b/apps/emqx_bridge/src/schema/emqx_bridge_compatible_config.erl @@ -21,7 +21,7 @@ -export([ upgrade_pre_ee/2, maybe_upgrade/1, - webhook_maybe_upgrade/1 + http_maybe_upgrade/1 ]). upgrade_pre_ee(undefined, _UpgradeFunc) -> @@ -40,10 +40,10 @@ maybe_upgrade(#{<<"connector">> := _} = Config0) -> maybe_upgrade(NewVersion) -> NewVersion. -webhook_maybe_upgrade(#{<<"direction">> := _} = Config0) -> +http_maybe_upgrade(#{<<"direction">> := _} = Config0) -> Config1 = maps:remove(<<"direction">>, Config0), Config1#{<<"resource_opts">> => default_resource_opts()}; -webhook_maybe_upgrade(NewVersion) -> +http_maybe_upgrade(NewVersion) -> NewVersion. binary_key({K, V}) -> diff --git a/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl b/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl index ff924ac8c..27b3a8f14 100644 --- a/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl +++ b/apps/emqx_bridge/src/schema/emqx_bridge_schema.erl @@ -162,13 +162,14 @@ roots() -> [{bridges, ?HOCON(?R_REF(bridges), #{importance => ?IMPORTANCE_LOW})} fields(bridges) -> [ - {webhook, + {http, mk( hoconsc:map(name, ref(emqx_bridge_http_schema, "config")), #{ + aliases => [webhook], desc => ?DESC("bridges_webhook"), required => false, - converter => fun webhook_bridge_converter/2 + converter => fun http_bridge_converter/2 } )}, {mqtt, @@ -243,7 +244,7 @@ status() -> node_name() -> {"node", mk(binary(), #{desc => ?DESC("desc_node_name"), example => "emqx@127.0.0.1"})}. -webhook_bridge_converter(Conf0, _HoconOpts) -> +http_bridge_converter(Conf0, _HoconOpts) -> emqx_bridge_compatible_config:upgrade_pre_ee( - Conf0, fun emqx_bridge_compatible_config:webhook_maybe_upgrade/1 + Conf0, fun emqx_bridge_compatible_config:http_maybe_upgrade/1 ). diff --git a/apps/emqx_bridge/test/emqx_bridge_SUITE.erl b/apps/emqx_bridge/test/emqx_bridge_SUITE.erl index eef4c0efb..30107d0ce 100644 --- a/apps/emqx_bridge/test/emqx_bridge_SUITE.erl +++ b/apps/emqx_bridge/test/emqx_bridge_SUITE.erl @@ -62,6 +62,7 @@ end_per_testcase(t_get_basic_usage_info_1, _Config) -> ok = emqx_bridge:remove(BridgeType, BridgeName) end, [ + %% Keep using the old bridge names to avoid breaking the tests {webhook, <<"basic_usage_info_webhook">>}, {webhook, <<"basic_usage_info_webhook_disabled">>}, {mqtt, <<"basic_usage_info_mqtt">>} @@ -92,7 +93,7 @@ t_get_basic_usage_info_1(_Config) -> #{ num_bridges => 3, count_by_type => #{ - webhook => 1, + http => 1, mqtt => 2 } }, @@ -123,12 +124,13 @@ setup_fake_telemetry_data() -> HTTPConfig = #{ url => <<"http://localhost:9901/messages/${topic}">>, enable => true, - local_topic => "emqx_webhook/#", + local_topic => "emqx_http/#", method => post, body => <<"${payload}">>, headers => #{}, request_timeout => "15s" }, + %% Keep use the old bridge names to test the backward compatibility {ok, _} = emqx_bridge_testlib:create_bridge_api( <<"webhook">>, <<"basic_usage_info_webhook">>, diff --git a/apps/emqx_bridge/test/emqx_bridge_api_SUITE.erl b/apps/emqx_bridge/test/emqx_bridge_api_SUITE.erl index 339315941..92f71b2e6 100644 --- a/apps/emqx_bridge/test/emqx_bridge_api_SUITE.erl +++ b/apps/emqx_bridge/test/emqx_bridge_api_SUITE.erl @@ -1389,7 +1389,7 @@ validate_resource_request_ttl(single, Timeout, Name) -> begin {ok, Res} = ?wait_async_action( - emqx_bridge_v2:send_message(<<"webhook">>, Name, SentData, #{}), + do_send_message(?BRIDGE_TYPE_HTTP, Name, SentData), #{?snk_kind := async_query}, 1000 ), @@ -1404,6 +1404,10 @@ validate_resource_request_ttl(single, Timeout, Name) -> validate_resource_request_ttl(_Cluster, _Timeout, _Name) -> ignore. +do_send_message(BridgeV1Type, Name, Message) -> + Type = emqx_bridge_v2:bridge_v1_type_to_bridge_v2_type(BridgeV1Type), + emqx_bridge_v2:send_message(Type, Name, Message, #{}). + %% request(Method, URL, Config) -> diff --git a/apps/emqx_bridge/test/emqx_bridge_compatible_config_tests.erl b/apps/emqx_bridge/test/emqx_bridge_compatible_config_tests.erl index 540c18878..9530702bd 100644 --- a/apps/emqx_bridge/test/emqx_bridge_compatible_config_tests.erl +++ b/apps/emqx_bridge/test/emqx_bridge_compatible_config_tests.erl @@ -84,7 +84,7 @@ up(#{<<"mqtt">> := MqttBridges0} = Bridges) -> Bridges#{<<"mqtt">> := MqttBridges}; up(#{<<"webhook">> := WebhookBridges0} = Bridges) -> WebhookBridges = emqx_bridge_compatible_config:upgrade_pre_ee( - WebhookBridges0, fun emqx_bridge_compatible_config:webhook_maybe_upgrade/1 + WebhookBridges0, fun emqx_bridge_compatible_config:http_maybe_upgrade/1 ), Bridges#{<<"webhook">> := WebhookBridges}. diff --git a/apps/emqx_bridge_http/src/emqx_bridge_http_action_info.erl b/apps/emqx_bridge_http/src/emqx_bridge_http_action_info.erl index 19514927e..3b0543ace 100644 --- a/apps/emqx_bridge_http/src/emqx_bridge_http_action_info.erl +++ b/apps/emqx_bridge_http/src/emqx_bridge_http_action_info.erl @@ -34,9 +34,9 @@ bridge_v1_type_name() -> webhook. -action_type_name() -> webhook. +action_type_name() -> http. -connector_type_name() -> webhook. +connector_type_name() -> http. schema_module() -> emqx_bridge_http_schema. diff --git a/apps/emqx_bridge_http/src/emqx_bridge_http_connector.erl b/apps/emqx_bridge_http/src/emqx_bridge_http_connector.erl index a49a1b659..5ecfa76d1 100644 --- a/apps/emqx_bridge_http/src/emqx_bridge_http_connector.erl +++ b/apps/emqx_bridge_http/src/emqx_bridge_http_connector.erl @@ -46,7 +46,7 @@ namespace/0 ]). -%% for other webhook-like connectors. +%% for other http-like connectors. -export([redact_request/1]). -export([validate_method/1, join_paths/2]). @@ -836,7 +836,7 @@ maybe_retry({error, Reason}, Context, ReplyFunAndArgs) -> true -> Context; false -> Context#{attempt := Attempt + 1} end, - ?tp(webhook_will_retry_async, #{}), + ?tp(http_will_retry_async, #{}), Worker = resolve_pool_worker(State, KeyOrNum), ok = ehttpc:request_async( Worker, diff --git a/apps/emqx_bridge_http/src/emqx_bridge_http_schema.erl b/apps/emqx_bridge_http/src/emqx_bridge_http_schema.erl index 703eb01ed..a9bd3e827 100644 --- a/apps/emqx_bridge_http/src/emqx_bridge_http_schema.erl +++ b/apps/emqx_bridge_http/src/emqx_bridge_http_schema.erl @@ -31,7 +31,7 @@ %%====================================================================================== %% Hocon Schema Definitions -namespace() -> "bridge_webhook". +namespace() -> "bridge_http". roots() -> []. @@ -40,7 +40,7 @@ roots() -> []. %% see: emqx_bridge_schema:get_response/0, put_request/0, post_request/0 fields("post") -> [ - type_field(), + old_type_field(), name_field() ] ++ fields("config"); fields("put") -> @@ -55,15 +55,16 @@ fields("config") -> %% v2: configuration fields(action) -> %% XXX: Do we need to rename it to `http`? - {webhook, + {http, mk( - hoconsc:map(name, ref(?MODULE, webhook_action)), + hoconsc:map(name, ref(?MODULE, http_action)), #{ + aliases => [webhook], desc => <<"HTTP Action Config">>, required => false } )}; -fields(webhook_action) -> +fields(http_action) -> [ {enable, mk(boolean(), #{desc => ?DESC("config_enable"), default => true})}, {connector, @@ -83,7 +84,7 @@ fields(webhook_action) -> importance => ?IMPORTANCE_HIDDEN } )}, - %% Since e5.3.2, we split the webhook_bridge to two parts: a) connector. b) actions. + %% Since e5.3.2, we split the http bridge to two parts: a) connector. b) actions. %% some fields are moved to connector, some fields are moved to actions and composed into the %% `parameters` field. {parameters, @@ -91,7 +92,7 @@ fields(webhook_action) -> required => true, desc => ?DESC(parameters_opts) })} - ] ++ webhook_resource_opts(); + ] ++ http_resource_opts(); fields(parameters_opts) -> [ {path, @@ -119,7 +120,7 @@ fields("put_" ++ Type) -> fields("get_" ++ Type) -> emqx_bridge_schema:status_fields() ++ fields("post_" ++ Type); fields("config_bridge_v2") -> - fields(webhook_action); + fields(http_action); fields("config_connector") -> [ {enable, @@ -165,7 +166,7 @@ basic_config() -> default => true } )} - ] ++ webhook_resource_opts() ++ connector_opts(). + ] ++ http_resource_opts() ++ connector_opts(). request_config() -> [ @@ -203,10 +204,21 @@ connector_url_headers() -> %%-------------------------------------------------------------------- %% common funcs +%% `webhook` is kept for backward compatibility. +old_type_field() -> + {type, + mk( + enum([webhook, http]), + #{ + required => true, + desc => ?DESC("desc_type") + } + )}. + type_field() -> {type, mk( - webhook, + http, #{ required => true, desc => ?DESC("desc_type") @@ -290,7 +302,7 @@ request_timeout_field() -> } )}. -webhook_resource_opts() -> +http_resource_opts() -> [ {resource_opts, mk( @@ -333,8 +345,8 @@ mark_request_field_deperecated(Fields) -> bridge_v2_examples(Method) -> [ #{ - <<"webhook">> => #{ - summary => <<"Webhook Action">>, + <<"http">> => #{ + summary => <<"HTTP Action">>, value => values({Method, bridge_v2}) } } @@ -343,8 +355,8 @@ bridge_v2_examples(Method) -> connector_examples(Method) -> [ #{ - <<"webhook">> => #{ - summary => <<"Webhook Connector">>, + <<"http">> => #{ + summary => <<"HTTP Connector">>, value => values({Method, connector}) } } @@ -366,16 +378,16 @@ values({get, Type}) -> values({post, bridge_v2}) -> maps:merge( #{ - name => <<"my_webhook_action">>, - type => <<"webhook">> + name => <<"my_http_action">>, + type => <<"http">> }, values({put, bridge_v2}) ); values({post, connector}) -> maps:merge( #{ - name => <<"my_webhook_connector">>, - type => <<"webhook">> + name => <<"my_http_connector">>, + type => <<"http">> }, values({put, connector}) ); @@ -386,7 +398,7 @@ values({put, connector}) -> values(bridge_v2) -> #{ enable => true, - connector => <<"my_webhook_connector">>, + connector => <<"my_http_connector">>, parameters => #{ path => <<"/room/${room_no}">>, method => <<"post">>, diff --git a/apps/emqx_bridge_http/test/emqx_bridge_http_SUITE.erl b/apps/emqx_bridge_http/test/emqx_bridge_http_SUITE.erl index cc0f2046c..2ff7d184b 100644 --- a/apps/emqx_bridge_http/test/emqx_bridge_http_SUITE.erl +++ b/apps/emqx_bridge_http/test/emqx_bridge_http_SUITE.erl @@ -577,7 +577,7 @@ t_path_not_found(Config) -> ok end, fun(Trace) -> - ?assertEqual([], ?of_kind(webhook_will_retry_async, Trace)), + ?assertEqual([], ?of_kind(http_will_retry_async, Trace)), ok end ), @@ -618,7 +618,7 @@ t_too_many_requests(Config) -> ok end, fun(Trace) -> - ?assertMatch([_ | _], ?of_kind(webhook_will_retry_async, Trace)), + ?assertMatch([_ | _], ?of_kind(http_will_retry_async, Trace)), ok end ), @@ -731,7 +731,8 @@ t_bridge_probes_header_atoms(Config) -> %% helpers do_send_message(Message) -> - emqx_bridge_v2:send_message(?BRIDGE_TYPE, ?BRIDGE_NAME, Message, #{}). + Type = emqx_bridge_v2:bridge_v1_type_to_bridge_v2_type(?BRIDGE_TYPE), + emqx_bridge_v2:send_message(Type, ?BRIDGE_NAME, Message, #{}). do_t_async_retries(TestCase, TestContext, Error, Fn) -> #{error_attempts := ErrorAttempts} = TestContext, diff --git a/apps/emqx_connector/src/emqx_connector_api.erl b/apps/emqx_connector/src/emqx_connector_api.erl index 58db17a03..a5b7692d7 100644 --- a/apps/emqx_connector/src/emqx_connector_api.erl +++ b/apps/emqx_connector/src/emqx_connector_api.erl @@ -137,7 +137,7 @@ param_path_id() -> #{ in => path, required => true, - example => <<"webhook:webhook_example">>, + example => <<"http:my_http_connector">>, desc => ?DESC("desc_param_path_id") } )}. diff --git a/apps/emqx_connector/src/emqx_connector_resource.erl b/apps/emqx_connector/src/emqx_connector_resource.erl index 1d6ea072f..ff2790481 100644 --- a/apps/emqx_connector/src/emqx_connector_resource.erl +++ b/apps/emqx_connector/src/emqx_connector_resource.erl @@ -79,7 +79,7 @@ connector_impl_module(_ConnectorType) -> -endif. -connector_to_resource_type_ce(webhook) -> +connector_to_resource_type_ce(http) -> emqx_bridge_http_connector; connector_to_resource_type_ce(ConnectorType) -> error({no_bridge_v2, ConnectorType}). @@ -275,7 +275,7 @@ remove(Type, Name, _Conf, _Opts) -> %% convert connector configs to what the connector modules want parse_confs( - <<"webhook">>, + <<"http">>, _Name, #{ url := Url, diff --git a/apps/emqx_connector/src/schema/emqx_connector_schema.erl b/apps/emqx_connector/src/schema/emqx_connector_schema.erl index 2b05c2328..890f84871 100644 --- a/apps/emqx_connector/src/schema/emqx_connector_schema.erl +++ b/apps/emqx_connector/src/schema/emqx_connector_schema.erl @@ -70,7 +70,7 @@ api_schemas(Method) -> [ %% We need to map the `type' field of a request (binary) to a %% connector schema module. - api_ref(emqx_bridge_http_schema, <<"webhook">>, Method ++ "_connector") + api_ref(emqx_bridge_http_schema, <<"http">>, Method ++ "_connector") ]. api_ref(Module, Type, Method) -> @@ -96,7 +96,7 @@ schema_modules() -> [emqx_bridge_http_schema]. -endif. -connector_type_to_bridge_types(webhook) -> [webhook]; +connector_type_to_bridge_types(http) -> [http, webhook]; connector_type_to_bridge_types(kafka_producer) -> [kafka, kafka_producer]; connector_type_to_bridge_types(azure_event_hub_producer) -> [azure_event_hub_producer]. @@ -379,10 +379,11 @@ roots() -> fields(connectors) -> [ - {webhook, + {http, mk( hoconsc:map(name, ref(emqx_bridge_http_schema, "config_connector")), #{ + alias => [webhook], desc => <<"HTTP Connector Config">>, required => false }