add RIClient.get_versions, in the hopes of enabling backwards-compatibility code in the future

This commit is contained in:
Brian Warner
2007-04-26 12:01:25 -07:00
parent 7862dc5747
commit 5ceeaaea6a
3 changed files with 31 additions and 0 deletions

View File

@ -7,6 +7,7 @@ from allmydata import node
from twisted.internet import defer from twisted.internet import defer
import allmydata
from allmydata.Crypto.Util.number import bytes_to_long from allmydata.Crypto.Util.number import bytes_to_long
from allmydata.storageserver import StorageServer from allmydata.storageserver import StorageServer
from allmydata.upload import Uploader from allmydata.upload import Uploader
@ -26,6 +27,9 @@ class Client(node.Node, Referenceable):
INTRODUCER_FURL_FILE = "introducer.furl" INTRODUCER_FURL_FILE = "introducer.furl"
GLOBAL_VDRIVE_FURL_FILE = "vdrive.furl" GLOBAL_VDRIVE_FURL_FILE = "vdrive.furl"
# we're pretty narrow-minded right now
OLDEST_SUPPORTED_VERSION = allmydata.__version__
def __init__(self, basedir="."): def __init__(self, basedir="."):
node.Node.__init__(self, basedir) node.Node.__init__(self, basedir)
self.my_pburl = None self.my_pburl = None
@ -87,6 +91,9 @@ class Client(node.Node, Referenceable):
self.connected_to_vdrive = False self.connected_to_vdrive = False
vdrive_root.notifyOnDisconnect(_disconnected) vdrive_root.notifyOnDisconnect(_disconnected)
def remote_get_versions(self):
return str(allmydata.__version__), str(self.OLDEST_SUPPORTED_VERSION)
def remote_get_service(self, name): def remote_get_service(self, name):
# TODO: 'vdrive' should not be public in the medium term # TODO: 'vdrive' should not be public in the medium term
return self.getServiceNamed(name) return self.getServiceNamed(name)

View File

@ -25,6 +25,19 @@ class RIIntroducer(RemoteInterface):
return None return None
class RIClient(RemoteInterface): class RIClient(RemoteInterface):
def get_versions():
"""Return a tuple of (my_version, oldest_supported) strings.
Each string can be parsed by an allmydata.util.version.Version
instance, and then compared. The first goal is to make sure that
nodes are not confused by speaking to an incompatible peer. The
second goal is to enable the development of backwards-compatibility
code.
This method is likely to change in incompatible ways until we get the
whole compatibility scheme nailed down.
"""
return TupleOf(str, str)
def get_service(name=str): def get_service(name=str):
return Referenceable return Referenceable
def get_nodeid(): def get_nodeid():

View File

@ -2,7 +2,9 @@
import os import os
from twisted.trial import unittest from twisted.trial import unittest
import allmydata
from allmydata import client, introducer from allmydata import client, introducer
from allmydata.util import version
class MyIntroducerClient(introducer.IntroducerClient): class MyIntroducerClient(introducer.IntroducerClient):
def __init__(self): def __init__(self):
@ -39,3 +41,12 @@ class Basic(unittest.TestCase):
c2.introducer_client.connections[k] = None c2.introducer_client.connections[k] = None
self.failUnlessEqual(permute(c2, "one"), ['3','1','0','4','2']) self.failUnlessEqual(permute(c2, "one"), ['3','1','0','4','2'])
def test_versions(self):
basedir = "test_client.Basic.test_versions"
os.mkdir(basedir)
open(os.path.join(basedir, "introducer.furl"), "w").write("")
open(os.path.join(basedir, "vdrive.furl"), "w").write("")
c = client.Client(basedir)
mine, oldest = c.remote_get_versions()
self.failUnlessEqual(version.Version(mine), allmydata.__version__)