Skip to content

Commit

Permalink
Add first integrated test with nixosTest VM (wip)
Browse files Browse the repository at this point in the history
This is a first pass at adding integrated tests for keter. This works by
spinning up a NixOS virtual machine, running keter as a systemd service
on it, and probing it with HTTP requests.
  • Loading branch information
jezen committed Feb 13, 2025
1 parent ce1904e commit 64b5ed7
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 0 deletions.
2 changes: 2 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
stylish-haskell.enable = true;
};
};

integratedTests = pkgs.callPackage ./vm.nix { inherit self; };
};

devShells.default = pkgs.haskellPackages.shellFor {
Expand Down
71 changes: 71 additions & 0 deletions keter.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{ config, lib, pkgs, ... }:

let
cfg = config.services.keter-ng;

in
{
options.services.keter-ng = {
enable = lib.mkEnableOption (lib.mdDoc ''
keter — a web app deployment manager.
'');

root = lib.mkOption {
type = lib.types.str;
default = "/opt/keter";
description = lib.mdDoc "Mutable state folder for keter";
};

package = lib.mkOption {
type = lib.types.package;
default = pkgs.haskellPackages.keter;
defaultText = lib.literalExpression "pkgs.haskellPackages.keter";
description = lib.mdDoc "The keter package to be used";
};

globalKeterConfig = lib.mkOption {
type = lib.types.str;
default = "";
description = lib.mdDoc ''
A custom YAML configuration for Keter. This content will be directly
written to the `keter-config.yml` file without modification. See
<https://github.com/snoyberg/keter/blob/master/etc/keter-config.yaml>
for reference.
'';
};
};

config = lib.mkIf cfg.enable (
let
incoming = "${cfg.root}/incoming";

globalKeterConfigFile = pkgs.writeTextFile {
name = "keter-config.yml";
text = cfg.globalKeterConfig;
};
in
{
systemd.services.keter-ng = {
description = "keter app loader";
script = ''
set -xe
mkdir -p ${incoming}
${lib.getExe cfg.package} ${globalKeterConfigFile};
'';
wantedBy = [ "multi-user.target" "nginx.service" ];

serviceConfig = {
Restart = "always";
RestartSec = "10s";
};

after = [
"network.target"
"local-fs.target"
"postgresql.service"
];
};
}
);
}

41 changes: 41 additions & 0 deletions vm.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{ testers, pkgs, self }:

testers.nixosTest {
name = "vm-test";

nodes.server = { ... }: {

environment.systemPackages = with pkgs; [ httpie ];

imports = [
./keter.nix
];

nix.settings = {
experimental-features = [ "nix-command" "flakes" ];
auto-optimise-store = true;
};

services.keter-ng = {
enable = true;
package = self.packages.x86_64-linux.keter;
globalKeterConfig = ''
root: /opt/keter
rotate-logs: false
listeners:
- host: "*4"
port: 80
'';
};

};

testScript = ''
server.start()
server.wait_for_unit("keter.service")
# Verify keter is running
server.wait_for_unit("keter.service")
server.wait_until_succeeds("http --check-status :80", timeout = 10)
'';
}

0 comments on commit 64b5ed7

Please sign in to comment.