nixos/zrepl: note about systemd unit, add snapshot test

Signed-off-by: Matt Layher <mdlayher@gmail.com>

Changed files
+76 -1
nixos
modules
services
backup
tests
pkgs
tools
backup
zrepl
+3
nixos/modules/services/backup/zrepl.nix
···
environment.etc."zrepl/zrepl.yml".source = configFile;
systemd.packages = [ pkgs.zrepl ];
+
+
# Note that pkgs.zrepl copies and adapts the upstream systemd unit, and
+
# the fields defined here only override certain fields from that unit.
systemd.services.zrepl = {
requires = [ "local-fs.target" ];
wantedBy = [ "zfs.target" ];
+1
nixos/tests/all-tests.nix
···
zigbee2mqtt = handleTest ./zigbee2mqtt.nix {};
zoneminder = handleTest ./zoneminder.nix {};
zookeeper = handleTest ./zookeeper.nix {};
+
zrepl = handleTest ./zrepl.nix {};
zsh-history = handleTest ./zsh-history.nix {};
}
+66
nixos/tests/zrepl.nix
···
+
import ./make-test-python.nix (
+
{
+
nodes.host = {config, pkgs, ...}: {
+
config = {
+
# Prerequisites for ZFS and tests.
+
boot.supportedFilesystems = [ "zfs" ];
+
environment.systemPackages = [ pkgs.zrepl ];
+
networking.hostId = "deadbeef";
+
services.zrepl = {
+
enable = true;
+
settings = {
+
# Enable Prometheus output for status assertions.
+
global.monitoring = [{
+
type = "prometheus";
+
listen = ":9811";
+
}];
+
# Create a periodic snapshot job for an ephemeral zpool.
+
jobs = [{
+
name = "snap_test";
+
type = "snap";
+
+
filesystems."test" = true;
+
snapshotting = {
+
type = "periodic";
+
prefix = "zrepl_";
+
interval = "1s";
+
};
+
+
pruning.keep = [{
+
type = "last_n";
+
count = 8;
+
}];
+
}];
+
};
+
};
+
};
+
};
+
+
testScript = ''
+
start_all()
+
+
with subtest("Wait for zrepl and network ready"):
+
host.wait_for_unit("network-online.target")
+
host.wait_for_unit("zrepl.service")
+
+
with subtest("Create test zpool"):
+
# ZFS requires 64MiB minimum pool size.
+
host.succeed("fallocate -l 64MiB /root/zpool.img")
+
host.succeed("zpool create test /root/zpool.img")
+
+
with subtest("Check for completed zrepl snapshot"):
+
# zrepl periodic snapshot job creates a snapshot with this prefix.
+
host.wait_until_succeeds("zfs list -t snapshot | grep -q zrepl_")
+
+
with subtest("Verify HTTP monitoring server is configured"):
+
out = host.succeed("curl -f localhost:9811/metrics")
+
+
assert (
+
"zrepl_version_daemon" in out
+
), "zrepl version metric was not found in Prometheus output"
+
+
assert (
+
"zrepl_zfs_snapshot_duration_count{filesystem=\"test\"}" in out
+
), "zrepl snapshot counter for test was not found in Prometheus output"
+
'';
+
})
+6 -1
pkgs/tools/backup/zrepl/default.nix
···
, buildGoModule
, fetchFromGitHub
, makeWrapper
+
, nixosTests
, openssh
}:
buildGoModule rec {
···
--prefix PATH : ${lib.makeBinPath [ openssh ]}
'';
+
passthru.tests = {
+
inherit (nixosTests) zrepl;
+
};
+
meta = with lib; {
homepage = "https://zrepl.github.io/";
description = "A one-stop, integrated solution for ZFS replication";
platforms = platforms.linux;
license = licenses.mit;
-
maintainers = with maintainers; [ cole-h danderson ];
+
maintainers = with maintainers; [ cole-h danderson mdlayher ];
};
}