summaryrefslogtreecommitdiffstats
path: root/nixos/tests/mysql/mysql-replication.nix
blob: 2cc541093a5b8af04b8e9b6ea4a018f08cb3ec43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
{
  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";

  makeTest = import ./../make-test-python.nix;

  makeReplicationTest =
    {
      package,
      name ? mkTestName package,
    }:
    makeTest {
      name = "${name}-replication";
      meta.maintainers = with lib.maintainers; [
        conni2461
        das_j
        helsinki-Jo
      ];

      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 ];
        };

        secondary1 =
          { nodes, ... }:
          {
            services.mysql = {
              inherit package;
              enable = true;
              replication.role = "slave";
              replication.serverId = 2;
              replication.masterHost = nodes.primary.networking.hostName;
              replication.masterUser = replicateUser;
              replication.masterPassword = replicatePassword;
            };
          };

        secondary2 =
          { nodes, ... }:
          {
            services.mysql = {
              inherit package;
              enable = true;
              replication.role = "slave";
              replication.serverId = 3;
              replication.masterHost = nodes.primary.networking.hostName;
              replication.masterUser = replicateUser;
              replication.masterPassword = replicatePassword;
            };
          };
      };

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

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

        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