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