1{ pkgs, lib, ... }:
2
3{
4 name = "zenohd";
5 meta.maintainers = [ lib.maintainers.markuskowa ];
6
7 nodes = {
8 router =
9 {
10 pkgs,
11 config,
12 ...
13 }:
14 {
15 networking.firewall.allowedTCPPorts = [
16 7447 # zenohd default port
17 config.services.zenohd.settings.plugins.mqtt.port
18 config.services.zenohd.settings.plugins.webserver.http_port
19 ];
20
21 services.zenohd = {
22 enable = true;
23
24 plugins = with pkgs; [
25 zenoh-plugin-mqtt
26 zenoh-plugin-webserver
27 ];
28
29 backends = with pkgs; [
30 zenoh-backend-filesystem
31 zenoh-backend-rocksdb
32 ];
33
34 settings = {
35 plugins = {
36 mqtt = {
37 port = 1883;
38 allow = ".*";
39 };
40 webserver.http_port = 8000;
41 storage_manager = {
42 volumes = {
43 fs = { };
44 rocksdb = { };
45 };
46 storages = {
47 mem = {
48 key_expr = "mem/**";
49 volume = "memory";
50 };
51 fs = {
52 key_expr = "fs/**";
53 volume = {
54 id = "fs";
55 dir = "zenoh-fs";
56 strip_prefix = "fs";
57 };
58 };
59 rocksdb = {
60 key_expr = "rocksdb/**";
61 volume = {
62 id = "rocksdb";
63 dir = "zenoh-rocksdb";
64 strip_prefix = "rocksdb";
65 create_db = true;
66 };
67 };
68 };
69 };
70 };
71 };
72 };
73 };
74
75 client = {
76 environment.systemPackages = [
77 pkgs.mosquitto
78 ];
79 };
80 };
81
82 testScript = ''
83 router.wait_for_unit("zenohd.service")
84 client.wait_for_unit("multi-user.target")
85
86 for be in ["fs", "rocksdb", "mem" ]:
87 client.succeed(f"mosquitto_pub -h router -t {be}/test -m hello")
88 client.succeed(f"curl router:8000/{be}/test | grep hello")
89 '';
90}