From 4d60b8f537c3cb24231febff5f1e3378b3e72122 Mon Sep 17 00:00:00 2001 From: Jonathan Davies Date: Sat, 24 May 2025 18:30:50 +0000 Subject: [PATCH] nixos/clickhouse: Add S3 testcase --- nixos/tests/clickhouse/default.nix | 1 + nixos/tests/clickhouse/s3.nix | 123 +++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 nixos/tests/clickhouse/s3.nix diff --git a/nixos/tests/clickhouse/default.nix b/nixos/tests/clickhouse/default.nix index bd52a1ebbd67..0efa24146ee3 100644 --- a/nixos/tests/clickhouse/default.nix +++ b/nixos/tests/clickhouse/default.nix @@ -8,4 +8,5 @@ base = import ./base.nix { inherit system pkgs; }; kafka = import ./kafka.nix { inherit system pkgs; }; keeper = import ./keeper.nix { inherit system pkgs; }; + s3 = import ./s3.nix { inherit system pkgs; }; } diff --git a/nixos/tests/clickhouse/s3.nix b/nixos/tests/clickhouse/s3.nix new file mode 100644 index 000000000000..b3ba5b360cc0 --- /dev/null +++ b/nixos/tests/clickhouse/s3.nix @@ -0,0 +1,123 @@ +import ../make-test-python.nix ( + { pkgs, ... }: + + let + s3 = { + bucket = "clickhouse-bucket"; + accessKey = "BKIKJAA5BMMU2RHO6IBB"; + secretKey = "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12"; + }; + + clickhouseS3StorageConfig = '' + + + + + s3 + http://minio:9000/${s3.bucket}/ + ${s3.accessKey} + ${s3.secretKey} + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+ ''; + in + { + name = "clickhouse-s3"; + meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; + + nodes = { + clickhouse = { + environment.etc = { + "clickhouse-server/config.d/s3.xml" = { + text = "${clickhouseS3StorageConfig}"; + }; + }; + + services.clickhouse.enable = true; + virtualisation.diskSize = 15 * 1024; + virtualisation.memorySize = 4 * 1024; + }; + + minio = + { pkgs, ... }: + { + virtualisation.diskSize = 2 * 1024; + networking.firewall.allowedTCPPorts = [ 9000 ]; + + services.minio = { + enable = true; + inherit (s3) accessKey secretKey; + }; + + environment.systemPackages = [ pkgs.minio-client ]; + }; + }; + + testScript = + let + # work around quote/substitution complexity by Nix, Perl, bash and SQL. + tableDDL = pkgs.writeText "ddl.sql" '' + CREATE TABLE `demo` ( + `value` String + ) + ENGINE = MergeTree + ORDER BY value + SETTINGS storage_policy = 's3_main'; + ''; + insertQuery = pkgs.writeText "insert.sql" "INSERT INTO `demo` (`value`) VALUES ('foo');"; + selectQuery = pkgs.writeText "select.sql" "SELECT * from `demo`"; + in + '' + minio.wait_for_unit("minio") + minio.wait_for_open_port(9000) + minio.succeed( + "mc alias set minio " + + "http://localhost:9000 " + + "${s3.accessKey} ${s3.secretKey} --api s3v4", + "mc mb minio/${s3.bucket}", + ) + + clickhouse.start() + clickhouse.wait_for_unit("clickhouse.service") + clickhouse.wait_for_open_port(9000) + + clickhouse.wait_until_succeeds( + """ + journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/s3.xml'" + """ + ) + + clickhouse.succeed( + "cat ${tableDDL} | clickhouse-client" + ) + clickhouse.succeed( + "cat ${insertQuery} | clickhouse-client" + ) + clickhouse.succeed( + "cat ${selectQuery} | clickhouse-client | grep foo" + ) + + minio.log(minio.succeed( + "mc ls minio/${s3.bucket}", + )) + ''; + } +)