Merge pull request #13300 from SergeTupchiy/EMQX-12195-cluster-link-conf-backup
cluster link conf backup
This commit is contained in:
commit
fb266fbf8c
|
@ -519,7 +519,7 @@ cancel_heartbeat(St = #st{heartbeat_timer = TRef}) ->
|
||||||
%% Responsible for transferring local routing table snapshot to the target
|
%% Responsible for transferring local routing table snapshot to the target
|
||||||
%% cluster. Does so either during the initial startup or when MQTT connection
|
%% cluster. Does so either during the initial startup or when MQTT connection
|
||||||
%% is re-established with a clean session. Once bootstrapping is done, it
|
%% is re-established with a clean session. Once bootstrapping is done, it
|
||||||
%% opens the syncer.
|
%% activates the syncer.
|
||||||
|
|
||||||
run_bootstrap(St = #st{target = TargetCluster, actor = ?PS_ACTOR, link_conf = #{topics := Topics}}) ->
|
run_bootstrap(St = #st{target = TargetCluster, actor = ?PS_ACTOR, link_conf = #{topics := Topics}}) ->
|
||||||
case mria_config:whoami() of
|
case mria_config:whoami() of
|
||||||
|
|
|
@ -55,26 +55,27 @@
|
||||||
-define(META_FILENAME, "META.hocon").
|
-define(META_FILENAME, "META.hocon").
|
||||||
-define(CLUSTER_HOCON_FILENAME, "cluster.hocon").
|
-define(CLUSTER_HOCON_FILENAME, "cluster.hocon").
|
||||||
-define(CONF_KEYS, [
|
-define(CONF_KEYS, [
|
||||||
<<"delayed">>,
|
[<<"delayed">>],
|
||||||
<<"rewrite">>,
|
[<<"rewrite">>],
|
||||||
<<"retainer">>,
|
[<<"retainer">>],
|
||||||
<<"mqtt">>,
|
[<<"mqtt">>],
|
||||||
<<"alarm">>,
|
[<<"alarm">>],
|
||||||
<<"sysmon">>,
|
[<<"sysmon">>],
|
||||||
<<"sys_topics">>,
|
[<<"sys_topics">>],
|
||||||
<<"limiter">>,
|
[<<"limiter">>],
|
||||||
<<"log">>,
|
[<<"log">>],
|
||||||
<<"persistent_session_store">>,
|
[<<"persistent_session_store">>],
|
||||||
<<"durable_sessions">>,
|
[<<"durable_sessions">>],
|
||||||
<<"prometheus">>,
|
[<<"prometheus">>],
|
||||||
<<"crl_cache">>,
|
[<<"crl_cache">>],
|
||||||
<<"conn_congestion">>,
|
[<<"conn_congestion">>],
|
||||||
<<"force_shutdown">>,
|
[<<"force_shutdown">>],
|
||||||
<<"flapping_detect">>,
|
[<<"flapping_detect">>],
|
||||||
<<"broker">>,
|
[<<"broker">>],
|
||||||
<<"force_gc">>,
|
[<<"force_gc">>],
|
||||||
<<"zones">>,
|
[<<"zones">>],
|
||||||
<<"slow_subs">>
|
[<<"slow_subs">>],
|
||||||
|
[<<"cluster">>, <<"links">>]
|
||||||
]).
|
]).
|
||||||
|
|
||||||
%% emqx_bridge_v2 depends on emqx_connector, so connectors need to be imported first
|
%% emqx_bridge_v2 depends on emqx_connector, so connectors need to be imported first
|
||||||
|
@ -854,10 +855,10 @@ order(Elem, [_ | T], Order) ->
|
||||||
|
|
||||||
import_generic_conf(Data) ->
|
import_generic_conf(Data) ->
|
||||||
lists:map(
|
lists:map(
|
||||||
fun(Key) ->
|
fun(KeyPath) ->
|
||||||
case maps:get(Key, Data, undefined) of
|
case emqx_utils_maps:deep_get(KeyPath, Data, undefined) of
|
||||||
undefined -> {[Key], ok};
|
undefined -> {[KeyPath], ok};
|
||||||
Conf -> {[Key], emqx_conf:update([Key], Conf, #{override_to => cluster})}
|
Conf -> {[KeyPath], emqx_conf:update(KeyPath, Conf, #{override_to => cluster})}
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
?CONF_KEYS
|
?CONF_KEYS
|
||||||
|
|
|
@ -28,6 +28,29 @@
|
||||||
-define(ROLE_API_SUPERUSER, <<"administrator">>).
|
-define(ROLE_API_SUPERUSER, <<"administrator">>).
|
||||||
-define(BOOTSTRAP_BACKUP, "emqx-export-test-bootstrap-ce.tar.gz").
|
-define(BOOTSTRAP_BACKUP, "emqx-export-test-bootstrap-ce.tar.gz").
|
||||||
|
|
||||||
|
-define(CACERT, <<
|
||||||
|
"-----BEGIN CERTIFICATE-----\n"
|
||||||
|
"MIIDUTCCAjmgAwIBAgIJAPPYCjTmxdt/MA0GCSqGSIb3DQEBCwUAMD8xCzAJBgNV\n"
|
||||||
|
"BAYTAkNOMREwDwYDVQQIDAhoYW5nemhvdTEMMAoGA1UECgwDRU1RMQ8wDQYDVQQD\n"
|
||||||
|
"DAZSb290Q0EwHhcNMjAwNTA4MDgwNjUyWhcNMzAwNTA2MDgwNjUyWjA/MQswCQYD\n"
|
||||||
|
"VQQGEwJDTjERMA8GA1UECAwIaGFuZ3pob3UxDDAKBgNVBAoMA0VNUTEPMA0GA1UE\n"
|
||||||
|
"AwwGUm9vdENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzcgVLex1\n"
|
||||||
|
"EZ9ON64EX8v+wcSjzOZpiEOsAOuSXOEN3wb8FKUxCdsGrsJYB7a5VM/Jot25Mod2\n"
|
||||||
|
"juS3OBMg6r85k2TWjdxUoUs+HiUB/pP/ARaaW6VntpAEokpij/przWMPgJnBF3Ur\n"
|
||||||
|
"MjtbLayH9hGmpQrI5c2vmHQ2reRZnSFbY+2b8SXZ+3lZZgz9+BaQYWdQWfaUWEHZ\n"
|
||||||
|
"uDaNiViVO0OT8DRjCuiDp3yYDj3iLWbTA/gDL6Tf5XuHuEwcOQUrd+h0hyIphO8D\n"
|
||||||
|
"tsrsHZ14j4AWYLk1CPA6pq1HIUvEl2rANx2lVUNv+nt64K/Mr3RnVQd9s8bK+TXQ\n"
|
||||||
|
"KGHd2Lv/PALYuwIDAQABo1AwTjAdBgNVHQ4EFgQUGBmW+iDzxctWAWxmhgdlE8Pj\n"
|
||||||
|
"EbQwHwYDVR0jBBgwFoAUGBmW+iDzxctWAWxmhgdlE8PjEbQwDAYDVR0TBAUwAwEB\n"
|
||||||
|
"/zANBgkqhkiG9w0BAQsFAAOCAQEAGbhRUjpIred4cFAFJ7bbYD9hKu/yzWPWkMRa\n"
|
||||||
|
"ErlCKHmuYsYk+5d16JQhJaFy6MGXfLgo3KV2itl0d+OWNH0U9ULXcglTxy6+njo5\n"
|
||||||
|
"CFqdUBPwN1jxhzo9yteDMKF4+AHIxbvCAJa17qcwUKR5MKNvv09C6pvQDJLzid7y\n"
|
||||||
|
"E2dkgSuggik3oa0427KvctFf8uhOV94RvEDyqvT5+pgNYZ2Yfga9pD/jjpoHEUlo\n"
|
||||||
|
"88IGU8/wJCx3Ds2yc8+oBg/ynxG8f/HmCC1ET6EHHoe2jlo8FpU/SgGtghS1YL30\n"
|
||||||
|
"IWxNsPrUP+XsZpBJy/mvOhE5QXo6Y35zDqqj8tI7AGmAWu22jg==\n"
|
||||||
|
"-----END CERTIFICATE-----"
|
||||||
|
>>).
|
||||||
|
|
||||||
all() ->
|
all() ->
|
||||||
emqx_common_test_helpers:all(?MODULE).
|
emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
|
@ -360,6 +383,36 @@ t_bad_config(Config) ->
|
||||||
Res = emqx_mgmt_data_backup:import(BadConfigFileName),
|
Res = emqx_mgmt_data_backup:import(BadConfigFileName),
|
||||||
?assertMatch({error, #{kind := validation_error}}, Res).
|
?assertMatch({error, #{kind := validation_error}}, Res).
|
||||||
|
|
||||||
|
t_cluster_links(_Config) ->
|
||||||
|
case emqx_release:edition() of
|
||||||
|
ce ->
|
||||||
|
%% Only available in EMQX Enterprise
|
||||||
|
ok;
|
||||||
|
ee ->
|
||||||
|
Link = #{
|
||||||
|
<<"name">> => <<"emqxcl_backup_test">>,
|
||||||
|
<<"server">> => <<"emqx.emqxcl_backup_test.host:41883">>,
|
||||||
|
<<"topics">> => [<<"#">>],
|
||||||
|
<<"ssl">> => #{<<"enable">> => true, <<"cacertfile">> => ?CACERT}
|
||||||
|
},
|
||||||
|
{ok, [RawLink]} = emqx_cluster_link_config:update([Link]),
|
||||||
|
{ok, #{filename := FileName}} = emqx_mgmt_data_backup:export(),
|
||||||
|
{ok, []} = emqx_cluster_link_config:update([]),
|
||||||
|
#{<<"ssl">> := #{<<"cacertfile">> := CertPath}} = RawLink,
|
||||||
|
_ = file:delete(CertPath),
|
||||||
|
?assertEqual(
|
||||||
|
{ok, #{db_errors => #{}, config_errors => #{}}},
|
||||||
|
emqx_mgmt_data_backup:import(FileName)
|
||||||
|
),
|
||||||
|
[
|
||||||
|
#{
|
||||||
|
<<"name">> := <<"emqxcl_backup_test">>,
|
||||||
|
<<"ssl">> := #{<<"cacertfile">> := CertPath1}
|
||||||
|
}
|
||||||
|
] = emqx:get_raw_config([cluster, links]),
|
||||||
|
?assertEqual({ok, ?CACERT}, file:read_file(CertPath1))
|
||||||
|
end.
|
||||||
|
|
||||||
t_import_on_cluster(Config) ->
|
t_import_on_cluster(Config) ->
|
||||||
%% Randomly chosen config key to verify import result additionally
|
%% Randomly chosen config key to verify import result additionally
|
||||||
?assertEqual([], emqx:get_config([authentication])),
|
?assertEqual([], emqx:get_config([authentication])),
|
||||||
|
@ -483,7 +536,7 @@ t_read_files(_Config) ->
|
||||||
|
|
||||||
setup(TC, Config) ->
|
setup(TC, Config) ->
|
||||||
WorkDir = filename:join(emqx_cth_suite:work_dir(TC, Config), local),
|
WorkDir = filename:join(emqx_cth_suite:work_dir(TC, Config), local),
|
||||||
Started = emqx_cth_suite:start(apps_to_start(), #{work_dir => WorkDir}),
|
Started = emqx_cth_suite:start(apps_to_start(TC), #{work_dir => WorkDir}),
|
||||||
[{suite_apps, Started} | Config].
|
[{suite_apps, Started} | Config].
|
||||||
|
|
||||||
cleanup(Config) ->
|
cleanup(Config) ->
|
||||||
|
@ -530,6 +583,14 @@ create_test_tab(Attributes) ->
|
||||||
]),
|
]),
|
||||||
ok = mria:wait_for_tables([data_backup_test]).
|
ok = mria:wait_for_tables([data_backup_test]).
|
||||||
|
|
||||||
|
apps_to_start(t_cluster_links) ->
|
||||||
|
case emqx_release:edition() of
|
||||||
|
ee -> apps_to_start() ++ [emqx_cluster_link];
|
||||||
|
ce -> []
|
||||||
|
end;
|
||||||
|
apps_to_start(_TC) ->
|
||||||
|
apps_to_start().
|
||||||
|
|
||||||
apps_to_start() ->
|
apps_to_start() ->
|
||||||
[
|
[
|
||||||
{emqx, #{override_env => [{boot_modules, [broker]}]}},
|
{emqx, #{override_env => [{boot_modules, [broker]}]}},
|
||||||
|
|
Loading…
Reference in New Issue