1import ./make-test.nix ({ pkgs, ...}:
2let
3 # Change this to test a different version of Cassandra:
4 testPackage = pkgs.cassandra;
5 cassandraCfg =
6 { enable = true;
7 listenAddress = null;
8 listenInterface = "eth1";
9 rpcAddress = null;
10 rpcInterface = "eth1";
11 extraConfig =
12 { start_native_transport = true;
13 seed_provider =
14 [{ class_name = "org.apache.cassandra.locator.SimpleSeedProvider";
15 parameters = [ { seeds = "cass0"; } ];
16 }];
17 };
18 package = testPackage;
19 };
20 nodeCfg = extra: {pkgs, config, ...}:
21 { environment.systemPackages = [ testPackage ];
22 networking.firewall.enable = false;
23 services.cassandra = cassandraCfg // extra;
24 virtualisation.memorySize = 1024;
25 };
26in
27{
28 name = "cassandra-ci";
29
30 nodes = {
31 cass0 = nodeCfg {};
32 cass1 = nodeCfg {};
33 cass2 = nodeCfg { jvmOpts = [ "-Dcassandra.replace_address=cass1" ]; };
34 };
35
36 testScript = ''
37 subtest "timers exist", sub {
38 $cass0->succeed("systemctl list-timers | grep cassandra-full-repair.timer");
39 $cass0->succeed("systemctl list-timers | grep cassandra-incremental-repair.timer");
40 };
41 subtest "can connect via cqlsh", sub {
42 $cass0->waitForUnit("cassandra.service");
43 $cass0->waitUntilSucceeds("nc -z cass0 9042");
44 $cass0->succeed("echo 'show version;' | cqlsh cass0");
45 };
46 subtest "nodetool is operational", sub {
47 $cass0->waitForUnit("cassandra.service");
48 $cass0->waitUntilSucceeds("nc -z localhost 7199");
49 $cass0->succeed("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass0'");
50 };
51 subtest "bring up cluster", sub {
52 $cass1->waitForUnit("cassandra.service");
53 $cass1->waitUntilSucceeds("nodetool status | egrep -c '^UN' | grep 2");
54 $cass0->succeed("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass1'");
55 };
56 subtest "break and fix node", sub {
57 $cass1->block;
58 $cass0->waitUntilSucceeds("nodetool status --resolve-ip | egrep -c '^DN[[:space:]]+cass1'");
59 $cass0->succeed("nodetool status | egrep -c '^UN' | grep 1");
60 $cass1->unblock;
61 $cass1->waitUntilSucceeds("nodetool status | egrep -c '^UN' | grep 2");
62 $cass0->succeed("nodetool status | egrep -c '^UN' | grep 2");
63 };
64 subtest "replace crashed node", sub {
65 $cass1->crash;
66 $cass2->waitForUnit("cassandra.service");
67 $cass0->waitUntilFails("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass1'");
68 $cass0->waitUntilSucceeds("nodetool status --resolve-ip | egrep '^UN[[:space:]]+cass2'");
69 };
70 '';
71})