vdrive: eventually create public/private dirnodes event if the vdrive server isn...
authorBrian Warner <warner@allmydata.com>
Wed, 25 Jul 2007 02:44:25 +0000 (19:44 -0700)
committerBrian Warner <warner@allmydata.com>
Wed, 25 Jul 2007 02:44:25 +0000 (19:44 -0700)
src/allmydata/vdrive.py

index 918660bf849b04e2eaf64875afaf680febe01561..694fb0202e7d338c5ae5f3f43aaf5266489d699e 100644 (file)
@@ -25,47 +25,71 @@ class VirtualDrive(service.MultiService):
         self._global_uri = None
         self._private_uri = None
 
+    def log(self, msg):
+        self.parent.log(msg)
+
     def startService(self):
         service.MultiService.startService(self)
         basedir = self.parent.basedir
-        client = self.parent
         tub = self.parent.tub
 
-        global_vdrive_furl = None
-        furl_file = os.path.join(basedir, self.GLOBAL_VDRIVE_FURL_FILE)
-        if os.path.exists(furl_file):
-            f = open(furl_file, "r")
-            global_vdrive_furl = f.read().strip()
-            f.close()
-
-        global_uri_file = os.path.join(basedir,
-                                       self.GLOBAL_VDRIVE_URI_FILE)
+        global_uri_file = os.path.join(basedir, self.GLOBAL_VDRIVE_URI_FILE)
         if os.path.exists(global_uri_file):
             f = open(global_uri_file)
             self._global_uri = f.read().strip()
             f.close()
-        elif global_vdrive_furl:
-            self.parent.log("fetching global_uri")
-            d = tub.getReference(global_vdrive_furl)
-            d.addCallback(lambda vdrive_server:
-                          vdrive_server.callRemote("get_public_root_uri"))
-            def _got_global_uri(global_uri):
-                self.parent.log("got global_uri")
-                self._global_uri = global_uri
-                f = open(global_uri_file, "w")
-                f.write(self._global_uri + "\n")
-                f.close()
-            d.addCallback(_got_global_uri)
+            self.log("using global vdrive uri %s" % self._global_uri)
 
-        private_uri_file = os.path.join(basedir,
-                                        self.MY_VDRIVE_URI_FILE)
+        private_uri_file = os.path.join(basedir, self.MY_VDRIVE_URI_FILE)
         if os.path.exists(private_uri_file):
             f = open(private_uri_file)
             self._private_uri = f.read().strip()
             f.close()
-        elif global_vdrive_furl:
-            d = dirnode.create_directory(client, global_vdrive_furl)
+            self.log("using private vdrive uri %s" % self._private_uri)
+
+        furl_file = os.path.join(basedir, self.GLOBAL_VDRIVE_FURL_FILE)
+        if os.path.exists(furl_file):
+            f = open(furl_file, "r")
+            global_vdrive_furl = f.read().strip()
+            f.close()
+        else:
+            self.log("no %s, cannot access global or private dirnodes"
+                     % furl_file)
+            return
+
+        tub.connectTo(global_vdrive_furl,
+                      self._got_vdrive_server, global_vdrive_furl)
+
+        if not self._global_uri:
+            self.log("will fetch global_uri when we attach to the "
+                     "vdrive server")
+
+        if not self._private_uri:
+            self.log("will create private_uri when we attach to the "
+                     "vdrive server")
+
+
+    def _got_vdrive_server(self, vdrive_server, global_vdrive_furl):
+        self.log("connected to vdrive server")
+        basedir = self.parent.basedir
+        global_uri_file = os.path.join(basedir, self.GLOBAL_VDRIVE_URI_FILE)
+        private_uri_file = os.path.join(basedir, self.MY_VDRIVE_URI_FILE)
+
+        d = vdrive_server.callRemote("get_public_root_uri")
+        def _got_global_uri(global_uri):
+            self.log("got global_uri: %s" % global_uri)
+            self._global_uri = global_uri
+            f = open(global_uri_file, "w")
+            f.write(self._global_uri + "\n")
+            f.close()
+        d.addCallback(_got_global_uri)
+
+        if not self._private_uri:
+            d.addCallback(lambda res:
+                          dirnode.create_directory(self.parent,
+                                                   global_vdrive_furl))
             def _got_directory(dirnode):
+                self.log("creating private uri")
                 self._private_uri = dirnode.get_uri()
                 f = open(private_uri_file, "w")
                 f.write(self._private_uri + "\n")