parent
65dfe147b7
commit
a2ec554e83
@ -1,91 +1,101 @@ |
||||
import ./../make-test-python.nix ({ pkgs, ...} : |
||||
{ |
||||
system ? builtins.currentSystem, |
||||
config ? {}, |
||||
pkgs ? import ../../.. { inherit system config; }, |
||||
lib ? pkgs.lib |
||||
}: |
||||
|
||||
let |
||||
inherit (import ./common.nix { inherit pkgs lib; }) mkTestName mariadbPackages; |
||||
|
||||
replicateUser = "replicate"; |
||||
replicatePassword = "secret"; |
||||
in |
||||
|
||||
{ |
||||
name = "mysql-replication"; |
||||
meta = with pkgs.lib.maintainers; { |
||||
maintainers = [ eelco shlevy ]; |
||||
}; |
||||
makeTest = import ./../make-test-python.nix; |
||||
|
||||
nodes = { |
||||
master = |
||||
{ pkgs, ... }: |
||||
makeReplicationTest = { |
||||
package, |
||||
name ? mkTestName package, |
||||
}: makeTest { |
||||
name = "${name}-replication"; |
||||
meta = with pkgs.lib.maintainers; { |
||||
maintainers = [ ajs124 das_j ]; |
||||
}; |
||||
|
||||
{ |
||||
services.mysql.enable = true; |
||||
services.mysql.package = pkgs.mariadb; |
||||
services.mysql.replication.role = "master"; |
||||
services.mysql.replication.slaveHost = "%"; |
||||
services.mysql.replication.masterUser = replicateUser; |
||||
services.mysql.replication.masterPassword = replicatePassword; |
||||
services.mysql.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ]; |
||||
nodes = { |
||||
primary = { |
||||
services.mysql = { |
||||
inherit package; |
||||
enable = true; |
||||
replication.role = "master"; |
||||
replication.slaveHost = "%"; |
||||
replication.masterUser = replicateUser; |
||||
replication.masterPassword = replicatePassword; |
||||
initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ]; |
||||
}; |
||||
networking.firewall.allowedTCPPorts = [ 3306 ]; |
||||
}; |
||||
|
||||
slave1 = |
||||
{ pkgs, nodes, ... }: |
||||
|
||||
{ |
||||
services.mysql.enable = true; |
||||
services.mysql.package = pkgs.mariadb; |
||||
services.mysql.replication.role = "slave"; |
||||
services.mysql.replication.serverId = 2; |
||||
services.mysql.replication.masterHost = nodes.master.config.networking.hostName; |
||||
services.mysql.replication.masterUser = replicateUser; |
||||
services.mysql.replication.masterPassword = replicatePassword; |
||||
secondary1 = { nodes, ... }: { |
||||
services.mysql = { |
||||
inherit package; |
||||
enable = true; |
||||
replication.role = "slave"; |
||||
replication.serverId = 2; |
||||
replication.masterHost = nodes.primary.config.networking.hostName; |
||||
replication.masterUser = replicateUser; |
||||
replication.masterPassword = replicatePassword; |
||||
}; |
||||
}; |
||||
|
||||
slave2 = |
||||
{ pkgs, nodes, ... }: |
||||
|
||||
{ |
||||
services.mysql.enable = true; |
||||
services.mysql.package = pkgs.mariadb; |
||||
services.mysql.replication.role = "slave"; |
||||
services.mysql.replication.serverId = 3; |
||||
services.mysql.replication.masterHost = nodes.master.config.networking.hostName; |
||||
services.mysql.replication.masterUser = replicateUser; |
||||
services.mysql.replication.masterPassword = replicatePassword; |
||||
secondary2 = { nodes, ... }: { |
||||
services.mysql = { |
||||
inherit package; |
||||
enable = true; |
||||
replication.role = "slave"; |
||||
replication.serverId = 3; |
||||
replication.masterHost = nodes.primary.config.networking.hostName; |
||||
replication.masterUser = replicateUser; |
||||
replication.masterPassword = replicatePassword; |
||||
}; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
testScript = '' |
||||
master.start() |
||||
master.wait_for_unit("mysql") |
||||
master.wait_for_open_port(3306) |
||||
# Wait for testdb to be fully populated (5 rows). |
||||
master.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
testScript = '' |
||||
primary.start() |
||||
primary.wait_for_unit("mysql") |
||||
primary.wait_for_open_port(3306) |
||||
# Wait for testdb to be fully populated (5 rows). |
||||
primary.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
|
||||
slave1.start() |
||||
slave2.start() |
||||
slave1.wait_for_unit("mysql") |
||||
slave1.wait_for_open_port(3306) |
||||
slave2.wait_for_unit("mysql") |
||||
slave2.wait_for_open_port(3306) |
||||
secondary1.start() |
||||
secondary2.start() |
||||
secondary1.wait_for_unit("mysql") |
||||
secondary1.wait_for_open_port(3306) |
||||
secondary2.wait_for_unit("mysql") |
||||
secondary2.wait_for_open_port(3306) |
||||
|
||||
# wait for replications to finish |
||||
slave1.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
slave2.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
# wait for replications to finish |
||||
secondary1.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
secondary2.wait_until_succeeds( |
||||
"sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5" |
||||
) |
||||
|
||||
slave2.succeed("systemctl stop mysql") |
||||
master.succeed( |
||||
"echo 'insert into testdb.tests values (123, 456);' | sudo -u mysql mysql -u mysql -N" |
||||
) |
||||
slave2.succeed("systemctl start mysql") |
||||
slave2.wait_for_unit("mysql") |
||||
slave2.wait_for_open_port(3306) |
||||
slave2.wait_until_succeeds( |
||||
"echo 'select * from testdb.tests where Id = 123;' | sudo -u mysql mysql -u mysql -N | grep 456" |
||||
) |
||||
''; |
||||
}) |
||||
secondary2.succeed("systemctl stop mysql") |
||||
primary.succeed( |
||||
"echo 'insert into testdb.tests values (123, 456);' | sudo -u mysql mysql -u mysql -N" |
||||
) |
||||
secondary2.succeed("systemctl start mysql") |
||||
secondary2.wait_for_unit("mysql") |
||||
secondary2.wait_for_open_port(3306) |
||||
secondary2.wait_until_succeeds( |
||||
"echo 'select * from testdb.tests where Id = 123;' | sudo -u mysql mysql -u mysql -N | grep 456" |
||||
) |
||||
''; |
||||
}; |
||||
in |
||||
lib.mapAttrs (_: package: makeReplicationTest { inherit package; }) mariadbPackages |
||||
|
Loading…
Reference in new issue