Merge tag 'v4.3-alpha.1' into merge-4.3-alpha.1-to-5.0

This commit is contained in:
Zaiming Shi 2021-01-29 15:12:37 +01:00
commit 4e19e99ec4
10 changed files with 46 additions and 54 deletions

View File

@ -28,14 +28,13 @@ services:
- emqx_bridge - emqx_bridge
command: command:
--bind-address "::" --bind-address "::"
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4 --character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci --collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true --explicit_defaults_for_timestamp=true
--lower_case_table_names=1 --lower_case_table_names=1
--max_allowed_packet=128M --max_allowed_packet=128M
--skip-symbolic-links --skip-symbolic-links
--ssl-ca=/etc/certs/ca.pem --ssl-ca=/etc/certs/ca-cert.pem
--ssl-cert=/etc/certs/server-cert.pem --ssl-cert=/etc/certs/server-cert.pem
--ssl-key=/etc/certs/server-key.pem --ssl-key=/etc/certs/server-key.pem

View File

@ -16,6 +16,8 @@ jobs:
windows: windows:
runs-on: windows-2019 runs-on: windows-2019
if: startsWith(github.ref, 'refs/tags/')
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- uses: ilammy/msvc-dev-cmd@v1 - uses: ilammy/msvc-dev-cmd@v1
@ -64,7 +66,6 @@ jobs:
./_build/emqx/rel/emqx/bin/emqx install ./_build/emqx/rel/emqx/bin/emqx install
./_build/emqx/rel/emqx/bin/emqx uninstall ./_build/emqx/rel/emqx/bin/emqx uninstall
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1
if: startsWith(github.ref, 'refs/tags/')
with: with:
name: emqx name: emqx
path: ./_packages/emqx/. path: ./_packages/emqx/.
@ -72,6 +73,8 @@ jobs:
mac: mac:
runs-on: macos-10.15 runs-on: macos-10.15
if: startsWith(github.ref, 'refs/tags/')
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- name: prepare - name: prepare
@ -80,6 +83,7 @@ jobs:
echo "/usr/local/bin" >> $GITHUB_PATH echo "/usr/local/bin" >> $GITHUB_PATH
git config --global credential.helper store git config --global credential.helper store
- name: build erlang - name: build erlang
timeout-minutes: 60
run: | run: |
kerl build 23.2.2 kerl build 23.2.2
kerl install 23.2.2 $HOME/.kerl/23.2.2 kerl install 23.2.2 $HOME/.kerl/23.2.2
@ -111,7 +115,6 @@ jobs:
rm -rf emqx rm -rf emqx
openssl dgst -sha256 ./_packages/emqx/$pkg_name | awk '{print $2}' > ./_packages/emqx/$pkg_name.sha256 openssl dgst -sha256 ./_packages/emqx/$pkg_name | awk '{print $2}' > ./_packages/emqx/$pkg_name.sha256
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1
if: startsWith(github.ref, 'refs/tags/')
with: with:
name: emqx name: emqx
path: ./_packages/emqx/. path: ./_packages/emqx/.
@ -245,6 +248,8 @@ jobs:
docker: docker:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: startsWith(github.ref, 'refs/tags/')
strategy: strategy:
matrix: matrix:
arch: arch:
@ -280,12 +285,10 @@ jobs:
sudo TARGET=emqx/emqx-edge ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker sudo TARGET=emqx/emqx-edge ARCH=$ARCH QEMU_ARCH=$QEMU_ARCH make docker
cd _packages/emqx-edge && for var in $(ls emqx-edge-docker-* ); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd - cd _packages/emqx-edge && for var in $(ls emqx-edge-docker-* ); do sudo bash -c "echo $(sha256sum $var | awk '{print $1}') > $var.sha256"; done && cd -
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1
if: startsWith(github.ref, 'refs/tags/')
with: with:
name: emqx name: emqx
path: ./_packages/emqx/. path: ./_packages/emqx/.
- uses: actions/upload-artifact@v1 - uses: actions/upload-artifact@v1
if: startsWith(github.ref, 'refs/tags/')
with: with:
name: emqx-edge name: emqx-edge
path: ./_packages/emqx-edge/. path: ./_packages/emqx-edge/.

View File

@ -121,7 +121,7 @@ jobs:
- ipv4 - ipv4
- ipv6 - ipv6
connect_type: connect_type:
# - tls - tls
- tcp - tcp
steps: steps:

