python310Packages.pydeconz: 104 -> 105
[NixPkgs.git] / nixos / tests / mysql / mariadb-galera.nix
blobc9962f49c02fda9b7a5d52280e57ef7038a5b287
2   system ? builtins.currentSystem,
3   config ? {},
4   pkgs ? import ../../.. { inherit system config; },
5   lib ? pkgs.lib
6 }:
8 let
9   inherit (import ./common.nix { inherit pkgs lib; }) mkTestName mariadbPackages;
11   makeTest = import ./../make-test-python.nix;
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     };
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         };
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       };
113       galera_02 = mkGaleraNode {
114         id = 2;
115         method = "mariabackup";
116       };
118       galera_03 = mkGaleraNode {
119         id = 3;
120         method = "mariabackup";
121       };
123       galera_04 = mkGaleraNode {
124         id = 4;
125         method = "rsync";
126       };
128       galera_05 = mkGaleraNode {
129         id = 5;
130         method = "rsync";
131       };
133       galera_06 = mkGaleraNode {
134         id = 6;
135         method = "rsync";
136       };
138     };
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()
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   };
250   lib.mapAttrs (_: mariadbPackage: makeGaleraTest { inherit mariadbPackage; }) mariadbPackages