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}