{ lib, pkgs, package, ... }: rec { name = "clickhouse-keeper"; meta.maintainers = with pkgs.lib.maintainers; [ jpds thevar1able ]; nodes = let node = i: { environment.etc = { "clickhouse-server/config.d/cluster.xml".text = '' ${lib.concatStrings ( lib.imap0 (j: name: '' ${name} 9000 '') (builtins.attrNames nodes) )} ''; "clickhouse-server/config.d/keeper.xml".text = '' ${toString i} 9181 /var/lib/clickhouse/coordination/log /var/lib/clickhouse/coordination/snapshots 10000 30000 trace 10000 ${lib.concatStrings ( lib.imap1 (j: name: '' ${toString j} ${name} 9444 '') (builtins.attrNames nodes) )} ${lib.concatStrings ( lib.imap0 (j: name: '' ${name} 9181 '') (builtins.attrNames nodes) )} /clickhouse/testcluster/task_queue/ddl ''; "clickhouse-server/config.d/listen.xml".text = '' :: ''; "clickhouse-server/config.d/macros.xml".text = '' ${toString i} perftest_2shards_1replicas ''; }; networking.firewall.allowedTCPPorts = [ 9009 9181 9444 ]; services.clickhouse = { enable = true; inherit package; }; systemd.services.clickhouse = { after = [ "network-online.target" ]; requires = [ "network-online.target" ]; }; virtualisation.memorySize = 1024 * 4; virtualisation.diskSize = 1024 * 10; }; in { clickhouse1 = node 1; clickhouse2 = node 2; }; testScript = let # work around quote/substitution complexity by Nix, Perl, bash and SQL. clustersQuery = pkgs.writeText "clusters.sql" "SHOW clusters"; keeperQuery = pkgs.writeText "keeper.sql" "SELECT * FROM system.zookeeper WHERE path IN ('/', '/clickhouse') FORMAT VERTICAL"; systemClustersQuery = pkgs.writeText "system-clusters.sql" "SELECT host_name, host_address, replica_num FROM system.clusters WHERE cluster = 'perftest_2shards_1replicas'"; tableDDL = pkgs.writeText "table.sql" '' CREATE TABLE test ON cluster 'perftest_2shards_1replicas' ( A Int64, S String) Engine = ReplicatedMergeTree('/clickhouse/{cluster}/tables/{database}/{table}', '{replica}') ORDER BY A; ''; insertDDL = pkgs.writeText "insert.sql" " INSERT INTO test SELECT number, '' FROM numbers(100000000); "; selectCountQuery = pkgs.writeText "select-count.sql" " select count() from test; "; in '' clickhouse1.start() clickhouse2.start() for machine in clickhouse1, clickhouse2: machine.wait_for_unit("clickhouse.service") machine.wait_for_open_port(9000) machine.wait_for_open_port(9009) machine.wait_for_open_port(9181) machine.wait_for_open_port(9444) machine.wait_until_succeeds( """ journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/keeper.xml'" """ ) machine.log(machine.succeed( "cat ${clustersQuery} | clickhouse-client | grep perftest_2shards_1replicas" )) machine.log(machine.succeed( "cat ${keeperQuery} | clickhouse-client" )) machine.succeed( "cat ${systemClustersQuery} | clickhouse-client | grep clickhouse1" ) machine.succeed( "cat ${systemClustersQuery} | clickhouse-client | grep clickhouse2" ) machine.succeed( "ls /var/lib/clickhouse/coordination/log | grep changelog" ) clickhouse2.succeed( "cat ${tableDDL} | clickhouse-client" ) clickhouse2.succeed( "cat ${insertDDL} | clickhouse-client" ) for machine in clickhouse1, clickhouse2: machine.wait_until_succeeds( "cat ${selectCountQuery} | clickhouse-client | grep 100000000" ) ''; }