at 25.11-pre 9.2 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 { 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