notes: 2.3.0 -> 2.3.1 (#352950)
[NixPkgs.git] / nixos / tests / centrifugo.nix
blob8e940f74caa4b1a696776bd6560081757b2d3359
1 let
2   redisPort = 6379;
3   centrifugoPort = 8080;
4   nodes = [
5     "centrifugo1"
6     "centrifugo2"
7     "centrifugo3"
8   ];
9 in
10 { lib, ... }: {
11   name = "centrifugo";
12   meta.maintainers = [ lib.maintainers.tie ];
14   nodes = lib.listToAttrs (lib.imap0
15     (index: name: {
16       inherit name;
17       value = { config, ... }: {
18         services.centrifugo = {
19           enable = true;
20           settings = {
21             inherit name;
22             port = centrifugoPort;
23             # See https://centrifugal.dev/docs/server/engines#redis-sharding
24             engine = "redis";
25             # Connect to local Redis shard via Unix socket.
26             redis_address =
27               let toRedisAddresses = map (name: "${name}:${toString redisPort}"); in
28               toRedisAddresses (lib.take index nodes) ++ [
29                 "unix://${config.services.redis.servers.centrifugo.unixSocket}"
30               ] ++ toRedisAddresses (lib.drop (index + 1) nodes);
31             usage_stats_disable = true;
32             api_insecure = true;
33           };
34           extraGroups = [
35             config.services.redis.servers.centrifugo.user
36           ];
37         };
38         services.redis.servers.centrifugo = {
39           enable = true;
40           bind = null; # all interfaces
41           port = redisPort;
42           openFirewall = true;
43           settings.protected-mode = false;
44         };
45       };
46     })
47     nodes);
49   testScript = ''
50     import json
52     redisPort = ${toString redisPort}
53     centrifugoPort = ${toString centrifugoPort}
55     start_all()
57     for machine in machines:
58       machine.wait_for_unit("redis-centrifugo.service")
59       machine.wait_for_open_port(redisPort)
61     for machine in machines:
62       machine.wait_for_unit("centrifugo.service")
63       machine.wait_for_open_port(centrifugoPort)
65     # See https://centrifugal.dev/docs/server/server_api#info
66     def list_nodes(machine):
67       curl = "curl --fail-with-body --silent"
68       body = "{}"
69       resp = json.loads(machine.succeed(f"{curl} -d '{body}' http://localhost:{centrifugoPort}/api/info"))
70       return resp["result"]["nodes"]
71     machineNames = {m.name for m in machines}
72     for machine in machines:
73       nodes = list_nodes(machine)
74       assert len(nodes) == len(machines)
75       nodeNames = {n['name'] for n in nodes}
76       assert machineNames == nodeNames
77   '';