vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / mysql / mariadb-galera.nix
blob65705afbf82cd9691ee6945b0ff0c617c0db03bd
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     {
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       };
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               };
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                 firewall.allowedTCPPorts = [
62                   3306
63                   4444
64                   4567
65                   4568
66                 ];
67                 firewall.allowedUDPPorts = [ 4567 ];
68               };
69               systemd.services.mysql = with pkgs; {
70                 path = with pkgs; [
71                   bash
72                   gawk
73                   gnutar
74                   gzip
75                   inetutils
76                   iproute2
77                   netcat
78                   procps
79                   pv
80                   rsync
81                   socat
82                   stunnel
83                   which
84                 ];
85               };
86               services.mysql = {
87                 enable = true;
88                 package = mariadbPackage;
89                 ensureDatabases = lib.mkIf isFirstClusterNode [ "testdb" ];
90                 ensureUsers = lib.mkIf isFirstClusterNode [
91                   {
92                     name = "testuser";
93                     ensurePermissions = {
94                       "testdb.*" = "ALL PRIVILEGES";
95                     };
96                   }
97                 ];
98                 initialScript = lib.mkIf isFirstClusterNode (
99                   pkgs.writeText "mariadb-init.sql" ''
100                     GRANT ALL PRIVILEGES ON *.* TO 'check_repl'@'localhost' IDENTIFIED BY 'check_pass' WITH GRANT OPTION;
101                     FLUSH PRIVILEGES;
102                   ''
103                 );
104                 settings = {
105                   mysqld = {
106                     bind_address = "0.0.0.0";
107                   };
108                   galera = {
109                     wsrep_on = "ON";
110                     wsrep_debug = "NONE";
111                     wsrep_retry_autocommit = "3";
112                     wsrep_provider = "${galeraPackage}/lib/galera/libgalera_smm.so";
113                     wsrep_cluster_address =
114                       "gcomm://"
115                       + lib.optionalString (id == 2 || id == 3) "galera_01,galera_02,galera_03"
116                       + lib.optionalString (id == 5 || id == 6) "galera_04,galera_05,galera_06";
117                     wsrep_cluster_name = "galera";
118                     wsrep_node_address = address;
119                     wsrep_node_name = "galera_0${toString id}";
120                     wsrep_sst_method = method;
121                     wsrep_sst_auth = "check_repl:check_pass";
122                     binlog_format = "ROW";
123                     enforce_storage_engine = "InnoDB";
124                     innodb_autoinc_lock_mode = "2";
125                   };
126                 };
127               };
128             };
129         in
130         {
131           galera_01 = mkGaleraNode {
132             id = 1;
133             method = "mariabackup";
134           };
136           galera_02 = mkGaleraNode {
137             id = 2;
138             method = "mariabackup";
139           };
141           galera_03 = mkGaleraNode {
142             id = 3;
143             method = "mariabackup";
144           };
146           galera_04 = mkGaleraNode {
147             id = 4;
148             method = "rsync";
149           };
151           galera_05 = mkGaleraNode {
152             id = 5;
153             method = "rsync";
154           };
156           galera_06 = mkGaleraNode {
157             id = 6;
158             method = "rsync";
159           };
161         };
163       testScript = ''
164         galera_01.start()
165         galera_01.wait_for_unit("mysql")
166         galera_01.wait_for_open_port(3306)
167         galera_01.succeed(
168             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
169         )
170         galera_01.succeed(
171             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (37);'"
172         )
173         galera_02.start()
174         galera_02.wait_for_unit("mysql")
175         galera_02.wait_for_open_port(3306)
176         galera_03.start()
177         galera_03.wait_for_unit("mysql")
178         galera_03.wait_for_open_port(3306)
179         galera_02.succeed(
180             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
181         )
182         galera_02.succeed(
183             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
184         )
185         galera_02.succeed("systemctl stop mysql")
186         galera_01.succeed(
187             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (38);'"
188         )
189         galera_03.succeed(
190             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
191         )
192         galera_01.succeed(
193             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (39);'"
194         )
195         galera_02.succeed("systemctl start mysql")
196         galera_02.wait_for_open_port(3306)
197         galera_02.succeed(
198             "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
199         )
200         galera_03.succeed(
201             "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
202         )
203         galera_01.succeed(
204             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 39"
205         )
206         galera_02.succeed(
207             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 38"
208         )
209         galera_03.succeed(
210             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
211         )
212         galera_01.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
213         galera_02.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
214         galera_03.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
215         galera_01.crash()
216         galera_02.crash()
217         galera_03.crash()
219         galera_04.start()
220         galera_04.wait_for_unit("mysql")
221         galera_04.wait_for_open_port(3306)
222         galera_04.succeed(
223             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
224         )
225         galera_04.succeed(
226             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (41);'"
227         )
228         galera_05.start()
229         galera_05.wait_for_unit("mysql")
230         galera_05.wait_for_open_port(3306)
231         galera_06.start()
232         galera_06.wait_for_unit("mysql")
233         galera_06.wait_for_open_port(3306)
234         galera_05.succeed(
235             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
236         )
237         galera_05.succeed(
238             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
239         )
240         galera_05.succeed("systemctl stop mysql")
241         galera_04.succeed(
242             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (42);'"
243         )
244         galera_06.succeed(
245             "sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
246         )
247         galera_04.succeed(
248             "sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (43);'"
249         )
250         galera_05.succeed("systemctl start mysql")
251         galera_05.wait_for_open_port(3306)
252         galera_05.succeed(
253             "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
254         )
255         galera_06.succeed(
256             "sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
257         )
258         galera_04.succeed(
259             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 43"
260         )
261         galera_05.succeed(
262             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 42"
263         )
264         galera_06.succeed(
265             "sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
266         )
267         galera_04.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
268         galera_05.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
269         galera_06.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
270       '';
271     };
273 lib.mapAttrs (_: mariadbPackage: makeGaleraTest { inherit mariadbPackage; }) mariadbPackages