at 25.11-pre 5.8 kB view raw
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)