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, config, ... }:
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, config, 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, config, 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 $slave1->start;
60 $slave2->start;
61 $slave1->waitForUnit("mysql");
62 $slave2->waitForUnit("mysql");
63 $slave2->sleep(100); # Hopefully this is long enough!!
64 $slave2->succeed("echo 'use testdb; select * from tests' | mysql -u root -N | grep 4");
65 '';
66})