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"
    '';
  })
