nixpkgs-suyu/nixos/tests/geoserver.nix
2024-02-20 10:28:58 +01:00

79 lines
2.7 KiB
Nix

{ pkgs, lib, ... }:
let
geoserver = pkgs.geoserver;
geoserverWithImporterExtension = pkgs.geoserver.withExtensions (ps: with ps; [ importer ]);
# Blacklisted extensions:
# - wps-jdbc needs a running (Postrgres) db server.
blacklist = [ "wps-jdbc" ];
blacklistedToNull = n: v: if ! builtins.elem n blacklist then v else null;
getNonBlackistedExtensionsAsList = ps: builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList blacklistedToNull ps);
geoserverWithAllExtensions = pkgs.geoserver.withExtensions (ps: getNonBlackistedExtensionsAsList ps);
in
{
name = "geoserver";
meta = {
maintainers = with lib; [ teams.geospatial.members ];
};
nodes = {
machine = { pkgs, ... }: {
virtualisation.diskSize = 2 * 1024;
environment.systemPackages = [
geoserver
geoserverWithImporterExtension
geoserverWithAllExtensions
];
};
};
testScript = ''
from contextlib import contextmanager
curl_cmd = "curl --fail --connect-timeout 2"
curl_cmd_rest = f"{curl_cmd} -u admin:geoserver -X GET"
base_url = "http://localhost:8080/geoserver"
log_file = "./log.txt"
@contextmanager
def running_geoserver(pkg):
try:
print(f"Launching geoserver from {pkg}...")
machine.execute(f"{pkg}/bin/geoserver-startup > {log_file} 2>&1 &")
machine.wait_until_succeeds(f"{curl_cmd} {base_url} 2>&1", timeout=60)
yield
finally:
# We need to wait a little bit to make sure the server is properly
# shutdown before launching a new instance.
machine.execute(f"{pkg}/bin/geoserver-shutdown; sleep 1")
start_all()
with running_geoserver("${geoserver}"):
machine.succeed(f"{curl_cmd} {base_url}/ows?service=WMS&version=1.3.0&request=GetCapabilities")
# No extensions yet.
machine.fail(f"{curl_cmd_rest} {base_url}/rest/imports")
machine.fail(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
with running_geoserver("${geoserverWithImporterExtension}"):
machine.succeed(f"{curl_cmd_rest} {base_url}/rest/imports")
machine.fail(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
with running_geoserver("${geoserverWithAllExtensions}"):
machine.succeed(f"{curl_cmd_rest} {base_url}/rest/imports")
machine.succeed(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
_, stdout = machine.execute(f"cat {log_file}")
print(stdout.replace("\\n", "\n"))
assert "GDAL Native Library loaded" in stdout, "gdal"
assert "The turbo jpeg encoder is available for usage" in stdout, "libjpeg-turbo"
assert "org.geotools.imageio.netcdf.utilities.NetCDFUtilities" in stdout, "netcdf"
assert "Unable to load library 'netcdf'" not in stdout, "netcdf"
'';
}