at 25.11-pre 3.9 kB view raw
1import ./make-test-python.nix ( 2 { pkgs, lib, ... }: 3 let 4 inherit (import ./ssh-keys.nix pkgs) snakeOilPrivateKey snakeOilPublicKey; 5 sshPort = 8231; 6 httpPort = 8232; 7 statsPort = 8233; 8 gitPort = 8418; 9 in 10 { 11 name = "soft-serve"; 12 meta.maintainers = with lib.maintainers; [ dadada ]; 13 nodes = { 14 client = 15 { pkgs, ... }: 16 { 17 environment.systemPackages = with pkgs; [ 18 curl 19 git 20 openssh 21 ]; 22 environment.etc.sshKey = { 23 source = snakeOilPrivateKey; 24 mode = "0600"; 25 }; 26 }; 27 28 server = 29 { config, ... }: 30 { 31 services.soft-serve = { 32 enable = true; 33 settings = { 34 name = "TestServer"; 35 ssh.listen_addr = ":${toString sshPort}"; 36 git.listen_addr = ":${toString gitPort}"; 37 http.listen_addr = ":${toString httpPort}"; 38 stats.listen_addr = ":${toString statsPort}"; 39 initial_admin_keys = [ snakeOilPublicKey ]; 40 }; 41 }; 42 networking.firewall.allowedTCPPorts = [ 43 sshPort 44 httpPort 45 statsPort 46 ]; 47 }; 48 }; 49 50 testScript = 51 { ... }: 52 '' 53 SSH_PORT = ${toString sshPort} 54 HTTP_PORT = ${toString httpPort} 55 STATS_PORT = ${toString statsPort} 56 KEY = "${snakeOilPublicKey}" 57 SSH_KEY = "/etc/sshKey" 58 SSH_COMMAND = f"ssh -p {SSH_PORT} -i {SSH_KEY} -o StrictHostKeyChecking=no" 59 TEST_DIR = "/tmp/test" 60 GIT = f"git -C {TEST_DIR}" 61 62 for machine in client, server: 63 machine.wait_for_unit("network.target") 64 65 server.wait_for_unit("soft-serve.service") 66 server.wait_for_open_port(SSH_PORT) 67 68 with subtest("Get info"): 69 status, test = client.execute(f"{SSH_COMMAND} server info") 70 if status != 0: 71 raise Exception("Failed to get SSH info") 72 key = " ".join(KEY.split(" ")[0:2]) 73 if not key in test: 74 raise Exception("Admin key must be configured correctly") 75 76 with subtest("Create user"): 77 client.succeed(f"{SSH_COMMAND} server user create beatrice") 78 client.succeed(f"{SSH_COMMAND} server user info beatrice") 79 80 with subtest("Create repo"): 81 client.succeed(f"git init {TEST_DIR}") 82 client.succeed(f"{GIT} config --global user.email you@example.com") 83 client.succeed(f"touch {TEST_DIR}/foo") 84 client.succeed(f"{GIT} add foo") 85 client.succeed(f"{GIT} commit --allow-empty -m test") 86 client.succeed(f"{GIT} remote add origin git@server:test") 87 client.succeed(f"GIT_SSH_COMMAND='{SSH_COMMAND}' {GIT} push -u origin master") 88 client.execute("rm -r /tmp/test") 89 90 server.wait_for_open_port(HTTP_PORT) 91 92 with subtest("Clone over HTTP"): 93 client.succeed(f"curl --connect-timeout 10 http://server:{HTTP_PORT}/") 94 client.succeed(f"git clone http://server:{HTTP_PORT}/test /tmp/test") 95 client.execute("rm -r /tmp/test") 96 97 with subtest("Clone over SSH"): 98 client.succeed(f"GIT_SSH_COMMAND='{SSH_COMMAND}' git clone git@server:test /tmp/test") 99 client.execute("rm -r /tmp/test") 100 101 with subtest("Get stats over HTTP"): 102 server.wait_for_open_port(STATS_PORT) 103 status, test = client.execute(f"curl --connect-timeout 10 http://server:{STATS_PORT}/metrics") 104 if status != 0: 105 raise Exception("Failed to get metrics from status port") 106 if not "go_gc_duration_seconds_count" in test: 107 raise Exception("Metrics did not contain key 'go_gc_duration_seconds_count'") 108 ''; 109 } 110)