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" ++ lib.optional hasRocksDB "ha_rocksdb.so"; 99 }; 100 }; 101 }; 102 }; 103 }; 104 105 testScript = '' 106 start_all() 107 108 machine = ${name} 109 machine.wait_for_unit("mysql") 110 machine.succeed( 111 "echo 'use testdb; create table tests (test_id INT, PRIMARY KEY (test_id));' | sudo -u testuser mysql -u testuser" 112 ) 113 machine.succeed( 114 "echo 'use testdb; insert into tests values (42);' | sudo -u testuser mysql -u testuser" 115 ) 116 # Ensure testuser2 is not able to insert into testdb as mysql testuser2 117 machine.fail( 118 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser2" 119 ) 120 # Ensure testuser2 is not able to authenticate as mysql testuser 121 machine.fail( 122 "echo 'use testdb; insert into tests values (23);' | sudo -u testuser2 mysql -u testuser" 123 ) 124 machine.succeed( 125 "echo 'use testdb; select test_id from tests;' | sudo -u testuser mysql -u testuser -N | grep 42" 126 ) 127 128 ${lib.optionalString hasMroonga '' 129 # Check if Mroonga plugin works 130 machine.succeed( 131 "echo 'use testdb; create table mroongadb (test_id INT, PRIMARY KEY (test_id)) ENGINE = Mroonga;' | sudo -u testuser mysql -u testuser" 132 ) 133 machine.succeed( 134 "echo 'use testdb; insert into mroongadb values (25);' | sudo -u testuser mysql -u testuser" 135 ) 136 machine.succeed( 137 "echo 'use testdb; select test_id from mroongadb;' | sudo -u testuser mysql -u testuser -N | grep 25" 138 ) 139 machine.succeed( 140 "echo 'use testdb; drop table mroongadb;' | sudo -u testuser mysql -u testuser" 141 ) 142 ''} 143 144 ${lib.optionalString hasRocksDB '' 145 # Check if RocksDB plugin works 146 machine.succeed( 147 "echo 'use testdb; create table rocksdb (test_id INT, PRIMARY KEY (test_id)) ENGINE = RocksDB;' | sudo -u testuser mysql -u testuser" 148 ) 149 machine.succeed( 150 "echo 'use testdb; insert into rocksdb values (28);' | sudo -u testuser mysql -u testuser" 151 ) 152 machine.succeed( 153 "echo 'use testdb; select test_id from rocksdb;' | sudo -u testuser mysql -u testuser -N | grep 28" 154 ) 155 machine.succeed( 156 "echo 'use testdb; drop table rocksdb;' | sudo -u testuser mysql -u testuser" 157 ) 158 ''} 159 ''; 160 }; 161in 162lib.mapAttrs ( 163 _: package: 164 makeMySQLTest { 165 inherit package; 166 hasRocksDB = false; 167 hasMroonga = false; 168 useSocketAuth = false; 169 } 170) mysqlPackages 171// (lib.mapAttrs ( 172 _: package: 173 makeMySQLTest { 174 inherit package; 175 } 176) mariadbPackages) 177// (lib.mapAttrs ( 178 _: package: 179 makeMySQLTest { 180 inherit package; 181 name = builtins.replaceStrings [ "-" ] [ "_" ] package.pname; 182 hasMroonga = false; 183 useSocketAuth = false; 184 } 185) perconaPackages)