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.initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
23 services.mysql.initialScript = pkgs.writeText "initmysql"
24 ''
25 create user '${replicateUser}'@'%' identified by '${replicatePassword}';
26 grant replication slave on *.* to '${replicateUser}'@'%';
27 '';
28 networking.firewall.allowedTCPPorts = [ 3306 ];
29 };
30
31 slave1 =
32 { pkgs, config, nodes, ... }:
33
34 {
35 services.mysql.enable = true;
36 services.mysql.package = pkgs.mysql;
37 services.mysql.replication.role = "slave";
38 services.mysql.replication.serverId = 2;
39 services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
40 services.mysql.replication.masterUser = replicateUser;
41 services.mysql.replication.masterPassword = replicatePassword;
42 };
43
44 slave2 =
45 { pkgs, config, nodes, ... }:
46
47 {
48 services.mysql.enable = true;
49 services.mysql.package = pkgs.mysql;
50 services.mysql.replication.role = "slave";
51 services.mysql.replication.serverId = 3;
52 services.mysql.replication.masterHost = nodes.master.config.networking.hostName;
53 services.mysql.replication.masterUser = replicateUser;
54 services.mysql.replication.masterPassword = replicatePassword;
55 };
56 };
57
58 testScript = ''
59 startAll;
60
61 $master->waitForUnit("mysql");
62 $master->waitForUnit("mysql");
63 $slave2->waitForUnit("mysql");
64 $slave2->sleep(100); # Hopefully this is long enough!!
65 $slave2->succeed("echo 'use testdb; select * from tests' | mysql -u root -N | grep 4");
66 '';
67})