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