From 447c933ff8221a975d5e8083011f19f83a0c0083 Mon Sep 17 00:00:00 2001 From: firest Date: Fri, 10 Nov 2023 10:42:53 +0800 Subject: [PATCH] fix(syskeeper): homogenize the Syskeeper bridge and update license data --- apps/emqx_bridge/src/emqx_bridge.erl | 3 +- .../src/schema/emqx_bridge_v2_schema.erl | 7 +--- .../include/emqx_bridge_syskeeper.hrl | 2 +- .../src/emqx_bridge_syskeeper.app.src | 2 +- .../src/emqx_bridge_syskeeper.erl | 41 ++++++++++++------- .../src/emqx_bridge_syskeeper_connector.erl | 17 +++++--- .../test/emqx_bridge_syskeeper_SUITE.erl | 5 +++ rel/i18n/emqx_bridge_syskeeper.hocon | 11 +++++ 8 files changed, 61 insertions(+), 27 deletions(-) diff --git a/apps/emqx_bridge/src/emqx_bridge.erl b/apps/emqx_bridge/src/emqx_bridge.erl index 8098072c0..7ffe58f6a 100644 --- a/apps/emqx_bridge/src/emqx_bridge.erl +++ b/apps/emqx_bridge/src/emqx_bridge.erl @@ -93,7 +93,8 @@ T == iotdb; T == kinesis_producer; T == greptimedb; - T == azure_event_hub_producer + T == azure_event_hub_producer; + T == syskeeper_forwarder ). -define(ROOT_KEY, bridges). diff --git a/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl b/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl index f0973f260..d6d8eb9a1 100644 --- a/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl +++ b/apps/emqx_bridge/src/schema/emqx_bridge_v2_schema.erl @@ -134,11 +134,8 @@ desc(_) -> schema_homogeneous_test() -> case lists:filtermap( - fun - ({syskeeper_forwarder, _Schema}) -> - false; - ({_Name, Schema}) -> - is_bad_schema(Schema) + fun({_Name, Schema}) -> + is_bad_schema(Schema) end, fields(actions) ) diff --git a/apps/emqx_bridge_syskeeper/include/emqx_bridge_syskeeper.hrl b/apps/emqx_bridge_syskeeper/include/emqx_bridge_syskeeper.hrl index b381ebf50..4e14fafb0 100644 --- a/apps/emqx_bridge_syskeeper/include/emqx_bridge_syskeeper.hrl +++ b/apps/emqx_bridge_syskeeper/include/emqx_bridge_syskeeper.hrl @@ -1,5 +1,5 @@ %%-------------------------------------------------------------------- -%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved. +%% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved. %%-------------------------------------------------------------------- -ifndef(EMQX_BRIDGE_SYSKEEPER). -define(EMQX_BRIDGE_SYSKEEPER, true). diff --git a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.app.src b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.app.src index a8f533867..3c7995cb7 100644 --- a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.app.src +++ b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.app.src @@ -1,5 +1,5 @@ {application, emqx_bridge_syskeeper, [ - {description, "EMQX Enterprise Bridge"}, + {description, "EMQX Enterprise Data bridge for Syskeeper"}, {vsn, "0.1.0"}, {registered, []}, {applications, [ diff --git a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.erl b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.erl index 9e520d095..55e3d08b9 100644 --- a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.erl +++ b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper.erl @@ -1,5 +1,5 @@ %%-------------------------------------------------------------------- -%% Copyright (c) 2022 EMQ Technologies Co., Ltd. All Rights Reserved. +%% Copyright (c) 2023 EMQ Technologies Co., Ltd. All Rights Reserved. %%-------------------------------------------------------------------- -module(emqx_bridge_syskeeper). @@ -59,9 +59,11 @@ values(put) -> #{ enable => true, connector => <<"syskeeper_forwarder">>, - target_topic => <<"${topic}">>, - target_qos => <<"-1">>, - template => <<"${payload}">>, + parameters => #{ + target_topic => <<"${topic}">>, + target_qos => <<"-1">>, + template => <<"${payload}">> + }, resource_opts => #{ worker_pool_size => 16 } @@ -69,7 +71,7 @@ values(put) -> %% ------------------------------------------------------------------------------------------------- %% Hocon Schema Definitions -namespace() -> "bridge_syskeeper". +namespace() -> "syskeeper". roots() -> []. @@ -81,6 +83,24 @@ fields(config) -> mk(binary(), #{ desc => ?DESC(emqx_connector_schema, "connector_field"), required => true })}, + {parameters, + mk( + ref(?MODULE, "parameters"), + #{required => true, desc => ?DESC("parameters")} + )}, + {local_topic, mk(binary(), #{required => false, desc => ?DESC(mqtt_topic)})}, + {resource_opts, + mk( + ref(?MODULE, "creation_opts"), + #{ + required => false, + default => #{}, + desc => ?DESC(emqx_resource_schema, <<"resource_opts">>) + } + )} + ]; +fields("parameters") -> + [ {target_topic, mk( binary(), @@ -95,15 +115,6 @@ fields(config) -> mk( binary(), #{desc => ?DESC("template"), default => <<"${payload}">>} - )}, - {resource_opts, - mk( - ref(?MODULE, "creation_opts"), - #{ - required => false, - default => #{}, - desc => ?DESC(emqx_resource_schema, <<"resource_opts">>) - } )} ]; fields("creation_opts") -> @@ -119,6 +130,8 @@ desc(config) -> ?DESC("desc_config"); desc(Method) when Method =:= "get"; Method =:= "put"; Method =:= "post" -> ["Configuration for Syskeeper using `", string:to_upper(Method), "` method."]; +desc("parameters") -> + ?DESC("parameters"); desc("creation_opts" = Name) -> emqx_resource_schema:desc(Name); desc(_) -> diff --git a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_connector.erl b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_connector.erl index 5c52017fd..c267ee521 100644 --- a/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_connector.erl +++ b/apps/emqx_bridge_syskeeper/src/emqx_bridge_syskeeper_connector.erl @@ -206,11 +206,18 @@ status_result(true) -> connected; status_result(false) -> connecting; status_result({error, _}) -> connecting. -on_add_channel(_InstanceId, #{channels := Channels} = OldState, ChannelId, #{ - target_topic := TargetTopic, - target_qos := TargetQoS, - template := Template -}) -> +on_add_channel( + _InstanceId, + #{channels := Channels} = OldState, + ChannelId, + #{ + parameters := #{ + target_topic := TargetTopic, + target_qos := TargetQoS, + template := Template + } + } +) -> case maps:is_key(ChannelId, Channels) of true -> {error, already_exists}; diff --git a/apps/emqx_bridge_syskeeper/test/emqx_bridge_syskeeper_SUITE.erl b/apps/emqx_bridge_syskeeper/test/emqx_bridge_syskeeper_SUITE.erl index 10bbf4d59..54330ea37 100644 --- a/apps/emqx_bridge_syskeeper/test/emqx_bridge_syskeeper_SUITE.erl +++ b/apps/emqx_bridge_syskeeper/test/emqx_bridge_syskeeper_SUITE.erl @@ -106,6 +106,11 @@ syskeeper_config(Config) -> "actions.~s.~s {\n" " enable = true\n" " connector = ~ts\n" + " parameters = {\n" + " target_topic = \"${topic}\"\n" + " target_qos = -1\n" + " template = \"${payload}\"\n" + " },\n" " resource_opts = {\n" " request_ttl = 500ms\n" " batch_size = ~b\n" diff --git a/rel/i18n/emqx_bridge_syskeeper.hocon b/rel/i18n/emqx_bridge_syskeeper.hocon index 7cf195317..289dd22c5 100644 --- a/rel/i18n/emqx_bridge_syskeeper.hocon +++ b/rel/i18n/emqx_bridge_syskeeper.hocon @@ -42,4 +42,15 @@ target_qos.desc: target_qos.label: """Target QoS""" +parameters.desc: +"""Syskeeper data bridge parameters""" + +parameters.label: +"""Parameters""" + +mqtt_topic.desc: +"""MQTT topic or topic filter as data source (bridge input). If rule action is used as data source, this config should be left empty, otherwise messages will be duplicated in Syskeeper.""" + +mqtt_topic.label: +"""Source MQTT Topic""" }