1{ pkgs, lib, ... }:
2
3let
4 geoserver = pkgs.geoserver;
5 geoserverWithImporterExtension = pkgs.geoserver.withExtensions (ps: with ps; [ importer ]);
6
7 # Blacklisted extensions:
8 # - wps-jdbc needs a running (Postrgres) db server.
9 blacklist = [ "wps-jdbc" ];
10
11 blacklistedToNull = n: v: if !builtins.elem n blacklist then v else null;
12 getNonBlackistedExtensionsAsList =
13 ps: builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList blacklistedToNull ps);
14 geoserverWithAllExtensions = pkgs.geoserver.withExtensions (
15 ps: getNonBlackistedExtensionsAsList ps
16 );
17in
18{
19
20 name = "geoserver";
21 meta = {
22 maintainers = with lib; [ teams.geospatial.members ];
23 };
24
25 nodes = {
26 machine =
27 { pkgs, ... }:
28 {
29 virtualisation.diskSize = 2 * 1024;
30
31 environment.systemPackages = [
32 geoserver
33 geoserverWithImporterExtension
34 geoserverWithAllExtensions
35 ];
36 };
37 };
38
39 testScript = ''
40 from contextlib import contextmanager
41
42 curl_cmd = "curl --fail --connect-timeout 2"
43 curl_cmd_rest = f"{curl_cmd} -u admin:geoserver -X GET"
44 base_url = "http://localhost:8080/geoserver"
45 log_file = "./log.txt"
46
47 @contextmanager
48 def running_geoserver(pkg):
49 try:
50 print(f"Launching geoserver from {pkg}...")
51 machine.execute(f"{pkg}/bin/geoserver-startup > {log_file} 2>&1 &")
52 machine.wait_until_succeeds(f"{curl_cmd} {base_url} 2>&1", timeout=60)
53 yield
54 finally:
55 # We need to wait a little bit to make sure the server is properly
56 # shutdown before launching a new instance.
57 machine.execute(f"{pkg}/bin/geoserver-shutdown; sleep 1")
58
59 start_all()
60
61 with running_geoserver("${geoserver}"):
62 machine.succeed(f"{curl_cmd} {base_url}/ows?service=WMS&version=1.3.0&request=GetCapabilities")
63
64 # No extensions yet.
65 machine.fail(f"{curl_cmd_rest} {base_url}/rest/imports")
66 machine.fail(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
67
68
69 with running_geoserver("${geoserverWithImporterExtension}"):
70 machine.succeed(f"{curl_cmd_rest} {base_url}/rest/imports")
71 machine.fail(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
72
73 with running_geoserver("${geoserverWithAllExtensions}"):
74 machine.succeed(f"{curl_cmd_rest} {base_url}/rest/imports")
75 machine.succeed(f"{curl_cmd_rest} {base_url}/rest/monitor/requests.csv")
76 _, stdout = machine.execute(f"cat {log_file}")
77 print(stdout.replace("\\n", "\n"))
78 assert "GDAL Native Library loaded" in stdout, "gdal"
79 assert "The turbo jpeg encoder is available for usage" in stdout, "libjpeg-turbo"
80 assert "org.geotools.imageio.netcdf.utilities.NetCDFUtilities" in stdout, "netcdf"
81 assert "Unable to load library 'netcdf'" not in stdout, "netcdf"
82
83 '';
84}