summaryrefslogtreecommitdiffstats
path: root/nixos
diff options
context:
space:
mode:
authorFlorian Brandes <florian.brandes@posteo.de>2023-01-28 20:02:15 +0100
committerFlorian Brandes <florian.brandes@posteo.de>2023-01-29 05:40:28 +0100
commit5b3ce4f78fe3eef68179a177928b4ee9d63ecb85 (patch)
tree90b5bffaa58850921ffad0bcd726e2e5dcae0b1f /nixos
parent09ad98302c278f2c9837c2ea5bb1492306bafe33 (diff)
octoprint: add nixosTests
Signed-off-by: Florian Brandes <florian.brandes@posteo.de> Co-authored-by: Nick Cao <nickcao@nichi.co>
Diffstat (limited to 'nixos')
-rw-r--r--nixos/tests/all-tests.nix1
-rw-r--r--nixos/tests/octoprint.nix61
2 files changed, 62 insertions, 0 deletions
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index b839d539c9f5..12e386f1c2d5 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -485,6 +485,7 @@ in {
opensmtpd = handleTest ./opensmtpd.nix {};
opensmtpd-rspamd = handleTest ./opensmtpd-rspamd.nix {};
openssh = handleTest ./openssh.nix {};
+ octoprint = handleTest ./octoprint.nix {};
openstack-image-metadata = (handleTestOn ["x86_64-linux"] ./openstack-image.nix {}).metadata or {};
openstack-image-userdata = (handleTestOn ["x86_64-linux"] ./openstack-image.nix {}).userdata or {};
opentabletdriver = handleTest ./opentabletdriver.nix {};
diff --git a/nixos/tests/octoprint.nix b/nixos/tests/octoprint.nix
new file mode 100644
index 000000000000..15a2d677d4cf
--- /dev/null
+++ b/nixos/tests/octoprint.nix
@@ -0,0 +1,61 @@
+import ./make-test-python.nix ({ pkgs, lib, ... }:
+
+let
+ apikey = "testapikey";
+in
+{
+ name = "octoprint";
+ meta.maintainers = with lib.maintainers; [ gador ];
+
+ nodes.machine = { pkgs, ... }: {
+ environment.systemPackages = with pkgs; [ jq ];
+ services.octoprint = {
+ enable = true;
+ extraConfig = {
+ server = {
+ firstRun = false;
+ };
+ api = {
+ enabled = true;
+ key = apikey;
+ };
+ plugins = {
+ # these need internet access and pollute the output with connection failed errors
+ _disabled = [ "softwareupdate" "announcements" "pluginmanager" ];
+ };
+ };
+ };
+ };
+
+ testScript = ''
+ import json
+
+ @polling_condition
+ def octoprint_running():
+ machine.succeed("pgrep octoprint")
+
+ with subtest("Wait for octoprint service to start"):
+ machine.wait_for_unit("octoprint.service")
+ machine.wait_until_succeeds("pgrep octoprint")
+
+ with subtest("Wait for final boot"):
+ # this appears whe octoprint is almost finished starting
+ machine.wait_for_file("/var/lib/octoprint/uploads")
+
+ # octoprint takes some time to start. This makes sure we'll retry just in case it takes longer
+ # retry-all-errors in necessary, since octoprint will report a 404 error when not yet ready
+ curl_cmd = "curl --retry-all-errors --connect-timeout 5 --max-time 10 --retry 5 --retry-delay 0 \
+ --retry-max-time 40 -X GET --header 'X-API-Key: ${apikey}' "
+
+ # used to fail early, in case octoprint first starts and then crashes
+ with octoprint_running: # type: ignore[union-attr]
+ with subtest("Check for web interface"):
+ machine.wait_until_succeeds("curl -s localhost:5000")
+
+ with subtest("Check API"):
+ version = json.loads(machine.succeed(curl_cmd + "localhost:5000/api/version"))
+ server = json.loads(machine.succeed(curl_cmd + "localhost:5000/api/server"))
+ assert version["server"] == str("${pkgs.octoprint.version}")
+ assert server["safemode"] == None
+ '';
+})