diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py index 93063d3c5..8fb0aba79 100644 --- a/src/allmydata/interfaces.py +++ b/src/allmydata/interfaces.py @@ -420,12 +420,18 @@ class IStorageBroker(Interface): repeatable way, to distribute load over many peers. """ -class IServer(Interface): +class IDisplayableServer(Interface): + def get_nickname(): + pass + def get_name(): + pass + def get_longname(): + pass + +class IServer(IDisplayableServer): """I live in the client, and represent a single server.""" def start_connecting(tub, trigger_cb): pass - def get_nickname(): - pass def get_rref(): pass diff --git a/src/allmydata/storage_client.py b/src/allmydata/storage_client.py index 6d2a72dd9..d4397d693 100644 --- a/src/allmydata/storage_client.py +++ b/src/allmydata/storage_client.py @@ -32,7 +32,7 @@ the foolscap-based server implemented in src/allmydata/storage/*.py . import re, time from zope.interface import implements from foolscap.api import eventually -from allmydata.interfaces import IStorageBroker, IServer +from allmydata.interfaces import IStorageBroker, IDisplayableServer, IServer from allmydata.util import log, base32 from allmydata.util.assertutil import precondition from allmydata.util.rrefutil import add_version_to_remote_reference @@ -139,6 +139,24 @@ class StorageFarmBroker: return self.servers[serverid].get_nickname() return None + def get_stub_server(self, serverid): + if serverid in self.servers: + return self.servers[serverid] + return StubServer(serverid) + +class StubServer: + implements(IDisplayableServer) + def __init__(self, serverid): + self.serverid = serverid # binary tubid + def get_serverid(self): + return self.serverid + def get_name(self): + return base32.b2a(self.serverid)[:8] + def get_longname(self): + return base32.b2a(self.serverid) + def get_nickname(self): + return "?" + class NativeStorageServer: """I hold information about a storage server that we want to connect to. If we are connected, I hold the RemoteReference, their host address, and