Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add connector schema scaffold and break out Kafka conector #11581

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
f7984be
feat: add connector schema scaffold and break out Kafka conector
kjellwinblad Sep 8, 2023
8f109da
style: cleanup emqx_connector
sstrigler Sep 28, 2023
bc6e1da
test: add suite for emqx_connector
sstrigler Sep 29, 2023
5374d35
feat: started to make bridge_v2 compatible with old style bridges
kjellwinblad Oct 2, 2023
99904ca
fix: don't break root for non enterprise
sstrigler Oct 2, 2023
16d7f4d
style: cleanup emqx_connector_resource
sstrigler Oct 2, 2023
c0df85a
feat: Bridge V2 compatiblilty layer progress and local topic
kjellwinblad Oct 4, 2023
009b9c3
style: remove unused commented fn
sstrigler Oct 3, 2023
9195838
test: add disable_enable tests
sstrigler Oct 3, 2023
cc864f4
feat: add update/3
sstrigler Oct 3, 2023
d05f201
fix: fail remove connector with active channels
sstrigler Oct 3, 2023
ed8aa46
refactor: copy bridge api code over to emqx_connector
sstrigler Oct 3, 2023
7641c22
fix: add missing parts
sstrigler Oct 4, 2023
4e05b1f
style: fix wording, typos, punctuation etc
sstrigler Oct 4, 2023
64faf32
style: cleanup examples
sstrigler Oct 4, 2023
229bc0e
fix: schema fixes for connector and kafka as connector
sstrigler Oct 4, 2023
c9b683f
fix: add missing function for non enterprise
sstrigler Oct 9, 2023
4b4eb19
fix: add schema desc for connector
sstrigler Oct 9, 2023
8567cca
fix: don't assume resource-id starts with "connector:"
sstrigler Oct 9, 2023
f3648c5
fix: allow Type in resource-id and pass it on
sstrigler Oct 9, 2023
7f3e23e
test: initial add of /connectors api suite
sstrigler Oct 10, 2023
cb86914
test: use mock instead of actual kafka service
sstrigler Oct 11, 2023
a9a7f4a
fix: set bpapi version to 1
sstrigler Oct 11, 2023
58db34a
fix: apply suggestions from code review
kjellwinblad Oct 12, 2023
ee8e469
test: port all remaining tests
sstrigler Oct 11, 2023
0ad156b
test: make sure mocks are ready before init_mocks terminates
sstrigler Oct 12, 2023
1816b45
test: (re-)add inconsistent connector test
sstrigler Oct 12, 2023
671b530
fix: cleanup start/stop/restart operations
sstrigler Oct 12, 2023
291d54e
test: use no_link in init for mecks
sstrigler Oct 12, 2023
1c62b5b
fix: use correct body_schema
sstrigler Oct 12, 2023
828bbc5
feat: test case fixes and compatibility layer probe etc
kjellwinblad Oct 12, 2023
b0b5180
fix: remove connector as well on Bridge V1 remove
kjellwinblad Oct 13, 2023
04943cc
refactor: better name of funtion
kjellwinblad Oct 13, 2023
e13196c
feat(bridge_v2): dry_run and specific test suite
kjellwinblad Oct 16, 2023
a5a0604
feat: restructure emqx_bridge_v2 for better readability
kjellwinblad Oct 17, 2023
38f5c7d
feat: HTTP API for bridge_v2
sstrigler Oct 12, 2023
2249a2c
fix: remove unused function
kjellwinblad Oct 17, 2023
7ad7095
fix: bridge_not_found renamed
sstrigler Oct 17, 2023
6568759
fix: add bridge_v2_probe
sstrigler Oct 17, 2023
d5ac3d0
fix: description for operation on connector
sstrigler Oct 17, 2023
e2b4fb3
fix: support 'start' operation
sstrigler Oct 17, 2023
d8a9778
feat: add compatibilty layer function for checking if valid bridge_v1
kjellwinblad Oct 17, 2023
2cd1c88
fix: fixup after rebasing on release-23
kjellwinblad Oct 17, 2023
f49011e
fix: unused variable warning
kjellwinblad Oct 17, 2023
cb38920
fix: typo
kjellwinblad Oct 17, 2023
d46f8ef
test: add emqx_bridge_v2_api_SUITE
sstrigler Oct 17, 2023
2a1e135
test: fix tests after emqx_authn changes
sstrigler Oct 18, 2023
676572c
fix: use check_schema to simplify API implementation
sstrigler Oct 18, 2023
abcae6b
fix: refactor handling of operation(s) [ie 'start']
sstrigler Oct 18, 2023
2b66018
fix: enable param is atom
sstrigler Oct 18, 2023
29ca7f9
fix: simplify by enabling check_schema
sstrigler Oct 18, 2023
7822d7d
fix: strange issue with `erlfmt`
sstrigler Oct 20, 2023
e72b952
fix: problems reported by dialyzer
kjellwinblad Oct 24, 2023
a847b04
fix: disable bridge_v2 tests if not on enterprise
sstrigler Oct 24, 2023
6c6c2e0
fix: dialyzer warnings for community edition
kjellwinblad Oct 24, 2023
2d05e3a
fix: dialyzer problem for community edition
kjellwinblad Oct 24, 2023
38bf2ae
fix: issues found by spellcheck script
kjellwinblad Oct 24, 2023
96726b5
refactor(eqmx_config): use dynamic callback to upgrade raw config
zmstone Oct 25, 2023
16f8848
test: fix emqx_connector_SUITE
id Oct 25, 2023
6625754
chore: bump app version
id Oct 25, 2023
eed44f7
refactor(emqx_config): check if upgrade_raw_conf is exported
zmstone Oct 25, 2023
e29ba35
fix: typo in warning log message when remove channel error happens
zmstone Oct 25, 2023
ba24647
fix(emqx_resource): redact error reason too before logging
zmstone Oct 25, 2023
8c30c22
chore: avoid invalid dynamic call error
zmstone Oct 25, 2023
98fcd2c
test: use latest ubuntu22.04 emqx-builder image in compose files
id Oct 25, 2023
ad1def0
chore: consolidate bash commands in ct/run.sh
id Oct 25, 2023
d53cd38
test: compile and test apps/emqx_connector with ee profile
id Oct 25, 2023
4ac0a76
test: fix emqx_resource_SUITE
id Oct 25, 2023
36411ed
feat: Add API endpoint /api/v5/schemas/bridges_v2
zmstone Oct 25, 2023
3cab312
feat: Add API endpoint /api/v5/schemas/connectors
zmstone Oct 25, 2023
477ed11
fix: periodical status checks and alarms for channels
kjellwinblad Oct 25, 2023
4e19856
test: hard code emqx-enterprise profile for emqx_connector in ct/run.sh
id Oct 25, 2023
7ee21ca
ci: use xl runners for compiling
id Oct 25, 2023
bba5b42
fix: broken test cases
kjellwinblad Oct 26, 2023
5aac90a
fix: don't send message to channels that are not operational
kjellwinblad Oct 26, 2023
238603a
fix: bridge_v2 tags were still bridge
sstrigler Oct 24, 2023
b72abaf
fix: wording from copy-paste error
sstrigler Oct 24, 2023
f760f0a
fix: backport 7b607c3300dd2221af4ad39cd77275cc592e9ce2
sstrigler Oct 25, 2023
2228a0d
feat: port azure event hub to bridge_v2
sstrigler Oct 24, 2023
37178e1
chore: test some apps with both emqx and emqx-enteprise profiles
id Oct 26, 2023
da7d495
test: fix emqx_connector_SUITE
id Oct 26, 2023
e2aca35
fix(kafka): Fix server name indication config for Kafka
zmstone Oct 26, 2023
90a23d9
fix: channel handling when resource not connected
kjellwinblad Oct 26, 2023
d574821
fix(bridge_api): use translated config to check if bridge is enabled
thalesmg Oct 26, 2023
83e05b0
fix(bridge_resource): use more lax parsing of bridge id
thalesmg Oct 26, 2023
89812f0
test(bridge_http): stablize flaky test case
thalesmg Oct 26, 2023
7745cb8
test: fix emqx_bridge_v2_kafka_producer_SUITE
id Oct 26, 2023
3cb7008
ci: nicer names for test runs
id Oct 26, 2023
04a832a
refactor(kafka): fix typo and take connector type from input
thalesmg Oct 26, 2023
f2c9739
feat(bridge_v2): validate connector references when creating/updating…
thalesmg Oct 26, 2023
5f17a8f
fix(kafka): use client config for topic existence check
zmstone Oct 27, 2023
27aff47
fix(connector): check that there are no active channels when removing
thalesmg Oct 27, 2023
9511840
test(bridge_v2): add test cases for root post config update handler c…
thalesmg Oct 27, 2023
f8d330c
fix(bridge_v2): don't spawn buffer workers for `simple_{,a}sync_inter…
thalesmg Oct 27, 2023
d61d80f
fix: almost working bridge v1 compatibility layer for HTTP API
kjellwinblad Oct 27, 2023
886334e
fix: bridge v1 compatiblity layer enable/disable
kjellwinblad Oct 27, 2023
d0ffae5
chore: make elvis happy
id Oct 27, 2023
1dea3e1
test: add suite for AEH bridge v2
sstrigler Oct 27, 2023
917e13c
fix: add start/stop/restart support to bridge v1 compatibility layer
kjellwinblad Oct 28, 2023
babf5f9
fix: use populated non-raw conf when checking if bridge_v2 is enabled
kjellwinblad Oct 28, 2023
e100999
fix(emqx_bridge_v2): properly working start function
kjellwinblad Oct 28, 2023
5cfe151
fix: type conversion for rule with converted bridge V1 reference
kjellwinblad Oct 28, 2023
1b24827
test(bridge_v2): test case for the local_topic feature
kjellwinblad Oct 28, 2023
449b01e
feat: let bridge V2 override bridge creation opts from connector
kjellwinblad Oct 29, 2023
289428c
refactor(kafka): rename bridge type 'kafka' to 'kafka_producer'
zmstone Oct 27, 2023
2f46e86
test: refactor test group generation
zmstone Oct 30, 2023
791db44
chore: bump version
zmstone Oct 30, 2023
ced3afb
ci: give more juice to emqx app tests workflow
id Oct 30, 2023
3fd167e
ci(helm): run kubectl port-forward with nohup
id Oct 30, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .ci/docker-compose-file/docker-compose-kafka.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ services:
- /tmp/emqx-ci/emqx-shared-secret:/var/lib/secret
kdc:
hostname: kdc.emqx.net
image: ghcr.io/emqx/emqx-builder/5.1-4:1.14.5-25.3.2-2-ubuntu20.04
image: ghcr.io/emqx/emqx-builder/5.2-3:1.14.5-25.3.2-2-ubuntu22.04
container_name: kdc.emqx.net
expose:
- 88 # kdc
Expand Down
16 changes: 8 additions & 8 deletions .ci/docker-compose-file/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ version: '3.9'
services:
erlang:
container_name: erlang
image: ${DOCKER_CT_RUNNER_IMAGE:-ghcr.io/emqx/emqx-builder/5.1-4:1.14.5-25.3.2-2-ubuntu20.04}
image: ${DOCKER_CT_RUNNER_IMAGE:-ghcr.io/emqx/emqx-builder/5.2-3:1.14.5-25.3.2-2-ubuntu22.04}
env_file:
- conf.env
environment:
GITHUB_ACTIONS: ${GITHUB_ACTIONS}
GITHUB_TOKEN: ${GITHUB_TOKEN}
GITHUB_RUN_ID: ${GITHUB_RUN_ID}
GITHUB_SHA: ${GITHUB_SHA}
GITHUB_RUN_NUMBER: ${GITHUB_RUN_NUMBER}
GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME}
GITHUB_REF: ${GITHUB_REF}
GITHUB_ACTIONS: ${GITHUB_ACTIONS:-}
GITHUB_TOKEN: ${GITHUB_TOKEN:-}
GITHUB_RUN_ID: ${GITHUB_RUN_ID:-}
GITHUB_SHA: ${GITHUB_SHA:-}
GITHUB_RUN_NUMBER: ${GITHUB_RUN_NUMBER:-}
GITHUB_EVENT_NAME: ${GITHUB_EVENT_NAME:-}
GITHUB_REF: ${GITHUB_REF:-}
networks:
- emqx_bridge
ports:
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/_pr_entrypoint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
version-emqx: ${{ steps.matrix.outputs.version-emqx }}
version-emqx-enterprise: ${{ steps.matrix.outputs.version-emqx-enterprise }}
runner_labels: ${{ github.repository_owner == 'emqx' && '["self-hosted","ephemeral","linux","x64"]' || '["ubuntu-22.04"]' }}
xl_runner_labels: ${{ github.repository_owner == 'emqx' && '["self-hosted","ephemeral-xl","linux","x64"]' || '["ubuntu-22.04"]' }}
builder: "ghcr.io/emqx/emqx-builder/5.2-3:1.14.5-25.3.2-2-ubuntu22.04"
builder_vsn: "5.2-3"
otp_vsn: "25.3.2-2"
Expand Down Expand Up @@ -115,7 +116,7 @@ jobs:
echo "version-emqx-enterprise=$(./pkg-vsn.sh emqx-enterprise)" | tee -a $GITHUB_OUTPUT

