at 23.11-pre 9.1 kB view raw
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