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})