compile:
runs-on: ${{ fromJSON(needs.sanity-checks.outputs.runner_labels) }}
runs-on: ${{ fromJSON(needs.sanity-checks.outputs.xl_runner_labels) }}
container: ${{ needs.sanity-checks.outputs.builder }}
needs:
- sanity-checks
Expand Down Expand Up @@ -153,7 +154,7 @@ jobs:
- compile
uses: ./.github/workflows/run_emqx_app_tests.yaml
with:
runner_labels: ${{ needs.sanity-checks.outputs.runner_labels }}
runner_labels: ${{ needs.sanity-checks.outputs.xl_runner_labels }}
builder: ${{ needs.sanity-checks.outputs.builder }}
before_ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
after_ref: ${{ github.sha }}
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/run_helm_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,13 @@ jobs:
echo "waiting emqx started";
sleep 10;
done
- name: Get Token
- name: Setup 18083 port forwarding
run: |
nohup kubectl port-forward service/${EMQX_NAME} 18083:18083 > /dev/null &
- name: Get auth token
run: |
kubectl port-forward service/${EMQX_NAME} 18083:18083 > /dev/null &
curl --head -X GET --retry 10 --retry-connrefused --retry-delay 6 http://localhost:18083/status
echo "TOKEN=$(curl --silent -X 'POST' 'http://127.0.0.1:18083/api/v5/login' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{"username": "admin","password": "public"}' | jq -r ".token")" >> $GITHUB_ENV