View File

@ -1,6 +1,6 @@
{deps, {deps,
[ [
{mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.6.1"}}} {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}
]}. ]}.
{edoc_opts, [{preprocess, true}]}. {edoc_opts, [{preprocess, true}]}.

View File

@ -72,8 +72,7 @@
]). ]).
%% Routes %% Routes
-export([ list_routes/0 -export([ lookup_routes/1
, lookup_routes/1
]). ]).
%% PubSub %% PubSub
@ -421,12 +420,6 @@ lookup_subscriptions(Node, ClientId) ->
%% Routes %% Routes
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
list_routes() ->
case check_row_limit([emqx_route]) of
false -> throw(max_row_limit);
ok -> ets:tab2list(emqx_route)
end.
lookup_routes(Topic) -> lookup_routes(Topic) ->
emqx_router:lookup_routes(Topic). emqx_router:lookup_routes(Topic).

View File

@ -341,20 +341,19 @@ update_resource(#{id := Id}, NewParams) ->
ok -> ok ->
return(ok); return(ok);
{error, not_found} -> {error, not_found} ->
?LOG(error, "resource not found: ~0p", [Id]), ?LOG(error, "Resource not found: ~0p", [Id]),
return({error, 400, <<"resource not found:", Id/binary>>}); return({error, 400, <<"Resource not found:", Id/binary>>});
{error, {init_resource_failure, _}} -> {error, {init_resource_failure, _}} ->
?LOG(error, "init resource failure: ~0p", [Id]), ?LOG(error, "Init resource failure: ~0p", [Id]),
return({error, 500, <<"init resource failure:", Id/binary>>}); return({error, 500, <<"Init resource failure:", Id/binary>>});
{error, {dependency_exists, RuleId}} -> {error, {dependency_exists, RuleId}} ->
?LOG(error, "dependency exists: ~0p", [RuleId]), ?LOG(error, "Dependency exists: ~0p", [RuleId]),
return({error, 500, <<"resource dependency by rule:", RuleId/binary>>}); return({error, 500, <<"Dependency exists:", RuleId/binary>>});
{error, Reason} -> {error, Reason} ->
?LOG(error, "update resource failed: ~0p", [Reason]), ?LOG(error, "Resource update failed: ~0p", [Reason]),
return({error, 500, <<"update resource failed,error info have been written to logfile!">>}) return({error, 500, <<"Resource update failed!">>})
end. end.
delete_resource(#{id := Id}, _Params) -> delete_resource(#{id := Id}, _Params) ->
case emqx_rule_engine:delete_resource(Id) of case emqx_rule_engine:delete_resource(Id) of
ok -> return(ok); ok -> return(ok);
@ -531,14 +530,7 @@ parse_resource_params([_ | Params], Res) ->
parse_resource_params(Params, Res). parse_resource_params(Params, Res).
json_term_to_map(List) -> json_term_to_map(List) ->
Data = lists:map(fun({K, V}) -> emqx_json:decode(emqx_json:encode(List), [return_maps]).
case V of
{} ->{K, [{}]};
_ -> {K, V}
end
end,
List),
emqx_json:decode(emqx_json:encode(Data), [return_maps]).
sort_by_title(action, Actions) -> sort_by_title(action, Actions) ->
sort_by(#action.title, Actions); sort_by(#action.title, Actions);

View File

@ -173,7 +173,7 @@ resources(["update" | Params]) ->
ok -> ok ->
emqx_ctl:print("Resource update successfully~n"); emqx_ctl:print("Resource update successfully~n");
{error, Reason} -> {error, Reason} ->
emqx_ctl:print("update resource failed, reason: ~p!~n", [Reason]) emqx_ctl:print("Resource update failed: ~0p~n", [Reason])
end end
end, Params, ?OPTSPEC_RESOURCES_UPDATE, {?FUNCTION_NAME, update}); end, Params, ?OPTSPEC_RESOURCES_UPDATE, {?FUNCTION_NAME, update});

View File

@ -382,7 +382,7 @@ t_crud_rule_api(_Config) ->
RuleID = maps:get(id, Rule), RuleID = maps:get(id, Rule),
%ct:pal("RCreated : ~p", [Rule]), %ct:pal("RCreated : ~p", [Rule]),
{ok, #{code := 0, data := Rules}} = emqx_rule_engine_api:list_rules(#{},[]), {ok, #{code := 0, data := Rules}} = emqx_rule_engine_api:list_rules(#{}, []),
%ct:pal("RList : ~p", [Rules]), %ct:pal("RList : ~p", [Rules]),
?assert(length(Rules) > 0), ?assert(length(Rules) > 0),
@ -424,13 +424,13 @@ t_crud_rule_api(_Config) ->
ok. ok.
t_list_actions_api(_Config) -> t_list_actions_api(_Config) ->
{ok, #{code := 0, data := Actions}} = emqx_rule_engine_api:list_actions(#{},[]), {ok, #{code := 0, data := Actions}} = emqx_rule_engine_api:list_actions(#{}, []),
%ct:pal("RList : ~p", [Actions]), %ct:pal("RList : ~p", [Actions]),
?assert(length(Actions) > 0), ?assert(length(Actions) > 0),
ok. ok.
t_show_action_api(_Config) -> t_show_action_api(_Config) ->
{ok, #{code := 0, data := Actions}} = emqx_rule_engine_api:show_action(#{name => 'inspect'},[]), {ok, #{code := 0, data := Actions}} = emqx_rule_engine_api:show_action(#{name => 'inspect'}, []),
?assertEqual('inspect', maps:get(name, Actions)), ?assertEqual('inspect', maps:get(name, Actions)),
ok. ok.
@ -442,24 +442,22 @@ t_crud_resources_api(_Config) ->
{<<"config">>, [{<<"a">>, 1}]}, {<<"config">>, [{<<"a">>, 1}]},
{<<"description">>, <<"Simple Resource">>}]), {<<"description">>, <<"Simple Resource">>}]),
ResId = maps:get(id, Resources1), ResId = maps:get(id, Resources1),
{ok, #{code := 0, data := Resources}} = emqx_rule_engine_api:list_resources(#{},[]), {ok, #{code := 0, data := Resources}} = emqx_rule_engine_api:list_resources(#{}, []),
?assert(length(Resources) > 0), ?assert(length(Resources) > 0),
{ok, #{code := 0, data := Resources2}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources2}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources2)), ?assertEqual(ResId, maps:get(id, Resources2)),
% %
{ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId}, {ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId},
[{<<"config">>, [{<<"a">>, 2}]}, [{<<"config">>, [{<<"a">>, 2}]},
{<<"description">>, <<"2">>}]), {<<"description">>, <<"2">>}]),
{ok, #{code := 0, data := Resources3}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources3}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources3)), ?assertEqual(ResId, maps:get(id, Resources3)),
?assertEqual(#{<<"a">> => 2}, maps:get(config, Resources3)), ?assertEqual(#{<<"a">> => 2}, maps:get(config, Resources3)),
?assertEqual(<<"2">>, maps:get(description, Resources3)), ?assertEqual(<<"2">>, maps:get(description, Resources3)),
{ok, #{code := 0, data := Resources3}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]),
?assertEqual(ResId, maps:get(id, Resources3)),
% %
{ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId}, {ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId},
[{<<"config">>, [{<<"a">>, 3}]}]), [{<<"config">>, [{<<"a">>, 3}]}]),
{ok, #{code := 0, data := Resources4}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources4}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources4)), ?assertEqual(ResId, maps:get(id, Resources4)),
?assertEqual(#{<<"a">> => 3}, maps:get(config, Resources4)), ?assertEqual(#{<<"a">> => 3}, maps:get(config, Resources4)),
?assertEqual(<<"2">>, maps:get(description, Resources4)), ?assertEqual(<<"2">>, maps:get(description, Resources4)),
@ -468,36 +466,35 @@ t_crud_resources_api(_Config) ->
[{<<"config">>, [{<<"a">>, 1}, [{<<"config">>, [{<<"a">>, 1},
{<<"b">>, 2}, {<<"b">>, 2},
{<<"c">>, 3}]}]), {<<"c">>, 3}]}]),
{ok, #{code := 0, data := Resources5}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources5}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources5)), ?assertEqual(ResId, maps:get(id, Resources5)),
?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources5)), ?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources5)),
?assertEqual(<<"2">>, maps:get(description, Resources5)), ?assertEqual(<<"2">>, maps:get(description, Resources5)),
% Only description % Only description
{ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId}, {ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId},
[{<<"description">>, <<"new5">>}]), [{<<"description">>, <<"new5">>}]),
{ok, #{code := 0, data := Resources6}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources6}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources6)), ?assertEqual(ResId, maps:get(id, Resources6)),
?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources6)), ?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources6)),
?assertEqual(<<"new5">>, maps:get(description, Resources6)), ?assertEqual(<<"new5">>, maps:get(description, Resources6)),
% None % None
{ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId},[]), {ok, #{code := 0}} = emqx_rule_engine_api:update_resource(#{id => ResId}, []),
{ok, #{code := 0, data := Resources7}} = emqx_rule_engine_api:show_resource(#{id => ResId},[]), {ok, #{code := 0, data := Resources7}} = emqx_rule_engine_api:show_resource(#{id => ResId}, []),
?assertEqual(ResId, maps:get(id, Resources7)), ?assertEqual(ResId, maps:get(id, Resources7)),
?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources7)), ?assertEqual(#{<<"a">> => 1, <<"b">> => 2, <<"c">> => 3}, maps:get(config, Resources7)),
?assertEqual(<<"new5">>, maps:get(description, Resources7)), ?assertEqual(<<"new5">>, maps:get(description, Resources7)),
% %
?assertMatch({ok, #{code := 0}}, emqx_rule_engine_api:delete_resource(#{id => ResId},#{})), ?assertMatch({ok, #{code := 0}}, emqx_rule_engine_api:delete_resource(#{id => ResId},#{})),
?assertMatch({ok, #{code := 404}}, emqx_rule_engine_api:show_resource(#{id => ResId},[])), ?assertMatch({ok, #{code := 404}}, emqx_rule_engine_api:show_resource(#{id => ResId}, [])),
ok. ok.
t_list_resource_types_api(_Config) -> t_list_resource_types_api(_Config) ->
{ok, #{code := 0, data := ResourceTypes}} = emqx_rule_engine_api:list_resource_types(#{},[]), {ok, #{code := 0, data := ResourceTypes}} = emqx_rule_engine_api:list_resource_types(#{}, []),
?assert(length(ResourceTypes) > 0), ?assert(length(ResourceTypes) > 0),
ok. ok.
t_show_resource_type_api(_Config) -> t_show_resource_type_api(_Config) ->
{ok, #{code := 0, data := RShow}} = emqx_rule_engine_api:show_resource_type(#{name => 'built_in'},[]), {ok, #{code := 0, data := RShow}} = emqx_rule_engine_api:show_resource_type(#{name => 'built_in'}, []),
%ct:pal("RShow : ~p", [RShow]), %ct:pal("RShow : ~p", [RShow]),
?assertEqual(built_in, maps:get(name, RShow)), ?assertEqual(built_in, maps:get(name, RShow)),
ok. ok.

View File

@ -1,12 +1,20 @@
#!/bin/bash #!/bin/bash
set -e -u
# This script prints the release version for emqx # This script prints the release version for emqx
# ensure dir # ensure dir
cd -P -- "$(dirname -- "$0")" cd -P -- "$(dirname -- "$0")"
case $(uname) in
*Darwin*) SED="sed -E";;
*) SED="sed -r";;
esac
# comment SUFFIX out when finalising RELEASE # comment SUFFIX out when finalising RELEASE
RELEASE="4.3.0" RELEASE="$(grep -oE '\{vsn, (.*)\}' src/emqx.app.src | $SED 's/\{vsn, (.*)\}/\1/g' | $SED 's/\"//g')"
SUFFIX="-pre-$(git rev-parse HEAD | cut -b1-8)" if [ -d .git ] && ! git describe --tags --match "v${RELEASE}" --exact >/dev/null 2>&1; then
SUFFIX="-$(git rev-parse HEAD | cut -b1-8)"
fi
echo "${RELEASE}${SUFFIX:-}" echo "${RELEASE}${SUFFIX:-}"

View File

@ -1,7 +1,7 @@
{application, emqx, {application, emqx,
[{description, "EMQ X Broker"}, [{description, "EMQ X Broker"},
{id, "emqx"}, {id, "emqx"},
{vsn, "4.3.0"}, % strict semver, bump manually! {vsn, "4.3-alpha.1"}, % strict semver, bump manually!
{modules, []}, {modules, []},
{registered, []}, {registered, []},
{applications, [kernel,stdlib,gproc,gen_rpc,esockd,cowboy,sasl,os_mon]}, {applications, [kernel,stdlib,gproc,gen_rpc,esockd,cowboy,sasl,os_mon]},