1{ pkgs, lib, ... }:
2{
3 name = "gns3-server";
4 meta.maintainers = [ lib.maintainers.anthonyroussel ];
5
6 nodes.machine =
7 { ... }:
8 let
9 tls-cert = pkgs.runCommand "selfSignedCerts" { buildInputs = [ pkgs.openssl ]; } ''
10 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes -days 365 \
11 -subj '/CN=localhost'
12 install -D -t $out key.pem cert.pem
13 '';
14 in
15 {
16 services.gns3-server = {
17 enable = true;
18 auth = {
19 enable = true;
20 user = "user";
21 passwordFile = pkgs.writeText "gns3-auth-password-file" "password";
22 };
23 ssl = {
24 enable = true;
25 certFile = "${tls-cert}/cert.pem";
26 keyFile = "${tls-cert}/key.pem";
27 };
28 dynamips.enable = true;
29 ubridge.enable = true;
30 vpcs.enable = true;
31 };
32
33 security.pki.certificateFiles = [ "${tls-cert}/cert.pem" ];
34 };
35
36 testScript =
37 let
38 createProject = pkgs.writeText "createProject.json" (
39 builtins.toJSON {
40 name = "test_project";
41 }
42 );
43 in
44 ''
45 start_all()
46
47 machine.wait_for_unit("gns3-server.service")
48 machine.wait_for_open_port(3080)
49
50 with subtest("server is listening"):
51 machine.succeed("curl -sSfL -u user:password https://localhost:3080/v2/version")
52
53 with subtest("create dummy project"):
54 machine.succeed("curl -sSfL -u user:password https://localhost:3080/v2/projects -d @${createProject}")
55
56 with subtest("logging works"):
57 log_path = "/var/log/gns3/server.log"
58 machine.wait_for_file(log_path)
59 '';
60}