From 466124a0e768a46cb652595e49fb2d06a7d32c0c Mon Sep 17 00:00:00 2001 From: Claudio-Daniel Freire Date: Wed, 13 Apr 2011 13:50:01 +0200 Subject: [PATCH] Ticket #12: proxy reconnection --- src/nepi/util/proxy.py | 31 +++++++++++++++++------- src/nepi/util/server.py | 4 ++-- test/util/server.py | 53 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/nepi/util/proxy.py b/src/nepi/util/proxy.py index a83f2b82..dd2d40b0 100644 --- a/src/nepi/util/proxy.py +++ b/src/nepi/util/proxy.py @@ -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): diff --git a/src/nepi/util/server.py b/src/nepi/util/server.py index e1f68c1f..60d28560 100644 --- a/src/nepi/util/server.py +++ b/src/nepi/util/server.py @@ -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) diff --git a/test/util/server.py b/test/util/server.py index da2694d0..a70e4499 100755 --- a/test/util/server.py +++ b/test/util/server.py @@ -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) -- 2.43.0