at master 3.3 kB view raw
1{ pkgs, package, ... }: 2 3let 4 s3 = { 5 bucket = "clickhouse-bucket"; 6 accessKey = "BKIKJAA5BMMU2RHO6IBB"; 7 secretKey = "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12"; 8 }; 9 10 clickhouseS3StorageConfig = '' 11 <clickhouse> 12 <storage_configuration> 13 <disks> 14 <s3_disk> 15 <type>s3</type> 16 <endpoint>http://minio:9000/${s3.bucket}/</endpoint> 17 <access_key_id>${s3.accessKey}</access_key_id> 18 <secret_access_key>${s3.secretKey}</secret_access_key> 19 <metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path> 20 </s3_disk> 21 <s3_cache> 22 <type>cache</type> 23 <disk>s3_disk</disk> 24 <path>/var/lib/clickhouse/disks/s3_cache/</path> 25 <max_size>10Gi</max_size> 26 </s3_cache> 27 </disks> 28 <policies> 29 <s3_main> 30 <volumes> 31 <main> 32 <disk>s3_disk</disk> 33 </main> 34 </volumes> 35 </s3_main> 36 </policies> 37 </storage_configuration> 38 </clickhouse> 39 ''; 40in 41{ 42 name = "clickhouse-s3"; 43 meta.maintainers = with pkgs.lib.maintainers; [ 44 jpds 45 thevar1able 46 ]; 47 48 nodes = { 49 clickhouse = { 50 environment.etc = { 51 "clickhouse-server/config.d/s3.xml" = { 52 text = "${clickhouseS3StorageConfig}"; 53 }; 54 }; 55 56 services.clickhouse = { 57 enable = true; 58 inherit package; 59 }; 60 virtualisation.diskSize = 15 * 1024; 61 virtualisation.memorySize = 4 * 1024; 62 }; 63 64 minio = 65 { pkgs, ... }: 66 { 67 virtualisation.diskSize = 2 * 1024; 68 networking.firewall.allowedTCPPorts = [ 9000 ]; 69 70 services.minio = { 71 enable = true; 72 inherit (s3) accessKey secretKey; 73 }; 74 75 environment.systemPackages = [ pkgs.minio-client ]; 76 }; 77 }; 78 79 testScript = 80 let 81 # work around quote/substitution complexity by Nix, Perl, bash and SQL. 82 tableDDL = pkgs.writeText "ddl.sql" '' 83 CREATE TABLE `demo` ( 84 `value` String 85 ) 86 ENGINE = MergeTree 87 ORDER BY value 88 SETTINGS storage_policy = 's3_main'; 89 ''; 90 insertQuery = pkgs.writeText "insert.sql" "INSERT INTO `demo` (`value`) VALUES ('foo');"; 91 selectQuery = pkgs.writeText "select.sql" "SELECT * from `demo`"; 92 in 93 '' 94 minio.wait_for_unit("minio") 95 minio.wait_for_open_port(9000) 96 minio.succeed( 97 "mc alias set minio " 98 + "http://localhost:9000 " 99 + "${s3.accessKey} ${s3.secretKey} --api s3v4", 100 "mc mb minio/${s3.bucket}", 101 ) 102 103 clickhouse.start() 104 clickhouse.wait_for_unit("clickhouse.service") 105 clickhouse.wait_for_open_port(9000) 106 107 clickhouse.wait_until_succeeds( 108 """ 109 journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/s3.xml'" 110 """ 111 ) 112 113 clickhouse.succeed( 114 "cat ${tableDDL} | clickhouse-client" 115 ) 116 clickhouse.succeed( 117 "cat ${insertQuery} | clickhouse-client" 118 ) 119 clickhouse.succeed( 120 "cat ${selectQuery} | clickhouse-client | grep foo" 121 ) 122 123 minio.log(minio.succeed( 124 "mc ls minio/${s3.bucket}", 125 )) 126 ''; 127}