1{
2 system ? builtins.currentSystem,
3 config ? { },
4 pkgs ? import ../../.. { inherit system config; },
5 lib ? pkgs.lib,
6}:
7
8let
9 inherit (import ./common.nix { inherit pkgs lib; })
10 mkTestName
11 mariadbPackages
12 mysqlPackages
13 perconaPackages
14 ;
15
16 makeTest = import ./../make-test-python.nix;
17 # Setup common users
18 makeMySQLTest =
19 {
20 package,
21 name ? mkTestName package,
22 useSocketAuth ? true,
23 hasMroonga ? true,
24 hasRocksDB ? pkgs.stdenv.hostPlatform.is64bit,
25 }:
26 makeTest {
27 inherit name;
28 meta = {
29 maintainers = lib.teams.helsinki-systems.members;
30 };
31
32 nodes = {
33 ${name} =
34 { pkgs, ... }:
35 {
36
37 users = {
38 groups.testusers = { };
39
40 users.testuser = {
41 isSystemUser = true;
42 group = "testusers";
43 };
44
45 users.testuser2 = {
46 isSystemUser = true;
47 group = "testusers";
48 };
49 };
50
51 services.mysql = {
52 enable = true;
53 initialDatabases = [
54 {
55 name = "testdb3";
56 schema = ./testdb.sql;
57 }
58 ];
59 # note that using pkgs.writeText here is generally not a good idea,
60 # as it will store the password in world-readable /nix/store ;)
61 initialScript = pkgs.writeText "mysql-init.sql" (
62 if (!useSocketAuth) then
63 ''
64 CREATE USER 'testuser3'@'localhost' IDENTIFIED BY 'secure';
65 GRANT ALL PRIVILEGES ON testdb3.* TO 'testuser3'@'localhost';
66 ''
67 else
68 ''
69 ALTER USER root@localhost IDENTIFIED WITH unix_socket;
70 DELETE FROM mysql.user WHERE password = ''' AND plugin = ''';
71 DELETE FROM mysql.user WHERE user = ''';
72 FLUSH PRIVILEGES;
73 ''
74 );
75
76 ensureDatabases = [
77 "testdb"
78 "testdb2"
79 ];
80 ensureUsers = [
81 {
82 name = "testuser";
83 ensurePermissions = {
84 "testdb.*" = "ALL PRIVILEGES";
85 };
86 }
87 {
88 name = "testuser2";
89 ensurePermissions = {
90 "testdb2.*" = "ALL PRIVILEGES";
91 };
92 }
93 ];
94 package = package;
95 settings = {
96 mysqld = {
97 plugin-load-add =
98 lib.optional hasMroonga "ha_mroonga.so"
99 ++ lib.optional hasRocksDB "ha_rocksdb.so";
100 };
101 };
102 };
103 };
104 };
105
106 testScript = ''
107 start_all()
108
109 machine = ${name}
110 machine.wait_for_unit("mysql")
111 machine.succeed(
112 "echo 'use testdb; create table tests (test_id INT, PRIMARY KEY (test_id));' | sudo -u testuser mysql -u testuser"
113 )
114 machine.succeed(
115 "echo 'use testdb; insert into tests values (42);' | sudo -u testuser mysql -u testuser"
116 )
117 # Ensure testuser2 is not able to insert into testdb as mysql testuser2
118 machine.fail(
119 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser2"
120 )
121 # Ensure testuser2 is not able to authenticate as mysql testuser
122 machine.fail(
123 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser"
124 )
125 machine.succeed(
126 "echo 'use testdb; select test_id from tests;' | sudo -u testuser mysql -u testuser -N | grep 42"
127 )
128
129 ${lib.optionalString hasMroonga ''
130 # Check if Mroonga plugin works
131 machine.succeed(
132 "echo 'use testdb; create table mroongadb (test_id INT, PRIMARY KEY (test_id)) ENGINE = Mroonga;' | sudo -u testuser mysql -u testuser"
133 )
134 machine.succeed(
135 "echo 'use testdb; insert into mroongadb values (25);' | sudo -u testuser mysql -u testuser"
136 )
137 machine.succeed(
138 "echo 'use testdb; select test_id from mroongadb;' | sudo -u testuser mysql -u testuser -N | grep 25"
139 )
140 machine.succeed(
141 "echo 'use testdb; drop table mroongadb;' | sudo -u testuser mysql -u testuser"
142 )
143 ''}
144
145 ${lib.optionalString hasRocksDB ''
146 # Check if RocksDB plugin works
147 machine.succeed(
148 "echo 'use testdb; create table rocksdb (test_id INT, PRIMARY KEY (test_id)) ENGINE = RocksDB;' | sudo -u testuser mysql -u testuser"
149 )
150 machine.succeed(
151 "echo 'use testdb; insert into rocksdb values (28);' | sudo -u testuser mysql -u testuser"
152 )
153 machine.succeed(
154 "echo 'use testdb; select test_id from rocksdb;' | sudo -u testuser mysql -u testuser -N | grep 28"
155 )
156 machine.succeed(
157 "echo 'use testdb; drop table rocksdb;' | sudo -u testuser mysql -u testuser"
158 )
159 ''}
160 '';
161 };
162in
163lib.mapAttrs (
164 _: package:
165 makeMySQLTest {
166 inherit package;
167 hasRocksDB = false;
168 hasMroonga = false;
169 useSocketAuth = false;
170 }
171) mysqlPackages
172// (lib.mapAttrs (
173 _: package:
174 makeMySQLTest {
175 inherit package;
176 }
177) mariadbPackages)
178// (lib.mapAttrs (
179 _: package:
180 makeMySQLTest {
181 inherit package;
182 name = builtins.replaceStrings [ "-" ] [ "_" ] package.pname;
183 hasMroonga = false;
184 useSocketAuth = false;
185 }
186) perconaPackages)