Merge pull request #10857 from thalesmg/tag-v5026

chore: tag `v5.0.26`
This commit is contained in:
Thales Macedo Garitezi 2023-05-29 18:31:15 -03:00 committed by GitHub
commit 2a46d986bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 144 additions and 89 deletions

View File

@ -97,7 +97,6 @@ jobs:
env:
PROFILE: ${{ steps.get_profile.outputs.PROFILE }}
run: |
PROFILE=$PROFILE make -C source deps-$PROFILE
zip -ryq source.zip source/* source/.[^.]*
- uses: actions/upload-artifact@v3
with:

View File

@ -32,7 +32,7 @@
%% `apps/emqx/src/bpapi/README.md'
%% Community edition
-define(EMQX_RELEASE_CE, "5.0.26-alpha.1").
-define(EMQX_RELEASE_CE, "5.0.26").
%% Enterprise edition
-define(EMQX_RELEASE_EE, "5.0.4").

View File

@ -106,7 +106,7 @@ get_enabled_authns() ->
AuthnTypes = lists:usort([
Type
|| #{authenticators := As} <- Chains,
#{id := Type} <- As
#{id := Type, enable := true} <- As
]),
OverriddenListeners =
lists:foldl(

View File

@ -417,7 +417,7 @@ do_authorize(
end.
get_enabled_authzs() ->
lists:usort([Type || #{type := Type} <- lookup()]).
lists:usort([Type || #{type := Type, enable := true} <- lookup()]).
%%--------------------------------------------------------------------
%% Internal function

View File

@ -366,7 +366,7 @@ t_get_enabled_authzs_none_enabled(_Config) ->
?assertEqual([], emqx_authz:get_enabled_authzs()).
t_get_enabled_authzs_some_enabled(_Config) ->
{ok, _} = emqx_authz:update(?CMD_REPLACE, [?SOURCE4]),
{ok, _} = emqx_authz:update(?CMD_REPLACE, [?SOURCE4, ?SOURCE5#{<<"enable">> := false}]),
?assertEqual([postgresql], emqx_authz:get_enabled_authzs()).
t_subscribe_deny_disconnect_publishes_last_will_testament(_Config) ->

View File

@ -2,7 +2,7 @@
{application, emqx_dashboard, [
{description, "EMQX Web Dashboard"},
% strict semver, bump manually!
{vsn, "5.0.21"},
{vsn, "5.0.22"},
{modules, []},
{registered, [emqx_dashboard_sup]},
{applications, [kernel, stdlib, mnesia, minirest, emqx, emqx_ctl]},

View File

@ -21,11 +21,12 @@
-export([init/2]).
init(Req0, State) ->
?SLOG(warning, #{msg => "unexpected_api_access", request => Req0}),
RedactedReq = emqx_utils:redact(Req0),
?SLOG(warning, #{msg => "unexpected_api_access", request => RedactedReq}),
Req = cowboy_req:reply(
404,
#{<<"content-type">> => <<"application/json">>},
<<"{\"code\": \"API_NOT_EXIST\", \"message\": \"Request Path Not Found\"}">>,
Req0
RedactedReq
),
{ok, Req, State}.

View File

@ -58,7 +58,7 @@ prop_coverage_likely_incomplete() ->
{filesize_t(), segsizes_t(), filesize_t()},
?FORALL(
Fragments,
noshrink(segments_t(Filesize, Segsizes, Hole)),
noshrink(segments_t(Filesize, Segsizes, (Hole rem max(Filesize, 1)))),
?TIMEOUT(
?COVERAGE_TIMEOUT,
begin
@ -174,7 +174,7 @@ segment_t(Filesize, Segsizes, Hole) ->
?SUCHTHATMAYBE(
{Offset, Size},
segment_t(Filesize, Segsizes),
(Hole rem Filesize) =< Offset orelse (Hole rem Filesize) > (Offset + Size)
Hole =< Offset orelse Hole > (Offset + Size)
).
segment_t(Filesize, Segsizes) ->

View File

@ -24,6 +24,7 @@
-export([stop_port_apps/0]).
-dialyzer({no_match, [basic_reboot_apps/0]}).
-dialyzer({no_match, [basic_reboot_apps_edition/1]}).
-ifdef(TEST).
-export([sorted_reboot_apps/1, reboot_apps/0]).
@ -126,39 +127,40 @@ reboot_apps() ->
BaseRebootApps ++ ConfigApps.
basic_reboot_apps() ->
CE =
?BASIC_REBOOT_APPS ++
[
emqx_prometheus,
emqx_modules,
emqx_dashboard,
emqx_connector,
emqx_gateway,
emqx_resource,
emqx_rule_engine,
emqx_bridge,
emqx_plugin_libs,
emqx_management,
emqx_retainer,
emqx_exhook,
emqx_authn,
emqx_authz,
emqx_slow_subs,
emqx_auto_subscribe,
emqx_plugins
],
case emqx_release:edition() of
ce ->
CE ++ [emqx_telemetry];
ee ->
CE ++
[
emqx_s3,
emqx_ft,
emqx_eviction_agent,
emqx_node_rebalance
]
end.
?BASIC_REBOOT_APPS ++
[
emqx_prometheus,
emqx_modules,
emqx_dashboard,
emqx_connector,
emqx_gateway,
emqx_resource,
emqx_rule_engine,
emqx_bridge,
emqx_plugin_libs,
emqx_management,
emqx_retainer,
emqx_exhook,
emqx_authn,
emqx_authz,
emqx_slow_subs,
emqx_auto_subscribe,
emqx_plugins
] ++ basic_reboot_apps_edition(emqx_release:edition()).
basic_reboot_apps_edition(ce) ->
[emqx_telemetry];
basic_reboot_apps_edition(ee) ->
[
emqx_license,
emqx_s3,
emqx_ft,
emqx_eviction_agent,
emqx_node_rebalance
];
%% unexcepted edition, should not happen
basic_reboot_apps_edition(_) ->
[].
sorted_reboot_apps() ->
Apps = [{App, app_deps(App)} || App <- reboot_apps()],

View File

@ -121,7 +121,7 @@ start_reporting() ->
%% @doc Stop the reporting timer.
%% This is an async notification which never fails.
%% This is a no-op in enterprise eidtion.
%% This is a no-op in enterprise edition.
stop_reporting() ->
gen_server:cast(?MODULE, stop_reporting).

View File

@ -32,11 +32,12 @@
-export([
on_server_start/0,
on_server_stop/0,
is_official_version/1
is_official_version/1,
is_official_version/0
]).
is_enabled() ->
IsOfficial = ?MODULE:is_official_version(emqx_release:version()),
IsOfficial = ?MODULE:is_official_version(),
emqx_conf:get([telemetry, enable], IsOfficial).
on_server_start() ->
@ -53,7 +54,9 @@ set_telemetry_status(Status) ->
end.
pre_config_update(_, {set_telemetry_status, Status}, RawConf) ->
{ok, RawConf#{<<"enable">> => Status}}.
{ok, RawConf#{<<"enable">> => Status}};
pre_config_update(_, NewConf, _OldConf) ->
{ok, NewConf}.
post_config_update(
_,
@ -65,6 +68,11 @@ post_config_update(
case Status of
true -> emqx_telemetry:start_reporting();
false -> emqx_telemetry:stop_reporting()
end;
post_config_update(_, _UpdateReq, NewConf, _OldConf, _AppEnvs) ->
case maps:get(enable, NewConf, ?MODULE:is_official_version()) of
true -> emqx_telemetry:start_reporting();
false -> emqx_telemetry:stop_reporting()
end.
cfg_update(Path, Action, Params) ->
@ -74,6 +82,9 @@ cfg_update(Path, Action, Params) ->
#{override_to => cluster}
).
is_official_version() ->
is_official_version(emqx_release:version()).
is_official_version(Version) ->
Pt = "^\\d+\\.\\d+(?:\\.\\d+)?(?:(-(?:alpha|beta|rc)\\.[1-9][0-9]*))?$",
match =:= re:run(Version, Pt, [{capture, none}]).

View File

@ -30,6 +30,7 @@ all() ->
init_per_suite(Config) ->
ok = emqx_common_test_helpers:load_config(emqx_modules_schema, ?BASE_CONF),
ok = emqx_common_test_helpers:load_config(emqx_telemetry_schema, ?BASE_CONF),
ok = emqx_mgmt_api_test_util:init_suite(
[emqx_conf, emqx_authn, emqx_authz, emqx_telemetry],
fun set_special_configs/1
@ -52,32 +53,26 @@ end_per_suite(_Config) ->
ok.
init_per_testcase(t_status_non_official, Config) ->
meck:new(emqx_telemetry, [non_strict, passthrough]),
meck:expect(emqx_telemetry, official_version, 1, false),
meck:new(emqx_telemetry_config, [non_strict, passthrough]),
meck:expect(emqx_telemetry_config, is_official_version, 0, false),
%% check non-official telemetry is disable by default
{ok, _} = emqx:update_config([telemetry], #{}),
Config;
init_per_testcase(t_status, Config) ->
meck:new(emqx_telemetry, [non_strict, passthrough]),
meck:expect(emqx_telemetry, enable, fun() -> ok end),
{ok, _, _} =
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => true}
),
init_per_testcase(t_status_official, Config) ->
meck:new(emqx_telemetry_config, [non_strict, passthrough]),
meck:expect(emqx_telemetry_config, is_official_version, 0, true),
%% check official telemetry is enable by default
{ok, _} = emqx:update_config([telemetry], #{}),
Config;
init_per_testcase(_TestCase, Config) ->
{ok, _, _} =
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => true}
),
%% Force enable telemetry to check data.
{ok, _} = emqx:update_config([telemetry], #{<<"enable">> => true}),
Config.
end_per_testcase(t_status_non_official, _Config) ->
meck:unload(emqx_telemetry);
meck:unload(emqx_telemetry_config);
end_per_testcase(t_status, _Config) ->
meck:unload(emqx_telemetry);
meck:unload(emqx_telemetry_config);
end_per_testcase(_TestCase, _Config) ->
ok.
@ -95,39 +90,50 @@ set_special_configs(_App) ->
%% Tests
%%------------------------------------------------------------------------------
t_status(_) ->
%% official's telemetry is enabled by default
t_status_official(_) ->
check_status(true).
%% non official's telemetry is disabled by default
t_status_non_official(_) ->
check_status(false).
check_status(Default) ->
ct:pal("Check telemetry status:~p~n", [emqx_telemetry_config:is_official_version()]),
?assertEqual(Default, is_telemetry_process_enabled()),
?assertMatch(
{ok, 200, _},
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => false}
#{<<"enable">> => (not Default)}
)
),
{ok, 200, Result0} =
request(get, uri(["telemetry", "status"])),
?assertEqual(
#{<<"enable">> => false},
#{<<"enable">> => (not Default)},
emqx_utils_json:decode(Result0)
),
?assertEqual((not Default), is_telemetry_process_enabled()),
?assertMatch(
{ok, 400, _},
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => false}
#{<<"enable">> => (not Default)}
)
),
?assertEqual((not Default), is_telemetry_process_enabled()),
?assertMatch(
{ok, 200, _},
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => true}
#{<<"enable">> => Default}
)
),
@ -135,30 +141,24 @@ t_status(_) ->
request(get, uri(["telemetry", "status"])),
?assertEqual(
#{<<"enable">> => true},
#{<<"enable">> => Default},
emqx_utils_json:decode(Result1)
),
?assertEqual(Default, is_telemetry_process_enabled()),
?assertMatch(
{ok, 400, _},
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => true}
#{<<"enable">> => Default}
)
).
t_status_non_official(_) ->
?assertMatch(
{ok, 200, _},
request(
put,
uri(["telemetry", "status"]),
#{<<"enable">> => false}
)
).
),
?assertEqual(Default, is_telemetry_process_enabled()),
ok.
t_data(_) ->
?assert(is_telemetry_process_enabled()),
{ok, 200, Result} =
request(get, uri(["telemetry", "data"])),
@ -191,3 +191,23 @@ t_data(_) ->
request(get, uri(["telemetry", "data"])),
ok.
%% Support emqx:update_config([telemetry], Conf).
t_conf_update(_) ->
Conf = emqx:get_raw_config([telemetry]),
?assert(is_telemetry_process_enabled()),
{ok, 200, Result1} = request(get, uri(["telemetry", "status"])),
?assertEqual(#{<<"enable">> => true}, emqx_utils_json:decode(Result1)),
{ok, _} = emqx:update_config([telemetry], Conf#{<<"enable">> => false}),
{ok, 200, Result2} = request(get, uri(["telemetry", "status"])),
?assertEqual(#{<<"enable">> => false}, emqx_utils_json:decode(Result2)),
?assertNot(is_telemetry_process_enabled()),
%% reset to true
{ok, _} = emqx:update_config([telemetry], Conf#{<<"enable">> => true}),
?assert(is_telemetry_process_enabled()),
ok.
is_telemetry_process_enabled() ->
%% timer is not undefined.
Timer = element(6, sys:get_state(emqx_telemetry)),
is_reference(Timer).

View File

@ -2,7 +2,7 @@
{application, emqx_utils, [
{description, "Miscellaneous utilities for EMQX apps"},
% strict semver, bump manually!
{vsn, "5.0.1"},
{vsn, "5.0.2"},
{modules, [
emqx_utils,
emqx_utils_api,

View File

@ -575,6 +575,9 @@ try_to_existing_atom(Convert, Data, Encoding) ->
is_sensitive_key(token) -> true;
is_sensitive_key("token") -> true;
is_sensitive_key(<<"token">>) -> true;
is_sensitive_key(authorization) -> true;
is_sensitive_key("authorization") -> true;
is_sensitive_key(<<"authorization">>) -> true;
is_sensitive_key(password) -> true;
is_sensitive_key("password") -> true;
is_sensitive_key(<<"password">>) -> true;

View File

@ -0,0 +1,6 @@
In case the cluster updated license before the new node join in. The new node will not apply the updated license.
After this change, the new joined node will use the cluster's license key.
Sometimes the new node must start with a outdated license.
e.g. use emqx-operator deployed and needed to scale up after license expired.
At the time the cluster's license key already updated by API/CLI, but the new node won't use it.

View File

@ -0,0 +1 @@
Only include enabled authenticators and authorizers in telemetry report, not all of them.

View File

@ -0,0 +1 @@
Obfuscated sensitive data in the bad API logging.

View File

@ -1,4 +1,4 @@
# <VSN-TAG>
# v5.0.26
## Enhancements
@ -105,3 +105,14 @@
- [#10817](https://github.com/emqx/emqx/pull/10817) Fix the error of not being able to configure `auto_restart_interval` as infinity
- [#10818](https://github.com/emqx/emqx/pull/10818) Fixing `emqx_ctl traces` command.
- [#10820](https://github.com/emqx/emqx/pull/10820) In case the cluster updated license before the new node join in. The new node will not apply the updated license.
After this change, the new joined node will use the cluster's license key.
Sometimes the new node must start with a outdated license.
e.g. use emqx-operator deployed and needed to scale up after license expired.
At the time the cluster's license key already updated by API/CLI, but the new node won't use it.
- [#10833](https://github.com/emqx/emqx/pull/10833) Only include enabled authenticators and authorizers in telemetry report, not all of them.
- [#10851](https://github.com/emqx/emqx/pull/10851) Obfuscated sensitive data in the bad API logging.

View File

@ -14,8 +14,8 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 5.0.25
version: 5.0.26
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 5.0.25
appVersion: 5.0.26