- name: Check cluster
timeout-minutes: 1
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/run_test_cases.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ jobs:

ct_docker:
runs-on: ${{ fromJSON(inputs.runner_labels) }}
name: "ct_docker (${{ matrix.app }}-${{ matrix.suitegroup }})"
name: "${{ matrix.app }}-${{ matrix.suitegroup }} (${{ matrix.profile }})"
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -119,7 +119,7 @@ jobs:

ct:
runs-on: ${{ fromJSON(inputs.runner_labels) }}
name: "ct (${{ matrix.app }}-${{ matrix.suitegroup }})"
name: "${{ matrix.app }}-${{ matrix.suitegroup }} (${{ matrix.profile }})"
strategy:
fail-fast: false
matrix:
Expand Down
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ ifneq ($(CASES),)
CASES_ARG := --case $(CASES)
endif

# Allow user-set GROUPS environment variable
ifneq ($(GROUPS),)
GROUPS_ARG := --groups $(GROUPS)
endif

## example:
## env SUITES=apps/appname/test/test_SUITE.erl CASES=t_foo make apps/appname-ct
define gen-app-ct-target
Expand All @@ -122,6 +127,7 @@ ifneq ($(SUITES),)
--name $(CT_NODE_NAME) \
--cover_export_name $(CT_COVER_EXPORT_PREFIX)-$(subst /,-,$1) \
--suite $(SUITES) \
$(GROUPS_ARG) \
$(CASES_ARG)
else
@echo 'No suites found for $1'
Expand Down
2 changes: 1 addition & 1 deletion apps/emqx/include/emqx_release.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
-define(EMQX_RELEASE_CE, "5.3.1-alpha.1").

