1import ../make-test-python.nix (
2 { lib, pkgs, ... }:
3 let
4 domain = "peertube.local";
5 port = 9000;
6 url = "http://${domain}:${toString port}";
7 password = "zw4SqYVdcsXUfRX8aaFX";
8 registrationTokenFile = "/etc/peertube-runner-registration-token";
9 in
10 {
11 name = "peertube";
12 meta.maintainers = with lib.maintainers; [ izorkin ] ++ lib.teams.ngi.members;
13
14 nodes = {
15 database = {
16 networking = {
17 interfaces.eth1 = {
18 ipv4.addresses = [
19 {
20 address = "192.168.2.10";
21 prefixLength = 24;
22 }
23 ];
24 };
25 firewall.allowedTCPPorts = [
26 5432
27 31638
28 ];
29 };
30
31 services.postgresql = {
32 enable = true;
33 enableTCPIP = true;
34 ensureDatabases = [ "peertube_test" ];
35 ensureUsers = [
36 {
37 name = "peertube_test";
38 ensureDBOwnership = true;
39 }
40 ];
41 authentication = ''
42 hostnossl peertube_test peertube_test 192.168.2.11/32 md5
43 '';
44 initialScript = pkgs.writeText "postgresql_init.sql" ''
45 CREATE ROLE peertube_test LOGIN PASSWORD '0gUN0C1mgST6czvjZ8T9';
46 '';
47 };
48
49 services.redis.servers.peertube = {
50 enable = true;
51 bind = "0.0.0.0";
52 requirePass = "turrQfaQwnanGbcsdhxy";
53 port = 31638;
54 };
55 };
56
57 server =
58 { pkgs, ... }:
59 {
60 environment = {
61 etc = {
62 "peertube/password-init-root".text = ''
63 PT_INITIAL_ROOT_PASSWORD=${password}
64 '';
65 "peertube/secrets-peertube".text = ''
66 063d9c60d519597acef26003d5ecc32729083965d09181ef3949200cbe5f09ee
67 '';
68 "peertube/password-posgressql-db".text = ''
69 0gUN0C1mgST6czvjZ8T9
70 '';
71 "peertube/password-redis-db".text = ''
72 turrQfaQwnanGbcsdhxy
73 '';
74 };
75 };
76
77 networking = {
78 interfaces.eth1 = {
79 ipv4.addresses = [
80 {
81 address = "192.168.2.11";
82 prefixLength = 24;
83 }
84 ];
85 };
86 extraHosts = ''
87 192.168.2.11 ${domain}
88 '';
89 firewall.allowedTCPPorts = [ port ];
90 };
91
92 services.peertube = {
93 enable = true;
94 localDomain = domain;
95 enableWebHttps = false;
96
97 serviceEnvironmentFile = "/etc/peertube/password-init-root";
98
99 secrets = {
100 secretsFile = "/etc/peertube/secrets-peertube";
101 };
102
103 database = {
104 host = "192.168.2.10";
105 name = "peertube_test";
106 user = "peertube_test";
107 passwordFile = "/etc/peertube/password-posgressql-db";
108 };
109
110 redis = {
111 host = "192.168.2.10";
112 port = 31638;
113 passwordFile = "/etc/peertube/password-redis-db";
114 };
115
116 settings = {
117 listen = {
118 hostname = "0.0.0.0";
119 };
120 instance = {
121 name = "PeerTube Test Server";
122 };
123 };
124 };
125 };
126
127 client = {
128 environment.systemPackages = [
129 pkgs.jq
130 pkgs.peertube.cli
131 ];
132 networking = {
133 interfaces.eth1 = {
134 ipv4.addresses = [
135 {
136 address = "192.168.2.12";
137 prefixLength = 24;
138 }
139 ];
140 };
141 extraHosts = ''
142 192.168.2.11 ${domain}
143 '';
144 };
145
146 services.peertube-runner = {
147 enable = true;
148 # Don't pull in unneeded dependencies.
149 enabledJobTypes = [ "video-studio-transcoding" ];
150 instancesToRegister = {
151 testServer1 = {
152 inherit url registrationTokenFile;
153 runnerName = "I'm a test!!!";
154 };
155 testServer2 = {
156 inherit url registrationTokenFile;
157 runnerName = "I'm also a test...";
158 runnerDescription = "Even more testing?!?!";
159 };
160 };
161 };
162 # Will be manually started in test script.
163 systemd.services.peertube-runner.wantedBy = lib.mkForce [ ];
164 };
165
166 };
167
168 testScript = ''
169 start_all()
170
171 database.wait_for_unit("postgresql.target")
172 database.wait_for_unit("redis-peertube.service")
173
174 database.wait_for_open_port(5432)
175 database.wait_for_open_port(31638)
176
177 server.wait_for_unit("peertube.service")
178 server.wait_for_open_port(${toString port})
179
180 # Check if PeerTube is running
181 client.succeed("curl --fail ${url}/api/v1/config/about | jq -r '.instance.name' | grep 'PeerTube Test Server'")
182
183
184 # PeerTube CLI
185
186 client.succeed('peertube-cli auth add -u "${url}" -U "root" --password "${password}"')
187 client.succeed('peertube-cli auth list | grep "${url}"')
188 client.succeed('peertube-cli auth del "${url}"')
189 client.fail('peertube-cli auth list | grep "${url}"')
190
191
192 # peertube-runner
193
194 access_token = client.succeed(
195 'peertube-cli get-access-token --url "${url}" --username "root" --password "${password}"'
196 ).strip()
197 # Generate registration token.
198 client.succeed(f"curl --fail -X POST -H 'Authorization: Bearer {access_token}' ${url}/api/v1/runners/registration-tokens/generate")
199 # Get registration token, and put it where `registrationTokenFile` from the
200 # peertube-runner module points to.
201 client.succeed(
202 f"curl --fail -H 'Authorization: Bearer {access_token}' ${url}/api/v1/runners/registration-tokens" \
203 " | jq --raw-output '.data[0].registrationToken'" \
204 " > ${registrationTokenFile}"
205 )
206
207 client.systemctl("start peertube-runner.service")
208 client.wait_for_unit("peertube-runner.service")
209
210 runner_command = "sudo -u prunner peertube-runner"
211 client.succeed(f'{runner_command} list-registered | grep "I\'m a test!!!"')
212 client.succeed(f'{runner_command} list-registered | grep "I\'m also a test..."')
213 client.succeed(f'{runner_command} list-registered | grep "Even more testing?!?!"')
214
215 # Service should still work once instances are already registered.
216 client.systemctl("restart peertube-runner.service")
217 client.wait_for_unit("peertube-runner.service")
218
219
220 # Cleanup
221
222 client.shutdown()
223 server.shutdown()
224 database.shutdown()
225 '';
226 }
227)