From 4f21bdb885ecf181e25ed8b1bdf9e30a030e1fc1 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 24 May 2023 13:05:46 +0200 Subject: [PATCH] fix: REST API version 2 not available in IoTDB 0.13 and 1.0 This commit makes sure that REST API version 1 is used when the user has selected to use IoTDB 0.13 or 1.0 Fixes: https://emqx.atlassian.net/browse/EMQX-9920 --- apps/emqx_bridge/src/emqx_bridge_resource.erl | 23 ++++++++++++++----- .../include/emqx_bridge_iotdb.hrl | 3 ++- .../src/emqx_bridge_iotdb.erl | 6 ++--- .../src/emqx_bridge_iotdb_impl.erl | 14 +++++++---- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/apps/emqx_bridge/src/emqx_bridge_resource.erl b/apps/emqx_bridge/src/emqx_bridge_resource.erl index 60ee242d1..e622403b3 100644 --- a/apps/emqx_bridge/src/emqx_bridge_resource.erl +++ b/apps/emqx_bridge/src/emqx_bridge_resource.erl @@ -57,11 +57,6 @@ (TYPE) =:= <<"kafka_consumer">> orelse ?IS_BI_DIR_BRIDGE(TYPE) ). -%% [FIXME] this has no place here, it's used in parse_confs/3, which should -%% rather delegate to a behavior callback than implementing domain knowledge -%% here (reversed dependency) --define(INSERT_TABLET_PATH, "/rest/v2/insertTablet"). - -if(?EMQX_RELEASE_EDITION == ee). bridge_to_resource_type(<<"mqtt">>) -> emqx_connector_mqtt; bridge_to_resource_type(mqtt) -> emqx_connector_mqtt; @@ -343,6 +338,11 @@ parse_confs( } }; parse_confs(<<"iotdb">>, Name, Conf) -> + %% [FIXME] this has no place here, it's used in parse_confs/3, which should + %% rather delegate to a behavior callback than implementing domain knowledge + %% here (reversed dependency) + InsertTabletPathV1 = <<"rest/v1/insertTablet">>, + InsertTabletPathV2 = <<"rest/v2/insertTablet">>, #{ base_url := BaseURL, authentication := @@ -352,10 +352,21 @@ parse_confs(<<"iotdb">>, Name, Conf) -> } } = Conf, BasicToken = base64:encode(<>), + %% This version atom correspond to the macro ?VSN_1_1_X in + %% emqx_bridge_iotdb.hrl. It would be better to use the macro directly, but + %% this cannot be done without introducing a dependency on the + %% emqx_iotdb_bridge app (which is an EE app). + DefaultIOTDBBridge = 'v1.1.x', + Version = maps:get(iotdb_version, Conf, DefaultIOTDBBridge), + InsertTabletPath = + case Version of + DefaultIOTDBBridge -> InsertTabletPathV2; + _ -> InsertTabletPathV1 + end, WebhookConfig = Conf#{ method => <<"post">>, - url => <>, + url => <>, headers => [ {<<"Content-type">>, <<"application/json">>}, {<<"Authorization">>, BasicToken} diff --git a/apps/emqx_bridge_iotdb/include/emqx_bridge_iotdb.hrl b/apps/emqx_bridge_iotdb/include/emqx_bridge_iotdb.hrl index 5d693547a..5e5048202 100644 --- a/apps/emqx_bridge_iotdb/include/emqx_bridge_iotdb.hrl +++ b/apps/emqx_bridge_iotdb/include/emqx_bridge_iotdb.hrl @@ -5,7 +5,8 @@ -ifndef(EMQX_BRIDGE_IOTDB_HRL). -define(EMQX_BRIDGE_IOTDB_HRL, true). --define(VSN_1_X, 'v1.x'). +-define(VSN_1_1_X, 'v1.1.x'). +-define(VSN_1_0_X, 'v1.0.x'). -define(VSN_0_13_X, 'v0.13.x'). -endif. diff --git a/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl b/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl index aa2c32589..68bbc7c42 100644 --- a/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl +++ b/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb.erl @@ -109,10 +109,10 @@ basic_config() -> )}, {iotdb_version, mk( - hoconsc:enum([?VSN_1_X, ?VSN_0_13_X]), + hoconsc:enum([?VSN_1_1_X, ?VSN_1_0_X, ?VSN_0_13_X]), #{ desc => ?DESC("config_iotdb_version"), - default => ?VSN_1_X + default => ?VSN_1_1_X } )} ] ++ resource_creation_opts() ++ @@ -217,7 +217,7 @@ conn_bridge_example(_Method, Type) -> is_aligned => false, device_id => <<"my_device">>, base_url => <<"http://iotdb.local:18080/">>, - iotdb_version => ?VSN_1_X, + iotdb_version => ?VSN_1_1_X, connect_timeout => <<"15s">>, pool_type => <<"random">>, pool_size => 8, diff --git a/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb_impl.erl b/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb_impl.erl index 8331e715f..f19fc0839 100644 --- a/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb_impl.erl +++ b/apps/emqx_bridge_iotdb/src/emqx_bridge_iotdb_impl.erl @@ -280,7 +280,7 @@ make_iotdb_insert_request(MessageUnparsedPayload, State) -> Message = maps:update_with(payload, fun make_parsed_payload/1, MessageUnparsedPayload), IsAligned = maps:get(is_aligned, State, false), DeviceId = device_id(Message, State), - IotDBVsn = maps:get(iotdb_version, State, ?VSN_1_X), + IotDBVsn = maps:get(iotdb_version, State, ?VSN_1_1_X), Payload = make_list(maps:get(payload, Message)), PreProcessedData = preproc_data_list(Payload), DataList = proc_data(PreProcessedData, Message), @@ -349,15 +349,21 @@ insert_value(1, Data, [Value | Values]) -> insert_value(Index, Data, [Value | Values]) -> [[null | Value] | insert_value(Index - 1, Data, Values)]. -iotdb_field_key(is_aligned, ?VSN_1_X) -> +iotdb_field_key(is_aligned, ?VSN_1_1_X) -> + <<"is_aligned">>; +iotdb_field_key(is_aligned, ?VSN_1_0_X) -> <<"is_aligned">>; iotdb_field_key(is_aligned, ?VSN_0_13_X) -> <<"isAligned">>; -iotdb_field_key(device_id, ?VSN_1_X) -> +iotdb_field_key(device_id, ?VSN_1_1_X) -> + <<"device">>; +iotdb_field_key(device_id, ?VSN_1_0_X) -> <<"device">>; iotdb_field_key(device_id, ?VSN_0_13_X) -> <<"deviceId">>; -iotdb_field_key(data_types, ?VSN_1_X) -> +iotdb_field_key(data_types, ?VSN_1_1_X) -> + <<"data_types">>; +iotdb_field_key(data_types, ?VSN_1_0_X) -> <<"data_types">>; iotdb_field_key(data_types, ?VSN_0_13_X) -> <<"dataTypes">>.