nixos/librenms: add nixos test

This commit is contained in:
Jennifer Graul 2023-10-05 16:09:58 +02:00 committed by Yureka
parent e94820dfb2
commit d4b59bcdb0
3 changed files with 120 additions and 2 deletions

View file

@ -433,6 +433,7 @@ in {
lemmy = handleTest ./lemmy.nix {}; lemmy = handleTest ./lemmy.nix {};
libinput = handleTest ./libinput.nix {}; libinput = handleTest ./libinput.nix {};
libreddit = handleTest ./libreddit.nix {}; libreddit = handleTest ./libreddit.nix {};
librenms = handleTest ./librenms.nix {};
libresprite = handleTest ./libresprite.nix {}; libresprite = handleTest ./libresprite.nix {};
libreswan = handleTest ./libreswan.nix {}; libreswan = handleTest ./libreswan.nix {};
librewolf = handleTest ./firefox.nix { firefoxPackage = pkgs.librewolf; }; librewolf = handleTest ./firefox.nix { firefoxPackage = pkgs.librewolf; };

108
nixos/tests/librenms.nix Normal file
View file

@ -0,0 +1,108 @@
import ./make-test-python.nix ({ pkgs, lib, ... }:
let
api_token = "f87f42114e44b63ad1b9e3c3d33d6fbe"; # random md5 hash
wrong_api_token = "e68ba041fcf1eab923a7a6de3af5f726"; # another random md5 hash
in {
name = "librenms";
meta.maintainers = lib.teams.wdz.members;
nodes.librenms = {
time.timeZone = "Europe/Berlin";
environment.systemPackages = with pkgs; [
curl
jq
];
services.librenms = {
enable = true;
hostname = "librenms";
database = {
createLocally = true;
host = "localhost";
database = "librenms";
username = "librenms";
passwordFile = pkgs.writeText "librenms-db-pass" "librenmsdbpass";
};
nginx = {
default = true;
};
enableOneMinutePolling = true;
settings = {
enable_billing = true;
};
};
# systemd oneshot to create a dummy admin user and a API token for testing
systemd.services.lnms-api-init = {
description = "LibreNMS API init";
after = [ "librenms-setup.service" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
User = "root";
Group = "root";
};
script = ''
API_USER_NAME=api
API_TOKEN=${api_token} # random md5 hash
# we don't need to know the password, it just has to exist
API_USER_PASS=$(${pkgs.pwgen}/bin/pwgen -s 64 1)
${pkgs.librenms}/artisan user:add $API_USER_NAME -r admin -p $API_USER_PASS
API_USER_ID=$(${pkgs.mariadb}/bin/mysql -D librenms -N -B -e "SELECT user_id FROM users WHERE username = '$API_USER_NAME';")
${pkgs.mariadb}/bin/mysql -D librenms -e "INSERT INTO api_tokens (user_id, token_hash, description) VALUES ($API_USER_ID, '$API_TOKEN', 'API User')"
'';
};
};
nodes.snmphost = {
networking.firewall.allowedUDPPorts = [ 161 ];
systemd.services.snmpd = {
description = "snmpd";
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "forking";
User = "root";
Group = "root";
ExecStart = let
snmpd-config = pkgs.writeText "snmpd-config" ''
com2sec readonly default public
group MyROGroup v2c readonly
view all included .1 80
access MyROGroup "" any noauth exact all none none
syslocation Testcity, Testcountry
syscontact Testi mc Test <test@example.com>
'';
in "${pkgs.net-snmp}/bin/snmpd -c ${snmpd-config} -C";
};
};
};
testScript = ''
start_all()
snmphost.wait_until_succeeds("pgrep snmpd")
librenms.wait_for_unit("lnms-api-init.service")
librenms.wait_for_open_port(80)
# Test that we can authenticate against the API
librenms.succeed("curl --fail -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0")
librenms.fail("curl --fail -H 'X-Auth-Token: ${wrong_api_token}' http://localhost/api/v0")
# add snmphost as a device
librenms.succeed("curl --fail -X POST -d '{\"hostname\":\"snmphost\",\"version\":\"v2c\",\"community\":\"public\"}' -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0/devices")
# wait until snmphost gets polled
librenms.wait_until_succeeds("test $(curl -H 'X-Auth-Token: ${api_token}' http://localhost/api/v0/devices/snmphost | jq -Mr .devices[0].last_polled) != 'null'")
'';
})

View file

@ -1,4 +1,10 @@
{ pkgs, stdenv, lib, fetchFromGitHub, unixtools, php82, python3, makeWrapper { lib
, fetchFromGitHub
, unixtools
, php82
, python3
, makeWrapper
, nixosTests
# run-time dependencies # run-time dependencies
, graphviz , graphviz
, ipmitool , ipmitool
@ -95,7 +101,10 @@ in phpPackage.buildComposerProject rec {
runHook postInstall runHook postInstall
''; '';
passthru = { phpPackage = phpPackage; }; passthru = {
phpPackage = phpPackage;
tests.librenms = nixosTests.librenms;
};
meta = with lib; { meta = with lib; {
description = "A auto-discovering PHP/MySQL/SNMP based network monitoring"; description = "A auto-discovering PHP/MySQL/SNMP based network monitoring";