diff --git a/nixos/modules/tests/exercise-storage.py b/nixos/modules/tests/exercise-storage.py
index 1d7197e6251a7570aafd7ac61e0564a22fbf67c9..00f3a2cf0a7bb8ceeb21d010a9c022e9e79af5dc 100755
--- a/nixos/modules/tests/exercise-storage.py
+++ b/nixos/modules/tests/exercise-storage.py
@@ -1,31 +1,38 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
 
 from sys import argv
 from os import urandom
+from subprocess import check_output
+from io import BytesIO
+
+import requests
 
 def main():
     (clientDir,) = argv[1:]
 
     someData = urandom(2 ** 16)
-    with mkstemp() as (fd, name):
-        write(fd, someData)
-
-        cap = get([
-            "tahoe", "-d", clientDir,
-            "put", name,
-        ])
 
-        dataReadBack = get([
-            "tahoe", "-d", clientDir,
-            "get", cap,
-        ])
+    api_root = get_api_root(clientDir)
+    cap = put(api_root, someData)
+    dataReadBack = get(api_root, cap)
 
     assert someData == dataReadBack
 
 
-def get(argv):
-    return check_output(argv)
+def get_api_root(path):
+    with open(path + u"/node.url") as f:
+        return f.read().strip()
+
+def put(api_root, data):
+    response = requests.put(api_root + u"uri", BytesIO(data))
+    response.raise_for_status()
+    return response.text
+
+def get(api_root, cap):
+    response = requests.get(api_root + u"uri/" + cap, stream=True)
+    response.raise_for_status()
+    return response.raw.read()
 
 
-if __name__ == '__main__':
+if __name__ == u'__main__':
     main()