at 22.05-pre 2.9 kB view raw
1import ./../make-test-python.nix ({ pkgs, ...} : 2 3let 4 replicateUser = "replicate"; 5 replicatePassword = "secret"; 6in 7 8{ 9 name = "mysql-replication"; 10 meta = with pkgs.lib.maintainers; { 11 maintainers = [ eelco shlevy ]; 12 }; 13 14 nodes = { 15 master = 16 { pkgs, ... }: 17 18 { 19 services.mysql.enable = true; 20 services.mysql.package = pkgs.mariadb; 21 services.mysql.replication.role = "master"; 22 services.mysql.replication.slaveHost = "%"; 23 services.mysql.replication.masterUser = replicateUser; 24 services.mysql.replication.masterPassword = replicatePassword; 25 services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ]; 26 networking.firewall.allowedTCPPorts = [ 3306 ]; 27 }; 28 29 slave1 = 30 { pkgs, nodes, ... }: 31 32 { 33 services.mysql.enable = true; 34 services.mysql.package = pkgs.mariadb; 35 services.mysql.replication.role = "slave"; 36 services.mysql.replication.serverId = 2; 37 services.mysql.replication.masterHost = nodes.master.config.networking.hostName; 38 services.mysql.replication.masterUser = replicateUser; 39 services.mysql.replication.masterPassword = replicatePassword; 40 }; 41 42 slave2 = 43 { pkgs, nodes, ... }: 44 45 { 46 services.mysql.enable = true; 47 services.mysql.package = pkgs.mariadb; 48 services.mysql.replication.role = "slave"; 49 services.mysql.replication.serverId = 3; 50 services.mysql.replication.masterHost = nodes.master.config.networking.hostName; 51 services.mysql.replication.masterUser = replicateUser; 52 services.mysql.replication.masterPassword = replicatePassword; 53 }; 54 }; 55 56 testScript = '' 57 master.start() 58 master.wait_for_unit("mysql") 59 master.wait_for_open_port(3306) 60 # Wait for testdb to be fully populated (5 rows). 61 master.wait_until_succeeds( 62 "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" 63 ) 64 65 slave1.start() 66 slave2.start() 67 slave1.wait_for_unit("mysql") 68 slave1.wait_for_open_port(3306) 69 slave2.wait_for_unit("mysql") 70 slave2.wait_for_open_port(3306) 71 72 # wait for replications to finish 73 slave1.wait_until_succeeds( 74 "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" 75 ) 76 slave2.wait_until_succeeds( 77 "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" 78 ) 79 80 slave2.succeed("systemctl stop mysql") 81 master.succeed( 82 "echo 'insert into testdb.tests values (123, 456);' | sudo -u mysql mysql -u mysql -N" 83 ) 84 slave2.succeed("systemctl start mysql") 85 slave2.wait_for_unit("mysql") 86 slave2.wait_for_open_port(3306) 87 slave2.wait_until_succeeds( 88 "echo 'select * from testdb.tests where Id = 123;' | sudo -u mysql mysql -u mysql -N | grep 456" 89 ) 90 ''; 91})