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