From 5ceeaaea6a63d1e4e60c5a37a72a30df80207331 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@allmydata.com>
Date: Thu, 26 Apr 2007 12:01:25 -0700
Subject: [PATCH] add RIClient.get_versions, in the hopes of enabling
 backwards-compatibility code in the future

---
 src/allmydata/client.py           |  7 +++++++
 src/allmydata/interfaces.py       | 13 +++++++++++++
 src/allmydata/test/test_client.py | 11 +++++++++++
 3 files changed, 31 insertions(+)

diff --git a/src/allmydata/client.py b/src/allmydata/client.py
index 6e0f9b60..b22d033e 100644
--- a/src/allmydata/client.py
+++ b/src/allmydata/client.py
@@ -7,6 +7,7 @@ from allmydata import node
 
 from twisted.internet import defer
 
+import allmydata
 from allmydata.Crypto.Util.number import bytes_to_long
 from allmydata.storageserver import StorageServer
 from allmydata.upload import Uploader
@@ -26,6 +27,9 @@ class Client(node.Node, Referenceable):
     INTRODUCER_FURL_FILE = "introducer.furl"
     GLOBAL_VDRIVE_FURL_FILE = "vdrive.furl"
 
+    # we're pretty narrow-minded right now
+    OLDEST_SUPPORTED_VERSION = allmydata.__version__
+
     def __init__(self, basedir="."):
         node.Node.__init__(self, basedir)
         self.my_pburl = None
@@ -87,6 +91,9 @@ class Client(node.Node, Referenceable):
             self.connected_to_vdrive = False
         vdrive_root.notifyOnDisconnect(_disconnected)
 
+    def remote_get_versions(self):
+        return str(allmydata.__version__), str(self.OLDEST_SUPPORTED_VERSION)
+
     def remote_get_service(self, name):
         # TODO: 'vdrive' should not be public in the medium term
         return self.getServiceNamed(name)
diff --git a/src/allmydata/interfaces.py b/src/allmydata/interfaces.py
index abb4ab5c..855e85c9 100644
--- a/src/allmydata/interfaces.py
+++ b/src/allmydata/interfaces.py
@@ -25,6 +25,19 @@ class RIIntroducer(RemoteInterface):
         return None
 
 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):
         return Referenceable
     def get_nodeid():
diff --git a/src/allmydata/test/test_client.py b/src/allmydata/test/test_client.py
index b9bbba24..3366dea6 100644
--- a/src/allmydata/test/test_client.py
+++ b/src/allmydata/test/test_client.py
@@ -2,7 +2,9 @@
 import os
 from twisted.trial import unittest
 
+import allmydata
 from allmydata import client, introducer
+from allmydata.util import version
 
 class MyIntroducerClient(introducer.IntroducerClient):
     def __init__(self):
@@ -39,3 +41,12 @@ class Basic(unittest.TestCase):
             c2.introducer_client.connections[k] = None
         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__)
+
-- 
2.45.2