1{
2 system ? builtins.currentSystem,
3 config ? {},
4 pkgs ? import ../../.. { inherit system config; },
5 lib ? pkgs.lib
6}:
7
8let
9 inherit (import ./common.nix { inherit pkgs lib; }) mkTestName mariadbPackages;
10
11 makeTest = import ./../make-test-python.nix;
12
13 # Common user configuration
14 makeGaleraTest = {
15 mariadbPackage,
16 name ? mkTestName mariadbPackage,
17 galeraPackage ? pkgs.mariadb-galera
18 }: makeTest {
19 name = "${name}-galera-mariabackup";
20 meta = with pkgs.lib.maintainers; {
21 maintainers = [ izorkin ajs124 das_j ];
22 };
23
24 # The test creates a Galera cluster with 3 nodes and is checking if mariabackup-based SST works. The cluster is tested by creating a DB and an empty table on one node,
25 # and checking the table's presence on the other node.
26 nodes = let
27 mkGaleraNode = {
28 id,
29 method
30 }: let
31 address = "192.168.1.${toString id}";
32 isFirstClusterNode = id == 1 || id == 4;
33 in {
34 users = {
35 users.testuser = {
36 isSystemUser = true;
37 group = "testusers";
38 };
39 groups.testusers = { };
40 };
41
42 networking = {
43 interfaces.eth1 = {
44 ipv4.addresses = [
45 { inherit address; prefixLength = 24; }
46 ];
47 };
48 extraHosts = lib.concatMapStringsSep "\n" (i: "192.168.1.${toString i} galera_0${toString i}") (lib.range 1 6);
49 firewall.allowedTCPPorts = [ 3306 4444 4567 4568 ];
50 firewall.allowedUDPPorts = [ 4567 ];
51 };
52 systemd.services.mysql = with pkgs; {
53 path = with pkgs; [
54 bash
55 gawk
56 gnutar
57 gzip
58 inetutils
59 iproute2
60 netcat
61 procps
62 pv
63 rsync
64 socat
65 stunnel
66 which
67 ];
68 };
69 services.mysql = {
70 enable = true;
71 package = mariadbPackage;
72 ensureDatabases = lib.mkIf isFirstClusterNode [ "testdb" ];
73 ensureUsers = lib.mkIf isFirstClusterNode [{
74 name = "testuser";
75 ensurePermissions = {
76 "testdb.*" = "ALL PRIVILEGES";
77 };
78 }];
79 initialScript = lib.mkIf isFirstClusterNode (pkgs.writeText "mariadb-init.sql" ''
80 GRANT ALL PRIVILEGES ON *.* TO 'check_repl'@'localhost' IDENTIFIED BY 'check_pass' WITH GRANT OPTION;
81 FLUSH PRIVILEGES;
82 '');
83 settings = {
84 mysqld = {
85 bind_address = "0.0.0.0";
86 };
87 galera = {
88 wsrep_on = "ON";
89 wsrep_debug = "NONE";
90 wsrep_retry_autocommit = "3";
91 wsrep_provider = "${galeraPackage}/lib/galera/libgalera_smm.so";
92 wsrep_cluster_address = "gcomm://"
93 + lib.optionalString (id == 2 || id == 3) "galera_01,galera_02,galera_03"
94 + lib.optionalString (id == 5 || id == 6) "galera_04,galera_05,galera_06";
95 wsrep_cluster_name = "galera";
96 wsrep_node_address = address;
97 wsrep_node_name = "galera_0${toString id}";
98 wsrep_sst_method = method;
99 wsrep_sst_auth = "check_repl:check_pass";
100 binlog_format = "ROW";
101 enforce_storage_engine = "InnoDB";
102 innodb_autoinc_lock_mode = "2";
103 };
104 };
105 };
106 };
107 in {
108 galera_01 = mkGaleraNode {
109 id = 1;
110 method = "mariabackup";
111 };
112
113 galera_02 = mkGaleraNode {
114 id = 2;
115 method = "mariabackup";
116 };
117
118 galera_03 = mkGaleraNode {
119 id = 3;
120 method = "mariabackup";
121 };
122
123 galera_04 = mkGaleraNode {
124 id = 4;
125 method = "rsync";
126 };
127
128 galera_05 = mkGaleraNode {
129 id = 5;
130 method = "rsync";
131 };
132
133 galera_06 = mkGaleraNode {
134 id = 6;
135 method = "rsync";
136 };
137
138 };
139
140 testScript = ''
141 galera_01.start()
142 galera_01.wait_for_unit("mysql")
143 galera_01.wait_for_open_port(3306)
144 galera_01.succeed(
145 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
146 )
147 galera_01.succeed(
148 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (37);'"
149 )
150 galera_02.start()
151 galera_02.wait_for_unit("mysql")
152 galera_02.wait_for_open_port(3306)
153 galera_03.start()
154 galera_03.wait_for_unit("mysql")
155 galera_03.wait_for_open_port(3306)
156 galera_02.succeed(
157 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
158 )
159 galera_02.succeed(
160 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
161 )
162 galera_02.succeed("systemctl stop mysql")
163 galera_01.succeed(
164 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (38);'"
165 )
166 galera_03.succeed(
167 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
168 )
169 galera_01.succeed(
170 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (39);'"
171 )
172 galera_02.succeed("systemctl start mysql")
173 galera_02.wait_for_open_port(3306)
174 galera_02.succeed(
175 "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
176 )
177 galera_03.succeed(
178 "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
179 )
180 galera_01.succeed(
181 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 39"
182 )
183 galera_02.succeed(
184 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 38"
185 )
186 galera_03.succeed(
187 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
188 )
189 galera_01.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
190 galera_02.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
191 galera_03.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
192 galera_01.crash()
193 galera_02.crash()
194 galera_03.crash()
195
196 galera_04.start()
197 galera_04.wait_for_unit("mysql")
198 galera_04.wait_for_open_port(3306)
199 galera_04.succeed(
200 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
201 )
202 galera_04.succeed(
203 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (41);'"
204 )
205 galera_05.start()
206 galera_05.wait_for_unit("mysql")
207 galera_05.wait_for_open_port(3306)
208 galera_06.start()
209 galera_06.wait_for_unit("mysql")
210 galera_06.wait_for_open_port(3306)
211 galera_05.succeed(
212 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
213 )
214 galera_05.succeed(
215 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
216 )
217 galera_05.succeed("systemctl stop mysql")
218 galera_04.succeed(
219 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (42);'"
220 )
221 galera_06.succeed(
222 "sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
223 )
224 galera_04.succeed(
225 "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (43);'"
226 )
227 galera_05.succeed("systemctl start mysql")
228 galera_05.wait_for_open_port(3306)
229 galera_05.succeed(
230 "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
231 )
232 galera_06.succeed(
233 "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
234 )
235 galera_04.succeed(
236 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 43"
237 )
238 galera_05.succeed(
239 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 42"
240 )
241 galera_06.succeed(
242 "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
243 )
244 galera_04.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
245 galera_05.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
246 galera_06.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
247 '';
248 };
249in
250 lib.mapAttrs (_: mariadbPackage: makeGaleraTest { inherit mariadbPackage; }) mariadbPackages