at 18.09-beta 2.8 kB view raw
1import ./make-test.nix ({ pkgs, ...} : 2 3let 4 replicateUser = "replicate"; 5 replicatePassword = "secret"; 6in 7 8{ 9 name = "mysql-replication"; 10 meta = with pkgs.stdenv.lib.maintainers; { 11 maintainers = [ eelco chaoflow shlevy ]; 12 }; 13 14 nodes = { 15 master = 16 { pkgs, ... }: 17 18 { 19 services.mysql.enable = true; 20 services.mysql.package = pkgs.mysql; 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.mysql; 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.mysql; 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->waitForUnit("mysql"); 59 $master->waitForOpenPort(3306); 60 # Wait for testdb to be fully populated (5 rows). 61 $master->waitUntilSucceeds("mysql -u root -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"); 62 63 $slave1->start; 64 $slave2->start; 65 $slave1->waitForUnit("mysql"); 66 $slave1->waitForOpenPort(3306); 67 $slave2->waitForUnit("mysql"); 68 $slave2->waitForOpenPort(3306); 69 70 # wait for replications to finish 71 $slave1->waitUntilSucceeds("mysql -u root -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"); 72 $slave2->waitUntilSucceeds("mysql -u root -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"); 73 74 $slave2->succeed("systemctl stop mysql"); 75 $master->succeed("echo 'insert into testdb.tests values (123, 456);' | mysql -u root -N"); 76 $slave2->succeed("systemctl start mysql"); 77 $slave2->waitForUnit("mysql"); 78 $slave2->waitForOpenPort(3306); 79 $slave2->waitUntilSucceeds("echo 'select * from testdb.tests where Id = 123;' | mysql -u root -N | grep 456"); 80 ''; 81})