diff --git a/nixos/modules/tests/exercise-storage.py b/nixos/modules/tests/exercise-storage.py index 88cd34bb73102ddbeb6178bfe13e8ed202a8be6e..e3a1d4d2ec7674042487cc0c6dabc670fcd6561d 100755 --- a/nixos/modules/tests/exercise-storage.py +++ b/nixos/modules/tests/exercise-storage.py @@ -10,6 +10,8 @@ from sys import argv from os import urandom from subprocess import check_output from io import BytesIO +from time import sleep, ctime +from pprint import pprint import requests import hyperlink @@ -21,10 +23,45 @@ def main(): api_root = get_api_root(clientDir) + block_until_connected(api_root) + subject_cap = exercise_immutable(api_root, someData) newDir = exercise_mkdir(api_root) exercise_link_unlink(api_root, newDir, subject_cap) +def block_until_connected(api_root): + """ + Block until the Tahoe-LAFS node at the given API root reports it has + connected to at least one storage server. + """ + while True: + response = requests.get( + api_root.replace(query={u"t": u"json"}), + ) + response.raise_for_status() + welcome = response.json() + servers = welcome["servers"] + connected = list( + server + for server + in servers + if server["connection_status"].startswith("Connected to ") + ) + if len(connected) >= 1: + print( + "Connected to a server:\n" + "\t{nodeid}\n" + "\t{status}\n" + "\t{last_received_data}\n".format( + nodeid=connected[0]["nodeid"], + status=connected[0]["connection_status"], + last_received_data=ctime(connected[0]["last_received_data"]), + ), + ) + return + pprint(welcome) + sleep(0.1) + def exercise_immutable(api_root, someData): cap = tahoe_put(api_root, someData) dataReadBack = tahoe_get(api_root, cap) diff --git a/nixos/modules/tests/private-storage.nix b/nixos/modules/tests/private-storage.nix index 47acfbf475a5d029b5f2800d4a11e2ff18eaa9d2..2542802eccf829748d5ae10043e3e87d5ed133fe 100644 --- a/nixos/modules/tests/private-storage.nix +++ b/nixos/modules/tests/private-storage.nix @@ -266,5 +266,25 @@ import <nixpkgs/nixos/tests/make-test.nix> { $client->log($log); die $@; }; - ''; -} + + # It should be possible to restart the storage service. Do so and + # ensure the client can still access it afterwards. + eval { + ${runOnNode "storage" [ "systemctl" "restart" "tahoe.storage" ]} + } or do { + my $error = $@ || 'Unknown failure'; + my ($code, $log) = $storage->execute('cat /tmp/stdout /tmp/stderr'); + $storage->log($log); + die $@; + }; + + # Same as above. + eval { + ${runOnNode "client" [ exercise-storage "/tmp/client" ]} + } or do { + my $error = $@ || 'Unknown failure'; + my ($code, $log) = $client->execute('cat /tmp/stdout /tmp/stderr'); + $client->log($log); + die $@; + }; + ''; }