]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/util/rrefutil.py
tests: fix no_network framework to work with upload/download and checker
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / util / rrefutil.py
1 import exceptions
2
3 from foolscap.tokens import Violation
4
5 class ServerFailure(exceptions.Exception):
6     # If the server returns a Failure instead of the normal response to a protocol, then this
7     # exception will be raised, with the Failure that the server returned as its .remote_failure
8     # attribute.
9     def __init__(self, remote_failure):
10         self.remote_failure = remote_failure
11     def __repr__(self):
12         return repr(self.remote_failure)
13     def __str__(self):
14         return str(self.remote_failure)
15
16 def _wrap_server_failure(f):
17     raise ServerFailure(f)
18
19 class WrappedRemoteReference(object):
20     """I intercept any errback from the server and wrap it in a ServerFailure."""
21
22     def __init__(self, original):
23         self.rref = original
24
25     def callRemote(self, *args, **kwargs):
26         d = self.rref.callRemote(*args, **kwargs)
27         d.addErrback(_wrap_server_failure)
28         return d
29
30     def callRemoteOnly(self, *args, **kwargs):
31         return self.rref.callRemoteOnly(*args, **kwargs)
32
33     def notifyOnDisconnect(self, *args, **kwargs):
34         return self.rref.notifyOnDisconnect(*args, **kwargs)
35
36     def dontNotifyOnDisconnect(self, *args, **kwargs):
37         return self.rref.dontNotifyOnDisconnect(*args, **kwargs)
38
39 class VersionedRemoteReference(WrappedRemoteReference):
40     """I wrap a RemoteReference, and add a .version attribute. I also intercept any errback from
41     the server and wrap it in a ServerFailure."""
42
43     def __init__(self, original, version):
44         WrappedRemoteReference.__init__(self, original)
45         self.version = version
46
47 def get_versioned_remote_reference(rref, default):
48     """I return a Deferred that fires with a VersionedRemoteReference"""
49     d = rref.callRemote("get_version")
50     def _no_get_version(f):
51         f.trap(Violation, AttributeError)
52         return default
53     d.addErrback(_no_get_version)
54     def _got_version(version):
55         return VersionedRemoteReference(rref, version)
56     d.addCallback(_got_version)
57     return d
58