vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / mysql / mysql-replication.nix
blob83da1e7b6cb88e68b838fd9d3fc3f16f457e575a
2   system ? builtins.currentSystem,
3   config ? {},
4   pkgs ? import ../../.. { inherit system config; },
5   lib ? pkgs.lib
6 }:
8 let
9   inherit (import ./common.nix { inherit pkgs lib; }) mkTestName mariadbPackages;
11   replicateUser = "replicate";
12   replicatePassword = "secret";
14   makeTest = import ./../make-test-python.nix;
16   makeReplicationTest = {
17     package,
18     name ? mkTestName package,
19   }: makeTest {
20     name = "${name}-replication";
21     meta = {
22       maintainers = lib.teams.helsinki-systems.members;
23     };
25     nodes = {
26       primary = {
27         services.mysql = {
28           inherit package;
29           enable = true;
30           replication.role = "master";
31           replication.slaveHost = "%";
32           replication.masterUser = replicateUser;
33           replication.masterPassword = replicatePassword;
34           initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
35         };
36         networking.firewall.allowedTCPPorts = [ 3306 ];
37       };
39       secondary1 = { nodes, ... }: {
40         services.mysql = {
41           inherit package;
42           enable = true;
43           replication.role = "slave";
44           replication.serverId = 2;
45           replication.masterHost = nodes.primary.networking.hostName;
46           replication.masterUser = replicateUser;
47           replication.masterPassword = replicatePassword;
48         };
49       };
51       secondary2 = { nodes, ... }: {
52         services.mysql = {
53           inherit package;
54           enable = true;
55           replication.role = "slave";
56           replication.serverId = 3;
57           replication.masterHost = nodes.primary.networking.hostName;
58           replication.masterUser = replicateUser;
59           replication.masterPassword = replicatePassword;
60         };
61       };
62     };
64     testScript = ''
65       primary.start()
66       primary.wait_for_unit("mysql")
67       primary.wait_for_open_port(3306)
68       # Wait for testdb to be fully populated (5 rows).
69       primary.wait_until_succeeds(
70           "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"
71       )
73       secondary1.start()
74       secondary2.start()
75       secondary1.wait_for_unit("mysql")
76       secondary1.wait_for_open_port(3306)
77       secondary2.wait_for_unit("mysql")
78       secondary2.wait_for_open_port(3306)
80       # wait for replications to finish
81       secondary1.wait_until_succeeds(
82           "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"
83       )
84       secondary2.wait_until_succeeds(
85           "sudo -u mysql mysql -u mysql -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"
86       )
88       secondary2.succeed("systemctl stop mysql")
89       primary.succeed(
90           "echo 'insert into testdb.tests values (123, 456);' | sudo -u mysql mysql -u mysql -N"
91       )
92       secondary2.succeed("systemctl start mysql")
93       secondary2.wait_for_unit("mysql")
94       secondary2.wait_for_open_port(3306)
95       secondary2.wait_until_succeeds(
96           "echo 'select * from testdb.tests where Id = 123;' | sudo -u mysql mysql -u mysql -N | grep 456"
97       )
98     '';
99   };
101   lib.mapAttrs (_: package: makeReplicationTest { inherit package; }) mariadbPackages