at master 6.8 kB view raw
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)