Ticket #12: proxy reconnection
authorClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Wed, 13 Apr 2011 11:50:01 +0000 (13:50 +0200)
committerClaudio-Daniel Freire <claudio-daniel.freire@inria.fr>
Wed, 13 Apr 2011 11:50:01 +0000 (13:50 +0200)
src/nepi/util/proxy.py
src/nepi/util/server.py
test/util/server.py

index a83f2b8..dd2d40b 100644 (file)
@@ -156,13 +156,14 @@ def log_reply(server, reply):
             code_txt, txt))
 
 def launch_ssh_daemon_client(root_dir, python_code, host, port, user, agent):
-    # launch daemon
-    proc = server.popen_ssh_subprocess(python_code, host = host,
-        port = port, user = user, agent = agent)
-    if proc.poll():
-        err = proc.stderr.read()
-        raise RuntimeError("Client could not be executed: %s" % \
-                err)
+    if python_code:
+        # launch daemon
+        proc = server.popen_ssh_subprocess(python_code, host = host,
+            port = port, user = user, agent = agent)
+        if proc.poll():
+            err = proc.stderr.read()
+            raise RuntimeError("Client could not be executed: %s" % \
+                    err)
     # create client
     return server.Client(root_dir, host = host, port = port, user = user, 
             agent = agent)
@@ -620,6 +621,13 @@ class TestbedInstanceProxy(object):
                 s.run()
                 # create client
                 self._client = server.Client(root_dir)
+        else:
+            # attempt to reconnect
+            if host != None:
+                self._client = launch_ssh_daemon_client(root_dir, None,
+                        host, port, user, agent)
+            else:
+                self._client = server.Client(root_dir)
 
     @property
     def guids(self):
@@ -909,7 +917,7 @@ class ExperimentControllerProxy(object):
                 xml = xml.replace("\"", r"\'")
                 xml = xml.replace("\n", r"")
                 python_code = "from nepi.util.proxy import ExperimentControllerServer;\
-                        s = ExperimentControllerServer('%s', %d, '%s');\
+                        s = ExperimentControllerServer(%r, %r, %r);\
                         s.run()" % (root_dir, log_level, xml)
                 self._client = launch_ssh_daemon_client(root_dir, python_code,
                         host, port, user, agent)
@@ -919,6 +927,13 @@ class ExperimentControllerProxy(object):
                 s.run()
                 # create client
                 self._client = server.Client(root_dir)
+        else:
+            # attempt to reconnect
+            if host != None:
+                self._client = launch_ssh_daemon_client(root_dir, None,
+                        host, port, user, agent)
+            else:
+                self._client = server.Client(root_dir)
 
     @property
     def experiment_xml(self):
index e1f68c1..60d2856 100644 (file)
@@ -242,8 +242,8 @@ class Forwarder(object):
 class Client(object):
     def __init__(self, root_dir = ".", host = None, port = None, user = None, 
             agent = None):
-        python_code = "from nepi.util import server;c=server.Forwarder('%s');\
-                c.forward()" % root_dir
+        python_code = "from nepi.util import server;c=server.Forwarder(%r);\
+                c.forward()" % (root_dir,)
         if host != None:
             self._process = popen_ssh_subprocess(python_code, host, port, 
                     user, agent)
index da2694d..a70e449 100755 (executable)
@@ -25,6 +25,28 @@ class ServerTestCase(unittest.TestCase):
         reply = c.read_reply()
         self.assertTrue(reply == "Stopping server")
 
+    def test_server_reconnect(self):
+        s = server.Server(self.root_dir)
+        s.run()
+        c = server.Client(self.root_dir)
+        
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertTrue(reply == "Reply to: Hola")
+        
+        # disconnect
+        del c
+        
+        # reconnect
+        c = server.Client(self.root_dir)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertTrue(reply == "Reply to: Hola")
+                
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertTrue(reply == "Stopping server")
+
     def test_server_long_message(self):
         s = server.Server(self.root_dir)
         s.run()
@@ -54,6 +76,37 @@ class ServerTestCase(unittest.TestCase):
         reply = c.read_reply()
         self.assertTrue(reply == "Stopping server")
 
+    def test_ssh_server_reconnect(self):
+        env = test_util.test_environment()
+        user = getpass.getuser()
+        # launch server
+        python_code = "from nepi.util import server;s=server.Server('%s');\
+                s.run()" % self.root_dir
+        server.popen_ssh_subprocess(python_code, host = "localhost", 
+                port = env.port, user = user, agent = True)
+        
+        c = server.Client(self.root_dir, host = "localhost", port = env.port,
+                user = user, agent = True)
+                
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertTrue(reply == "Reply to: Hola")
+        
+        # disconnect
+        del c
+        
+        # reconnect
+        c = server.Client(self.root_dir, host = "localhost", port = env.port,
+                user = user, agent = True)
+                
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertTrue(reply == "Reply to: Hola")
+        
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertTrue(reply == "Stopping server")
+
     def tearDown(self):
         shutil.rmtree(self.root_dir)