test: add test for updating cluster.links

This commit is contained in:
zhongwencool 2024-07-10 10:05:28 +08:00
parent 2783192f77
commit 7b6b9580c8
2 changed files with 81 additions and 13 deletions

View File

@ -56,9 +56,28 @@ mk_clusters(NameA, NameB, PortA, PortB, ConfA, ConfB, Config) ->
),
{NodesA, NodesB}.
t_config_update_cli('init', Config0) ->
Config =
[
{update_from, cli},
{name_prefix, ?FUNCTION_NAME}
| lists:keydelete(update_from, 1, Config0)
],
t_config_update('init', Config);
t_config_update_cli('end', Config) ->
t_config_update('end', Config).
t_config_update_cli(Config) ->
t_config_update(Config).
t_config_update('init', Config) ->
NameA = fmt("~s_~s", [?FUNCTION_NAME, "a"]),
NameB = fmt("~s_~s", [?FUNCTION_NAME, "b"]),
NamePrefix =
case ?config(name_prefix, Config) of
undefined -> ?FUNCTION_NAME;
Name -> Name
end,
NameA = fmt("~s_~s", [NamePrefix, "a"]),
NameB = fmt("~s_~s", [NamePrefix, "b"]),
LPortA = 31883,
LPortB = 41883,
ConfA = combine([conf_cluster(NameA), conf_log()]),
@ -73,7 +92,8 @@ t_config_update('init', Config) ->
{lport_a, LPortA},
{lport_b, LPortB},
{name_a, NameA},
{name_b, NameB}
{name_b, NameB},
{update_from, api}
| Config
];
t_config_update('end', Config) ->
@ -113,12 +133,12 @@ t_config_update(Config) ->
{ok, SubRef} = snabbkaffe:subscribe(
?match_event(#{?snk_kind := clink_route_bootstrap_complete}),
%% 5 nodes = 5 actors (durable storage is dsabled)
%% 5 nodes = 5 actors (durable storage is disabled)
5,
30_000
),
?assertMatch({ok, _}, erpc:call(NodeA1, emqx_cluster_link_config, update, [[LinkConfA]])),
?assertMatch({ok, _}, erpc:call(NodeB1, emqx_cluster_link_config, update, [[LinkConfB]])),
?assertMatch({ok, _}, update(NodeA1, [LinkConfA], Config)),
?assertMatch({ok, _}, update(NodeB1, [LinkConfB], Config)),
?assertMatch(
{ok, [
@ -158,7 +178,7 @@ t_config_update(Config) ->
%% update link
LinkConfA1 = LinkConfA#{<<"pool_size">> => 2, <<"topics">> => [<<"t/new/+">>]},
?assertMatch({ok, _}, erpc:call(NodeA1, emqx_cluster_link_config, update, [[LinkConfA1]])),
?assertMatch({ok, _}, update(NodeA1, [LinkConfA1], Config)),
?assertMatch(
{ok, [
@ -187,20 +207,21 @@ t_config_update(Config) ->
%% disable link
LinkConfA2 = LinkConfA1#{<<"enable">> => false},
?assertMatch({ok, _}, erpc:call(NodeA1, emqx_cluster_link_config, update, [[LinkConfA2]])),
%% must be already blocked by the receiving cluster even if externak routing state is not
?assertMatch({ok, _}, update(NodeA1, [LinkConfA2], Config)),
%% must be already blocked by the receiving cluster even if external routing state is not
%% updated yet
{ok, _} = emqtt:publish(ClientB, <<"t/new/1">>, <<"not-expected-hello-from-b-1">>, qos1),
LinkConfB1 = LinkConfB#{<<"enable">> => false},
?assertMatch({ok, _}, erpc:call(NodeB1, emqx_cluster_link_config, update, [[LinkConfB1]])),
?assertMatch({ok, _}, update(NodeB1, [LinkConfB1], Config)),
{ok, _} = emqtt:publish(ClientA, <<"t/test-topic">>, <<"not-expected-hello-from-a">>, qos1),
?assertNotReceive({publish, _Message = #{}}, 3000),
%% delete links
?assertMatch({ok, _}, erpc:call(NodeA1, emqx_cluster_link_config, update, [[]])),
?assertMatch({ok, _}, erpc:call(NodeB1, emqx_cluster_link_config, update, [[]])),
?assertMatch({ok, _}, update(NodeA1, [], Config)),
?assertMatch({ok, _}, update(NodeB1, [], Config)),
validate_update_cli_failed(NodeA1, Config),
ok = emqtt:stop(ClientA),
ok = emqtt:stop(ClientB).
@ -645,3 +666,48 @@ fmt(Fmt, Args) ->
mk_nodename(BaseName, Idx) ->
binary_to_atom(fmt("emqx_clink_~s_~b", [BaseName, Idx])).
validate_update_cli_failed(Node, Config) ->
case ?config(update_from, Config) of
api ->
ok;
cli ->
ConfBin = hocon_pp:do(
#{
<<"cluster">> => #{
<<"links">> => [],
<<"autoclean">> => <<"12h">>
}
},
#{}
),
ConfFile = prepare_conf_file(?FUNCTION_NAME, ConfBin, Config),
?assertMatch(
{error, <<"Cannot update read-only key 'cluster.autoheal'.">>},
erpc:call(Node, emqx_cluster_cli, conf, [["load", ConfFile]])
)
end.
update(Node, Links, Config) ->
case ?config(update_from, Config) of
api -> update_links_from_api(Node, Links, Config);
cli -> update_links_from_cli(Node, Links, Config)
end.
update_links_from_api(Node, Links, _Config) ->
erpc:call(Node, emqx_cluster_link_config, update, [Links]).
update_links_from_cli(Node, Links, Config) ->
ConfBin = hocon_pp:do(#{<<"cluster">> => #{<<"links">> => Links}}, #{}),
ConfFile = prepare_conf_file(?FUNCTION_NAME, ConfBin, Config),
erpc:call(Node, emqx_cluster_cli, conf, [["load", ConfFile]]).
prepare_conf_file(Name, Content, CTConfig) ->
Filename = tc_conf_file(Name, CTConfig),
filelib:ensure_dir(Filename),
ok = file:write_file(Filename, Content),
Filename.
tc_conf_file(TC, Config) ->
DataDir = ?config(data_dir, Config),
filename:join([DataDir, TC, 'emqx.conf']).

View File

@ -564,7 +564,9 @@ check_cluster_keys(Conf = #{<<"cluster">> := Cluster}, Opts) ->
BadKeys = ["cluster." ++ K || K <- Keys],
BadKeysStr = lists:join(<<",">>, BadKeys),
{error, ?UPDATE_READONLY_KEYS_PROHIBITED, BadKeysStr}
end.
end;
check_cluster_keys(Conf, _Opts) ->
{ok, Conf}.
check_config_schema(Conf) ->
SchemaMod = emqx_conf:schema_module(),