%% Enterprise edition
-define(EMQX_RELEASE_EE, "5.3.1-alpha.1").
-define(EMQX_RELEASE_EE, "5.3.1-alpha.2").

%% The HTTP API version
-define(EMQX_API_VERSION, "5.0").
2 changes: 2 additions & 0 deletions apps/emqx/priv/bpapi.versions
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
{emqx_bridge,2}.
{emqx_bridge,3}.
{emqx_bridge,4}.
{emqx_bridge,5}.
{emqx_broker,1}.
{emqx_cm,1}.
{emqx_cm,2}.
{emqx_conf,1}.
{emqx_conf,2}.
{emqx_conf,3}.
{emqx_connector, 1}.
{emqx_dashboard,1}.
{emqx_delayed,1}.
{emqx_delayed,2}.
Expand Down
24 changes: 17 additions & 7 deletions apps/emqx/src/emqx_config.erl
Original file line number Diff line number Diff line change
Expand Up @@ -325,22 +325,32 @@ init_load(SchemaMod, Conf) when is_list(Conf) orelse is_binary(Conf) ->
ok = save_schema_mod_and_names(SchemaMod),
HasDeprecatedFile = has_deprecated_file(),
RawConf0 = load_config_files(HasDeprecatedFile, Conf),
warning_deprecated_root_key(RawConf0),
RawConf1 =
RawConf1 = upgrade_raw_conf(SchemaMod, RawConf0),
warning_deprecated_root_key(RawConf1),
RawConf2 =
case HasDeprecatedFile of
true ->
overlay_v0(SchemaMod, RawConf0);
overlay_v0(SchemaMod, RawConf1);
false ->
overlay_v1(SchemaMod, RawConf0)
overlay_v1(SchemaMod, RawConf1)
end,
RawConf = fill_defaults_for_all_roots(SchemaMod, RawConf1),
RawConf3 = fill_defaults_for_all_roots(SchemaMod, RawConf2),
%% check configs against the schema
{AppEnvs, CheckedConf} = check_config(SchemaMod, RawConf, #{}),
{AppEnvs, CheckedConf} = check_config(SchemaMod, RawConf3, #{}),
save_to_app_env(AppEnvs),
ok = save_to_config_map(CheckedConf, RawConf),
ok = save_to_config_map(CheckedConf, RawConf3),
maybe_init_default_zone(),
ok.

upgrade_raw_conf(SchemaMod, RawConf) ->
case erlang:function_exported(SchemaMod, upgrade_raw_conf, 1) of
true ->
%% TODO make it a schema module behaviour in hocon_schema
apply(SchemaMod, upgrade_raw_conf, [RawConf]);
false ->
RawConf
end.

%% Merge environment variable overrides on top, then merge with overrides.
overlay_v0(SchemaMod, RawConf) when is_map(RawConf) ->
RawConfWithEnvs = merge_envs(SchemaMod, RawConf),
Expand Down
4 changes: 2 additions & 2 deletions apps/emqx/src/emqx_config_handler.erl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

-include("logger.hrl").
-include("emqx_schema.hrl").
-include_lib("hocon/include/hoconsc.hrl").
-include_lib("hocon/include/hocon_types.hrl").

-behaviour(gen_server).

Expand Down Expand Up @@ -736,7 +736,7 @@ remove_empty_leaf(KeyPath, Handlers) ->
end.

assert_callback_function(Mod) ->
_ = Mod:module_info(),
_ = apply(Mod, module_info, []),
case
erlang:function_exported(Mod, pre_config_update, 3) orelse
erlang:function_exported(Mod, post_config_update, 5)
Expand Down
82 changes: 82 additions & 0 deletions apps/emqx/test/emqx_common_test_helpers.erl
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

-export([
all/1,
matrix_to_groups/2,
group_path/1,
init_per_testcase/3,
end_per_testcase/3,
boot_modules/1,
Expand Down Expand Up @@ -1375,3 +1377,83 @@ select_free_port(GenModule, Fun) when
end,
ct:pal("Select free OS port: ~p", [Port]),
Port.

%% Generate ct sub-groups from test-case's 'matrix' clause
%% NOTE: the test cases must have a root group name which
%% is unkonwn to this API.
%%
%% e.g.
%% all() -> [{group, g1}].
%%
%% groups() ->
%% emqx_common_test_helpers:groups(?MODULE, [case1, case2]).
%%
%% case1(matrxi) ->
%% {g1, [[tcp, no_auth],
%% [ssl, no_auth],
%% [ssl, basic_auth]
%% ]};
%%
%% case2(matrxi) ->
%% {g1, ...}
%% ...
%%
%% Return:
%%
%% [{g1, [],
%% [ {tcp, [], [{no_auth, [], [case1, case2]}
%% ]},
%% {ssl, [], [{no_auth, [], [case1, case2]},
%% {basic_auth, [], [case1, case2]}
%% ]}
%% ]
%% }
%% ]
matrix_to_groups(Module, Cases) ->
lists:foldr(
fun(Case, Acc) ->
add_case_matrix(Module, Case, Acc)
end,
[],
Cases
).

add_case_matrix(Module, Case, Acc0) ->
{RootGroup, Matrix} = Module:Case(matrix),
lists:foldr(
fun(Row, Acc) ->
add_group([RootGroup | Row], Acc, Case)
end,
Acc0,
Matrix
).

add_group([], Acc, Case) ->
case lists:member(Case, Acc) of
true ->
Acc;
false ->
[Case | Acc]
end;
add_group([Name | More], Acc, Cases) ->
case lists:keyfind(Name, 1, Acc) of
false ->
[{Name, [], add_group(More, [], Cases)} | Acc];
{Name, [], SubGroup} ->
New = {Name, [], add_group(More, SubGroup, Cases)},
lists:keystore(Name, 1, Acc, New)
end.

group_path(Config) ->
try
Current = proplists:get_value(tc_group_properties, Config),
NameF = fun(Props) ->
{name, Name} = lists:keyfind(name, 1, Props),
Name
end,
Stack = proplists:get_value(tc_group_path, Config),
lists:reverse(lists:map(NameF, [Current | Stack]))
catch
_:_ ->
[]
end.
2 changes: 1 addition & 1 deletion apps/emqx/test/emqx_common_test_http.erl
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ request_api(Method, Url, QueryParams, Auth, Body, HttpOpts) ->
do_request_api(Method, Request, HttpOpts).

do_request_api(Method, Request, HttpOpts) ->
ct:pal("Method: ~p, Request: ~p", [Method, Request]),
% ct:pal("Method: ~p, Request: ~p", [Method, Request]),
case httpc:request(Method, Request, HttpOpts, [{body_format, binary}]) of
{error, socket_closed_remotely} ->
{error, socket_closed_remotely};
Expand Down
2 changes: 1 addition & 1 deletion apps/emqx_bridge/src/emqx_bridge.app.src
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
%% -*- mode: erlang -*-
{application, emqx_bridge, [
{description, "EMQX bridges"},
{vsn, "0.1.28"},
{vsn, "0.1.29"},
{registered, [emqx_bridge_sup]},
{mod, {emqx_bridge_app, []}},
{applications, [
Expand Down